[PATCH] cleanup patches
Volker Lendecke
Volker.Lendecke at SerNet.DE
Sat Dec 6 02:49:07 MST 2014
On Fri, Dec 05, 2014 at 09:27:39AM -0800, Jeremy Allison wrote:
> On Wed, Dec 03, 2014 at 05:19:45PM +0100, Volker Lendecke wrote:
> > Hi!
> >
> > Attached find a few innocent cleanup patches from my notify
> > branch.
> >
> > I'd appreciate review&push!
>
> Unfortunately due to the vfs_fruit changes
>
> 0004 lib: Split out sys_[read|write] & friends
>
> no longer applies. Can you rebase and resend
> and I'll push, 'cos this looks really good to
> me !
Attached. Rebased on top of ecd0e6e.
Thanks!
Volker
--
SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
phone: +49-551-370000-0, fax: +49-551-370000-9
AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
http://www.sernet.de, mailto:kontakt at sernet.de
-------------- next part --------------
From a1b6c66ca2c46d7b330926f07f1c4548064ae6f1 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Fri, 21 Nov 2014 16:20:10 +0100
Subject: [PATCH 01/10] ctdbd_conn: Accept msgs to all registered srvids
---
source3/lib/ctdbd_conn.c | 43 ++++++++++++++++++++++++++++++++++++++-----
1 file changed, 38 insertions(+), 5 deletions(-)
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index a26f410..5dc007b 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -54,6 +54,7 @@ struct ctdbd_connection {
uint32_t reqid;
uint32_t our_vnn;
uint64_t rand_srvid;
+ uint64_t *srvids;
int fd;
struct tevent_fd *fde;
@@ -109,10 +110,43 @@ static void ctdb_packet_dump(struct ctdb_req_header *hdr)
NTSTATUS register_with_ctdbd(struct ctdbd_connection *conn, uint64_t srvid)
{
+ NTSTATUS status;
int cstatus;
- return ctdbd_control(conn, CTDB_CURRENT_NODE,
- CTDB_CONTROL_REGISTER_SRVID, srvid, 0,
- tdb_null, NULL, NULL, &cstatus);
+ size_t num_srvids;
+ uint64_t *tmp;
+
+ status = ctdbd_control(conn, CTDB_CURRENT_NODE,
+ CTDB_CONTROL_REGISTER_SRVID, srvid, 0,
+ tdb_null, NULL, NULL, &cstatus);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ num_srvids = talloc_array_length(conn->srvids);
+
+ tmp = talloc_realloc(conn, conn->srvids, uint64_t,
+ num_srvids + 1);
+ if (tmp == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ conn->srvids = tmp;
+
+ conn->srvids[num_srvids] = srvid;
+ return NT_STATUS_OK;
+}
+
+static bool ctdb_is_our_srvid(struct ctdbd_connection *conn, uint64_t srvid)
+{
+ size_t i, num_srvids;
+
+ num_srvids = talloc_array_length(conn->srvids);
+
+ for (i=0; i<num_srvids; i++) {
+ if (srvid == conn->srvids[i]) {
+ return true;
+ }
+ }
+ return false;
}
/*
@@ -661,8 +695,7 @@ static NTSTATUS ctdb_handle_message(struct messaging_context *msg_ctx,
return NT_STATUS_OK;
}
- /* only messages to our pid or the broadcast are valid here */
- if (msg->srvid != getpid() && msg->srvid != MSG_SRVID_SAMBA) {
+ if (!ctdb_is_our_srvid(conn, msg->srvid)) {
DEBUG(0,("Got unexpected message with srvid=%llu\n",
(unsigned long long)msg->srvid));
return NT_STATUS_OK;
--
2.1.2
From 3a649628d083e0679dc4857bd3e907a31b28249f Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Fri, 5 Dec 2014 14:38:48 +0100
Subject: [PATCH 02/10] Fix signed/unsigned comparisons
Signed-off-by: Volker Lendecke <vl at samba.org>
---
lib/util/genrand.c | 2 +-
lib/util/util_id.c | 4 ++--
source3/smbd/files.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/util/genrand.c b/lib/util/genrand.c
index 0e5902f..c0163f4 100644
--- a/lib/util/genrand.c
+++ b/lib/util/genrand.c
@@ -526,7 +526,7 @@ _PUBLIC_ char** generate_unique_strs(TALLOC_CTX *mem_ctx, size_t len,
{
const char *c_list = "abcdefghijklmnopqrstuvwxyz0123456789+_-#.,";
const unsigned c_size = 42;
- int i, j;
+ size_t i, j;
unsigned rem;
char ** strs = NULL;
diff --git a/lib/util/util_id.c b/lib/util/util_id.c
index d5a8c66..c5bf911 100644
--- a/lib/util/util_id.c
+++ b/lib/util/util_id.c
@@ -28,7 +28,7 @@
bool add_gid_to_array_unique(TALLOC_CTX *mem_ctx, gid_t gid,
gid_t **gids, uint32_t *num_gids)
{
- int i;
+ uint32_t i;
if ((*num_gids != 0) && (*gids == NULL)) {
/*
@@ -61,7 +61,7 @@ bool add_gid_to_array_unique(TALLOC_CTX *mem_ctx, gid_t gid,
bool add_uid_to_array_unique(TALLOC_CTX *mem_ctx, uid_t uid,
uid_t **uids, uint32_t *num_uids)
{
- int i;
+ uint32_t i;
if ((*num_uids != 0) && (*uids == NULL)) {
/*
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 1ad601a..19896a7 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -727,7 +727,7 @@ NTSTATUS file_name_hash(connection_struct *conn,
{
char tmpbuf[PATH_MAX];
char *fullpath, *to_free;
- size_t len;
+ ssize_t len;
/* Set the hash of the full pathname. */
--
2.1.2
From f9d0f58ded67bf3102a8ffa91dbc36ff55c02100 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 3 Dec 2014 16:02:35 +0100
Subject: [PATCH 03/10] ctdb: ctdb_protocol.h references struct sockaddr
Signed-off-by: Volker Lendecke <vl at samba.org>
---
ctdb/include/ctdb_protocol.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/ctdb/include/ctdb_protocol.h b/ctdb/include/ctdb_protocol.h
index 15d9fc5..3cecc12 100644
--- a/ctdb/include/ctdb_protocol.h
+++ b/ctdb/include/ctdb_protocol.h
@@ -20,6 +20,8 @@
#ifndef _CTDB_PROTOCOL_H
#define _CTDB_PROTOCOL_H
+#include <sys/socket.h>
+
/* location of daemon socket, set at configure time */
#ifdef SOCKPATH
#define CTDB_SOCKET SOCKPATH
--
2.1.2
From 4428dcb6597ac0086ff3c07048763295757b4337 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 19 Nov 2014 13:33:06 +0000
Subject: [PATCH 04/10] lib: Split out sys_[read|write] & friends
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/include/proto.h | 5 --
source3/lib/recvfile.c | 1 +
source3/lib/sys_rw.c | 101 +++++++++++++++++++++++++++
source3/lib/sys_rw.h | 36 ++++++++++
source3/lib/system.c | 90 ------------------------
source3/lib/util.c | 1 +
source3/lib/util_file.c | 1 +
source3/lib/util_sock.c | 1 +
source3/lib/util_transfer_file.c | 1 +
source3/libsmb/unexpected.c | 1 +
source3/modules/vfs_aio_fork.c | 1 +
source3/modules/vfs_aio_linux.c | 1 +
source3/modules/vfs_aio_posix.c | 1 +
source3/modules/vfs_default.c | 1 +
source3/modules/vfs_fruit.c | 1 +
source3/printing/print_cups.c | 1 +
source3/rpc_server/samr/srv_samr_chgpasswd.c | 1 +
source3/smbd/scavenger.c | 1 +
source3/winbindd/winbindd_dual.c | 1 +
source3/wscript_build | 7 +-
20 files changed, 158 insertions(+), 96 deletions(-)
create mode 100644 source3/lib/sys_rw.c
create mode 100644 source3/lib/sys_rw.h
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 82e1032..68a3053 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -242,11 +242,6 @@ int sys_set_nfs_quota(const char *path, const char *bdev,
/* The following definitions come from lib/system.c */
-ssize_t sys_read(int fd, void *buf, size_t count);
-ssize_t sys_write(int fd, const void *buf, size_t count);
-ssize_t sys_writev(int fd, const struct iovec *iov, int iovcnt);
-ssize_t sys_pread(int fd, void *buf, size_t count, off_t off);
-ssize_t sys_pwrite(int fd, const void *buf, size_t count, off_t off);
ssize_t sys_send(int s, const void *msg, size_t len, int flags);
ssize_t sys_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
int sys_fcntl_ptr(int fd, int cmd, void *arg);
diff --git a/source3/lib/recvfile.c b/source3/lib/recvfile.c
index 273c51f..403d5e8 100644
--- a/source3/lib/recvfile.c
+++ b/source3/lib/recvfile.c
@@ -25,6 +25,7 @@
#include "includes.h"
#include "system/filesys.h"
+#include "lib/sys_rw.h"
/* Do this on our own in TRANSFER_BUF_SIZE chunks.
* It's safe to make direct syscalls to lseek/write here
diff --git a/source3/lib/sys_rw.c b/source3/lib/sys_rw.c
new file mode 100644
index 0000000..6d8f149
--- /dev/null
+++ b/source3/lib/sys_rw.c
@@ -0,0 +1,101 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Samba system utilities
+ * Copyright (C) Andrew Tridgell 1992-1998
+ * Copyright (C) Jeremy Allison 1998-2005
+ * Copyright (C) Timur Bakeyev 2005
+ * Copyright (C) Bjoern Jacke 2006-2007
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "replace.h"
+#include "system/filesys.h"
+#include "lib/sys_rw.h"
+
+/*******************************************************************
+A read wrapper that will deal with EINTR/EWOULDBLOCK
+********************************************************************/
+
+ssize_t sys_read(int fd, void *buf, size_t count)
+{
+ ssize_t ret;
+
+ do {
+ ret = read(fd, buf, count);
+ } while (ret == -1 && (errno == EINTR || errno == EAGAIN ||
+ errno == EWOULDBLOCK));
+
+ return ret;
+}
+
+/*******************************************************************
+A write wrapper that will deal with EINTR/EWOULDBLOCK.
+********************************************************************/
+
+ssize_t sys_write(int fd, const void *buf, size_t count)
+{
+ ssize_t ret;
+
+ do {
+ ret = write(fd, buf, count);
+ } while (ret == -1 && (errno == EINTR || errno == EAGAIN ||
+ errno == EWOULDBLOCK));
+
+ return ret;
+}
+
+/*******************************************************************
+A writev wrapper that will deal with EINTR.
+********************************************************************/
+
+ssize_t sys_writev(int fd, const struct iovec *iov, int iovcnt)
+{
+ ssize_t ret;
+
+ do {
+ ret = writev(fd, iov, iovcnt);
+ } while (ret == -1 && (errno == EINTR || errno == EAGAIN ||
+ errno == EWOULDBLOCK));
+
+ return ret;
+}
+
+/*******************************************************************
+A pread wrapper that will deal with EINTR
+********************************************************************/
+
+ssize_t sys_pread(int fd, void *buf, size_t count, off_t off)
+{
+ ssize_t ret;
+
+ do {
+ ret = pread(fd, buf, count, off);
+ } while (ret == -1 && errno == EINTR);
+ return ret;
+}
+
+/*******************************************************************
+A write wrapper that will deal with EINTR
+********************************************************************/
+
+ssize_t sys_pwrite(int fd, const void *buf, size_t count, off_t off)
+{
+ ssize_t ret;
+
+ do {
+ ret = pwrite(fd, buf, count, off);
+ } while (ret == -1 && errno == EINTR);
+ return ret;
+}
diff --git a/source3/lib/sys_rw.h b/source3/lib/sys_rw.h
new file mode 100644
index 0000000..ee1584e
--- /dev/null
+++ b/source3/lib/sys_rw.h
@@ -0,0 +1,36 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Samba system utilities
+ * Copyright (C) Andrew Tridgell 1992-1998
+ * Copyright (C) Jeremy Allison 1998-2005
+ * Copyright (C) Timur Bakeyev 2005
+ * Copyright (C) Bjoern Jacke 2006-2007
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __LIB_SYS_RW_H__
+#define __LIB_SYS_RW_H__
+
+#include <unistd.h>
+
+struct iovec;
+
+ssize_t sys_read(int fd, void *buf, size_t count);
+ssize_t sys_write(int fd, const void *buf, size_t count);
+ssize_t sys_writev(int fd, const struct iovec *iov, int iovcnt);
+ssize_t sys_pread(int fd, void *buf, size_t count, off_t off);
+ssize_t sys_pwrite(int fd, const void *buf, size_t count, off_t off);
+
+#endif
diff --git a/source3/lib/system.c b/source3/lib/system.c
index 6478e6f..7531d77 100644
--- a/source3/lib/system.c
+++ b/source3/lib/system.c
@@ -50,96 +50,6 @@
expansions/etc make sense to the OS should be acceptable to Samba.
*/
-
-
-/*******************************************************************
-A read wrapper that will deal with EINTR.
-********************************************************************/
-
-ssize_t sys_read(int fd, void *buf, size_t count)
-{
- ssize_t ret;
-
- do {
- ret = read(fd, buf, count);
- } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK));
-
- return ret;
-}
-
-/*******************************************************************
-A write wrapper that will deal with EINTR.
-********************************************************************/
-
-ssize_t sys_write(int fd, const void *buf, size_t count)
-{
- ssize_t ret;
-
- do {
- ret = write(fd, buf, count);
- } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK));
-
- return ret;
-}
-
-/*******************************************************************
-A writev wrapper that will deal with EINTR.
-********************************************************************/
-
-ssize_t sys_writev(int fd, const struct iovec *iov, int iovcnt)
-{
- ssize_t ret;
-
-#if 0
- /* Try to confuse write_data_iov a bit */
- if ((random() % 5) == 0) {
- return sys_write(fd, iov[0].iov_base, iov[0].iov_len);
- }
- if (iov[0].iov_len > 1) {
- return sys_write(fd, iov[0].iov_base,
- (random() % (iov[0].iov_len-1)) + 1);
- }
-#endif
-
- do {
- ret = writev(fd, iov, iovcnt);
- } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK));
-
- return ret;
-}
-
-/*******************************************************************
-A pread wrapper that will deal with EINTR
-********************************************************************/
-
-#if defined(HAVE_PREAD)
-ssize_t sys_pread(int fd, void *buf, size_t count, off_t off)
-{
- ssize_t ret;
-
- do {
- ret = pread(fd, buf, count, off);
- } while (ret == -1 && errno == EINTR);
- return ret;
-}
-#endif
-
-/*******************************************************************
-A write wrapper that will deal with EINTR
-********************************************************************/
-
-#if defined(HAVE_PWRITE)
-ssize_t sys_pwrite(int fd, const void *buf, size_t count, off_t off)
-{
- ssize_t ret;
-
- do {
- ret = pwrite(fd, buf, count, off);
- } while (ret == -1 && errno == EINTR);
- return ret;
-}
-#endif
-
/*******************************************************************
A send wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK.
********************************************************************/
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 7b2afa8..49eef50 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -31,6 +31,7 @@
#include <ccan/hash/hash.h>
#include "libcli/security/security.h"
#include "serverid.h"
+#include "lib/sys_rw.h"
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
diff --git a/source3/lib/util_file.c b/source3/lib/util_file.c
index 8319f04..27a078f 100644
--- a/source3/lib/util_file.c
+++ b/source3/lib/util_file.c
@@ -18,6 +18,7 @@
*/
#include "includes.h"
+#include "lib/sys_rw.h"
/**
Load from a pipe into memory.
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index d865ffb..2bed9a9 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -28,6 +28,7 @@
#include "../lib/util/tevent_unix.h"
#include "../lib/util/tevent_ntstatus.h"
#include "../lib/tsocket/tsocket.h"
+#include "lib/sys_rw.h"
const char *client_addr(int fd, char *addr, size_t addrlen)
{
diff --git a/source3/lib/util_transfer_file.c b/source3/lib/util_transfer_file.c
index 00a2c9d..d415d7f 100644
--- a/source3/lib/util_transfer_file.c
+++ b/source3/lib/util_transfer_file.c
@@ -22,6 +22,7 @@
#include <includes.h>
#include "transfer_file.h"
+#include "lib/sys_rw.h"
/****************************************************************************
Transfer some data between two fd's.
diff --git a/source3/libsmb/unexpected.c b/source3/libsmb/unexpected.c
index 2c01bb7..ee1c360 100644
--- a/source3/libsmb/unexpected.c
+++ b/source3/libsmb/unexpected.c
@@ -22,6 +22,7 @@
#include "../lib/util/tevent_ntstatus.h"
#include "lib/async_req/async_sock.h"
#include "libsmb/nmblib.h"
+#include "lib/sys_rw.h"
static const char *nmbd_socket_dir(void)
{
diff --git a/source3/modules/vfs_aio_fork.c b/source3/modules/vfs_aio_fork.c
index 12e6f80..c2148a1 100644
--- a/source3/modules/vfs_aio_fork.c
+++ b/source3/modules/vfs_aio_fork.c
@@ -26,6 +26,7 @@
#include "smbd/globals.h"
#include "lib/async_req/async_sock.h"
#include "lib/util/tevent_unix.h"
+#include "lib/sys_rw.h"
#if !defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) && !defined(HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS)
# error Can not pass file descriptors
diff --git a/source3/modules/vfs_aio_linux.c b/source3/modules/vfs_aio_linux.c
index 6188975..6c97592 100644
--- a/source3/modules/vfs_aio_linux.c
+++ b/source3/modules/vfs_aio_linux.c
@@ -24,6 +24,7 @@
#include "smbd/smbd.h"
#include "smbd/globals.h"
#include "lib/util/tevent_unix.h"
+#include "lib/sys_rw.h"
#include <sys/eventfd.h>
#include <libaio.h>
diff --git a/source3/modules/vfs_aio_posix.c b/source3/modules/vfs_aio_posix.c
index 3629541..ef5f706 100644
--- a/source3/modules/vfs_aio_posix.c
+++ b/source3/modules/vfs_aio_posix.c
@@ -24,6 +24,7 @@
#include "smbd/smbd.h"
#include "smbd/globals.h"
#include "lib/util/tevent_unix.h"
+#include "lib/sys_rw.h"
#include <aio.h>
/* The signal we'll use to signify aio done. */
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 613101a..1e1c318 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -32,6 +32,7 @@
#include "lib/util/tevent_unix.h"
#include "lib/asys/asys.h"
#include "lib/util/tevent_ntstatus.h"
+#include "lib/sys_rw.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_VFS
diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c
index ebafe3a..18a6823 100644
--- a/source3/modules/vfs_fruit.c
+++ b/source3/modules/vfs_fruit.c
@@ -29,6 +29,7 @@
#include "messages.h"
#include "libcli/security/security.h"
#include "../libcli/smb/smb2_create_ctx.h"
+#include "lib/sys_rw.h"
/*
* Enhanced OS X and Netatalk compatibility
diff --git a/source3/printing/print_cups.c b/source3/printing/print_cups.c
index 0ec71ab..68f367c 100644
--- a/source3/printing/print_cups.c
+++ b/source3/printing/print_cups.c
@@ -26,6 +26,7 @@
#include "printing.h"
#include "printing/pcap.h"
#include "librpc/gen_ndr/ndr_printcap.h"
+#include "lib/sys_rw.h"
#ifdef HAVE_CUPS
#include <cups/cups.h>
diff --git a/source3/rpc_server/samr/srv_samr_chgpasswd.c b/source3/rpc_server/samr/srv_samr_chgpasswd.c
index 684ccee..e899306 100644
--- a/source3/rpc_server/samr/srv_samr_chgpasswd.c
+++ b/source3/rpc_server/samr/srv_samr_chgpasswd.c
@@ -54,6 +54,7 @@
#include "rpc_server/samr/srv_samr_util.h"
#include "passdb.h"
#include "auth.h"
+#include "lib/sys_rw.h"
#ifndef ALLOW_CHANGE_PASSWORD
#if (defined(HAVE_TERMIOS_H) && defined(HAVE_DUP2) && defined(HAVE_SETSID))
diff --git a/source3/smbd/scavenger.c b/source3/smbd/scavenger.c
index 122305e..013b4d2 100644
--- a/source3/smbd/scavenger.c
+++ b/source3/smbd/scavenger.c
@@ -26,6 +26,7 @@
#include "smbd/scavenger.h"
#include "locking/proto.h"
#include "lib/util/util_process.h"
+#include "lib/sys_rw.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_SCAVENGER
diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c
index f71d111..b9c110f 100644
--- a/source3/winbindd/winbindd_dual.c
+++ b/source3/winbindd/winbindd_dual.c
@@ -38,6 +38,7 @@
#include "messages.h"
#include "../lib/util/tevent_unix.h"
#include "lib/param/loadparm.h"
+#include "lib/sys_rw.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_WINBIND
diff --git a/source3/wscript_build b/source3/wscript_build
index 469424d..787c4e2 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -253,6 +253,11 @@ bld.SAMBA3_SUBSYSTEM('KRBCLIENT',
source='libads/kerberos.c libads/ads_status.c',
public_deps='krb5samba k5crypto gssapi LIBTSOCKET CLDAP LIBNMB')
+bld.SAMBA3_LIBRARY('sys_rw',
+ source='lib/sys_rw.c',
+ deps='replace',
+ private_library=True)
+
bld.SAMBA3_SUBSYSTEM('samba3util',
source='''lib/system.c
lib/sendfile.c
@@ -264,7 +269,7 @@ bld.SAMBA3_SUBSYSTEM('samba3util',
lib/util_sock.c
lib/util_transfer_file.c
lib/sock_exec.c''',
- deps='ndr samba-security NDR_SECURITY samba-util util_tdb ccan-hash')
+ deps='ndr samba-security NDR_SECURITY samba-util util_tdb ccan-hash sys_rw')
if bld.CONFIG_GET("CTDB_CFLAGS") and bld.CONFIG_GET("CTDB_INCLUDE"):
SAMBA_CLUSTER_SUPPORT_SOURCES='''
--
2.1.2
From 1627a532d2371ff4dac738a4ef0b16c9d3dae5db Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 19 Nov 2014 14:06:49 +0000
Subject: [PATCH 05/10] lib: read_data->read_data_ntstatus
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/include/proto.h | 2 +-
source3/lib/ctdbd_conn.c | 6 +++---
source3/lib/util_sock.c | 2 +-
source3/nmbd/asyncdns.c | 4 ++--
source3/smbd/notify_inotify.c | 2 +-
source3/smbd/reply.c | 3 ++-
source3/winbindd/winbindd_dual.c | 5 +++--
7 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 68a3053..dcecf74 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -565,7 +565,7 @@ NTSTATUS read_fd_with_timeout(int fd, char *buf,
size_t mincnt, size_t maxcnt,
unsigned int time_out,
size_t *size_ret);
-NTSTATUS read_data(int fd, char *buffer, size_t N);
+NTSTATUS read_data_ntstatus(int fd, char *buffer, size_t N);
ssize_t write_data(int fd, const char *buffer, size_t N);
ssize_t iov_buflen(const struct iovec *iov, int iovlen);
uint8_t *iov_buf(TALLOC_CTX *mem_ctx, const struct iovec *iov, int iovcnt);
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index 5dc007b..7bdb376 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -379,7 +379,7 @@ static NTSTATUS ctdb_read_packet(int fd, TALLOC_CTX *mem_ctx,
}
}
- status = read_data(fd, (char *)&msglen, sizeof(msglen));
+ status = read_data_ntstatus(fd, (char *)&msglen, sizeof(msglen));
if (!NT_STATUS_IS_OK(status)) {
return status;
}
@@ -396,8 +396,8 @@ static NTSTATUS ctdb_read_packet(int fd, TALLOC_CTX *mem_ctx,
req->length = msglen;
- status = read_data(fd, ((char *)req) + sizeof(msglen),
- msglen - sizeof(msglen));
+ status = read_data_ntstatus(fd, ((char *)req) + sizeof(msglen),
+ msglen - sizeof(msglen));
if (!NT_STATUS_IS_OK(status)) {
return status;
}
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index 2bed9a9..d93e22d 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -197,7 +197,7 @@ NTSTATUS read_fd_with_timeout(int fd, char *buf,
on socket calls.
****************************************************************************/
-NTSTATUS read_data(int fd, char *buffer, size_t N)
+NTSTATUS read_data_ntstatus(int fd, char *buffer, size_t N)
{
return read_fd_with_timeout(fd, buffer, N, N, 0, NULL);
}
diff --git a/source3/nmbd/asyncdns.c b/source3/nmbd/asyncdns.c
index 90340ef..4468c7b 100644
--- a/source3/nmbd/asyncdns.c
+++ b/source3/nmbd/asyncdns.c
@@ -90,7 +90,7 @@ static void asyncdns_process(void)
while (1) {
NTSTATUS status;
- status = read_data(fd_in, (char *)&r, sizeof(r));
+ status = read_data_ntstatus(fd_in, (char *)&r, sizeof(r));
if (!NT_STATUS_IS_OK(status)) {
break;
@@ -219,7 +219,7 @@ void run_dns_queue(struct messaging_context *msg)
start_async_dns(msg);
}
- status = read_data(fd_in, (char *)&r, sizeof(r));
+ status = read_data_ntstatus(fd_in, (char *)&r, sizeof(r));
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("read from child failed: %s\n", nt_errstr(status)));
diff --git a/source3/smbd/notify_inotify.c b/source3/smbd/notify_inotify.c
index 1fcd8ec..a9b7131 100644
--- a/source3/smbd/notify_inotify.c
+++ b/source3/smbd/notify_inotify.c
@@ -219,7 +219,7 @@ static void inotify_handler(struct tevent_context *ev, struct tevent_fd *fde,
if (e == NULL) return;
((uint8_t *)e)[bufsize] = '\0';
- status = read_data(in->fd, (char *)e0, bufsize);
+ status = read_data_ntstatus(in->fd, (char *)e0, bufsize);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("Failed to read all inotify data - %s\n",
nt_errstr(status)));
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index fd4ec53..cd13d68 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -4366,7 +4366,8 @@ void reply_writebraw(struct smb_request *req)
(int)tcount,(int)nwritten,(int)numtowrite));
}
- status = read_data(xconn->transport.sock, buf+4, numtowrite);
+ status = read_data_ntstatus(xconn->transport.sock, buf+4,
+ numtowrite);
if (!NT_STATUS_IS_OK(status)) {
/* Try and give an error message
diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c
index b9c110f..43a27b3 100644
--- a/source3/winbindd/winbindd_dual.c
+++ b/source3/winbindd/winbindd_dual.c
@@ -53,7 +53,7 @@ static NTSTATUS child_read_request(int sock, struct winbindd_request *wreq)
{
NTSTATUS status;
- status = read_data(sock, (char *)wreq, sizeof(*wreq));
+ status = read_data_ntstatus(sock, (char *)wreq, sizeof(*wreq));
if (!NT_STATUS_IS_OK(status)) {
DEBUG(3, ("child_read_request: read_data failed: %s\n",
nt_errstr(status)));
@@ -76,7 +76,8 @@ static NTSTATUS child_read_request(int sock, struct winbindd_request *wreq)
/* Ensure null termination */
wreq->extra_data.data[wreq->extra_len] = '\0';
- status = read_data(sock, wreq->extra_data.data, wreq->extra_len);
+ status = read_data_ntstatus(sock, wreq->extra_data.data,
+ wreq->extra_len);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("Could not read extra data: %s\n",
nt_errstr(status)));
--
2.1.2
From b36e9a2a739898da65d8bc2f007dfc53927abc25 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 19 Nov 2014 14:21:17 +0000
Subject: [PATCH 06/10] lib: Split out iov_buf[len]
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/include/proto.h | 3 +-
source3/lib/iov_buf.c | 65 ++++++++++++++++++++++++++++++++++++++++++++
source3/lib/iov_buf.h | 29 ++++++++++++++++++++
source3/lib/messages.c | 1 +
source3/lib/messages_ctdbd.c | 1 +
source3/lib/util_sock.c | 44 +-----------------------------
source3/wscript_build | 7 ++++-
7 files changed, 104 insertions(+), 46 deletions(-)
create mode 100644 source3/lib/iov_buf.c
create mode 100644 source3/lib/iov_buf.h
diff --git a/source3/include/proto.h b/source3/include/proto.h
index dcecf74..d9815f4 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -566,9 +566,8 @@ NTSTATUS read_fd_with_timeout(int fd, char *buf,
unsigned int time_out,
size_t *size_ret);
NTSTATUS read_data_ntstatus(int fd, char *buffer, size_t N);
+
ssize_t write_data(int fd, const char *buffer, size_t N);
-ssize_t iov_buflen(const struct iovec *iov, int iovlen);
-uint8_t *iov_buf(TALLOC_CTX *mem_ctx, const struct iovec *iov, int iovcnt);
ssize_t write_data_iov(int fd, const struct iovec *orig_iov, int iovcnt);
bool send_keepalive(int client);
NTSTATUS read_smb_length_return_keepalive(int fd, char *inbuf,
diff --git a/source3/lib/iov_buf.c b/source3/lib/iov_buf.c
new file mode 100644
index 0000000..dd99da3
--- /dev/null
+++ b/source3/lib/iov_buf.c
@@ -0,0 +1,65 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Samba system utilities
+ * Copyright (C) Volker Lendecke 2014
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "replace.h"
+#include "system/filesys.h"
+#include "iov_buf.h"
+
+ssize_t iov_buflen(const struct iovec *iov, int iovcnt)
+{
+ size_t buflen = 0;
+ int i;
+
+ for (i=0; i<iovcnt; i++) {
+ size_t thislen = iov[i].iov_len;
+ size_t tmp = buflen + thislen;
+
+ if ((tmp < buflen) || (tmp < thislen)) {
+ /* overflow */
+ return -1;
+ }
+ buflen = tmp;
+ }
+ return buflen;
+}
+
+uint8_t *iov_buf(TALLOC_CTX *mem_ctx, const struct iovec *iov, int iovcnt)
+{
+ int i;
+ ssize_t buflen;
+ uint8_t *buf, *p;
+
+ buflen = iov_buflen(iov, iovcnt);
+ if (buflen == -1) {
+ return NULL;
+ }
+ buf = talloc_array(mem_ctx, uint8_t, buflen);
+ if (buf == NULL) {
+ return NULL;
+ }
+
+ p = buf;
+ for (i=0; i<iovcnt; i++) {
+ size_t len = iov[i].iov_len;
+
+ memcpy(p, iov[i].iov_base, len);
+ p += len;
+ }
+ return buf;
+}
diff --git a/source3/lib/iov_buf.h b/source3/lib/iov_buf.h
new file mode 100644
index 0000000..a884bdb
--- /dev/null
+++ b/source3/lib/iov_buf.h
@@ -0,0 +1,29 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Samba system utilities
+ * Copyright (C) Volker Lendecke 2014
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __LIB_IOV_BUF_H__
+#define __LIB_IOV_BUF_H__
+
+#include <unistd.h>
+#include <talloc.h>
+
+ssize_t iov_buflen(const struct iovec *iov, int iovlen);
+uint8_t *iov_buf(TALLOC_CTX *mem_ctx, const struct iovec *iov, int iovcnt);
+
+#endif
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index d4c580f..5b4daa2 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -52,6 +52,7 @@
#include "lib/util/tevent_unix.h"
#include "lib/background.h"
#include "lib/messages_dgm.h"
+#include "lib/iov_buf.h"
struct messaging_callback {
struct messaging_callback *prev, *next;
diff --git a/source3/lib/messages_ctdbd.c b/source3/lib/messages_ctdbd.c
index eb7e929..59f5976 100644
--- a/source3/lib/messages_ctdbd.c
+++ b/source3/lib/messages_ctdbd.c
@@ -20,6 +20,7 @@
#include "includes.h"
#include "messages.h"
#include "util_tdb.h"
+#include "lib/iov_buf.h"
/*
* It is not possible to include ctdb.h and tdb_compat.h (included via
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index d93e22d..163045a 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -29,6 +29,7 @@
#include "../lib/util/tevent_ntstatus.h"
#include "../lib/tsocket/tsocket.h"
#include "lib/sys_rw.h"
+#include "lib/iov_buf.h"
const char *client_addr(int fd, char *addr, size_t addrlen)
{
@@ -202,49 +203,6 @@ NTSTATUS read_data_ntstatus(int fd, char *buffer, size_t N)
return read_fd_with_timeout(fd, buffer, N, N, 0, NULL);
}
-ssize_t iov_buflen(const struct iovec *iov, int iovcnt)
-{
- size_t buflen = 0;
- int i;
-
- for (i=0; i<iovcnt; i++) {
- size_t thislen = iov[i].iov_len;
- size_t tmp = buflen + thislen;
-
- if ((tmp < buflen) || (tmp < thislen)) {
- /* overflow */
- return -1;
- }
- buflen = tmp;
- }
- return buflen;
-}
-
-uint8_t *iov_buf(TALLOC_CTX *mem_ctx, const struct iovec *iov, int iovcnt)
-{
- int i;
- ssize_t buflen;
- uint8_t *buf, *p;
-
- buflen = iov_buflen(iov, iovcnt);
- if (buflen == -1) {
- return NULL;
- }
- buf = talloc_array(mem_ctx, uint8_t, buflen);
- if (buf == NULL) {
- return NULL;
- }
-
- p = buf;
- for (i=0; i<iovcnt; i++) {
- size_t len = iov[i].iov_len;
-
- memcpy(p, iov[i].iov_base, len);
- p += len;
- }
- return buf;
-}
-
/****************************************************************************
Write all data from an iov array
NB. This can be called with a non-socket fd, don't add dependencies
diff --git a/source3/wscript_build b/source3/wscript_build
index 787c4e2..591b1be 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -258,6 +258,11 @@ bld.SAMBA3_LIBRARY('sys_rw',
deps='replace',
private_library=True)
+bld.SAMBA3_LIBRARY('iov_buf',
+ source='lib/iov_buf.c',
+ deps='replace talloc',
+ private_library=True)
+
bld.SAMBA3_SUBSYSTEM('samba3util',
source='''lib/system.c
lib/sendfile.c
@@ -269,7 +274,7 @@ bld.SAMBA3_SUBSYSTEM('samba3util',
lib/util_sock.c
lib/util_transfer_file.c
lib/sock_exec.c''',
- deps='ndr samba-security NDR_SECURITY samba-util util_tdb ccan-hash sys_rw')
+ deps='ndr samba-security NDR_SECURITY samba-util util_tdb ccan-hash sys_rw iov_buf')
if bld.CONFIG_GET("CTDB_CFLAGS") and bld.CONFIG_GET("CTDB_INCLUDE"):
SAMBA_CLUSTER_SUPPORT_SOURCES='''
--
2.1.2
From f5f21d0e5ad9489ab98f1045d628e7c00f43075f Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 19 Nov 2014 14:25:56 +0000
Subject: [PATCH 07/10] lib: Split out write_data[_iov]
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/include/proto.h | 2 -
source3/lib/ctdbd_conn.c | 1 +
source3/lib/sys_rw_data.c | 107 +++++++++++++++++++++++++++++
source3/lib/sys_rw_data.h | 33 +++++++++
source3/lib/util.c | 1 +
source3/lib/util_sock.c | 82 +---------------------
source3/modules/vfs_aio_fork.c | 1 +
source3/modules/vfs_preopen.c | 1 +
source3/modules/vfs_smb_traffic_analyzer.c | 1 +
source3/nmbd/asyncdns.c | 1 +
source3/printing/printing.c | 1 +
source3/smbd/process.c | 1 +
source3/smbd/reply.c | 1 +
source3/smbd/smb2_read.c | 1 +
source3/torture/torture.c | 1 +
source3/utils/smbfilter.c | 1 +
source3/winbindd/winbindd_dual.c | 1 +
source3/wscript_build | 4 +-
18 files changed, 156 insertions(+), 85 deletions(-)
create mode 100644 source3/lib/sys_rw_data.c
create mode 100644 source3/lib/sys_rw_data.h
diff --git a/source3/include/proto.h b/source3/include/proto.h
index d9815f4..82b2fb5 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -567,8 +567,6 @@ NTSTATUS read_fd_with_timeout(int fd, char *buf,
size_t *size_ret);
NTSTATUS read_data_ntstatus(int fd, char *buffer, size_t N);
-ssize_t write_data(int fd, const char *buffer, size_t N);
-ssize_t write_data_iov(int fd, const struct iovec *orig_iov, int iovcnt);
bool send_keepalive(int client);
NTSTATUS read_smb_length_return_keepalive(int fd, char *inbuf,
unsigned int timeout,
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index 7bdb376..c41ec53 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -23,6 +23,7 @@
#include "serverid.h"
#include "ctdbd_conn.h"
#include "system/select.h"
+#include "lib/sys_rw_data.h"
#include "messages.h"
diff --git a/source3/lib/sys_rw_data.c b/source3/lib/sys_rw_data.c
new file mode 100644
index 0000000..f7bedb3
--- /dev/null
+++ b/source3/lib/sys_rw_data.c
@@ -0,0 +1,107 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Samba system utilities
+ * Copyright (C) Andrew Tridgell 1992-1998
+ * Copyright (C) Jeremy Allison 1998-2005
+ * Copyright (C) Timur Bakeyev 2005
+ * Copyright (C) Bjoern Jacke 2006-2007
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "replace.h"
+#include "system/filesys.h"
+#include "lib/sys_rw_data.h"
+#include "lib/sys_rw.h"
+#include "lib/iov_buf.h"
+
+/****************************************************************************
+ Write all data from an iov array
+ NB. This can be called with a non-socket fd, don't add dependencies
+ on socket calls.
+****************************************************************************/
+
+ssize_t write_data_iov(int fd, const struct iovec *orig_iov, int iovcnt)
+{
+ ssize_t to_send;
+ ssize_t thistime;
+ size_t sent;
+ struct iovec iov_copy[iovcnt];
+ struct iovec *iov;
+
+ to_send = iov_buflen(orig_iov, iovcnt);
+ if (to_send == -1) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ thistime = sys_writev(fd, orig_iov, iovcnt);
+ if ((thistime <= 0) || (thistime == to_send)) {
+ return thistime;
+ }
+ sent = thistime;
+
+ /*
+ * We could not send everything in one call. Make a copy of iov that
+ * we can mess with. We keep a copy of the array start in iov_copy for
+ * the TALLOC_FREE, because we're going to modify iov later on,
+ * discarding elements.
+ */
+
+ memcpy(iov_copy, orig_iov, sizeof(struct iovec) * iovcnt);
+ iov = iov_copy;
+
+ while (sent < to_send) {
+ /*
+ * We have to discard "thistime" bytes from the beginning
+ * iov array, "thistime" contains the number of bytes sent
+ * via writev last.
+ */
+ while (thistime > 0) {
+ if (thistime < iov[0].iov_len) {
+ char *new_base =
+ (char *)iov[0].iov_base + thistime;
+ iov[0].iov_base = (void *)new_base;
+ iov[0].iov_len -= thistime;
+ break;
+ }
+ thistime -= iov[0].iov_len;
+ iov += 1;
+ iovcnt -= 1;
+ }
+
+ thistime = sys_writev(fd, iov, iovcnt);
+ if (thistime <= 0) {
+ break;
+ }
+ sent += thistime;
+ }
+
+ return sent;
+}
+
+/****************************************************************************
+ Write data to a fd.
+ NB. This can be called with a non-socket fd, don't add dependencies
+ on socket calls.
+****************************************************************************/
+
+ssize_t write_data(int fd, const char *buffer, size_t n)
+{
+ struct iovec iov;
+
+ iov.iov_base = discard_const_p(void, buffer);
+ iov.iov_len = n;
+ return write_data_iov(fd, &iov, 1);
+}
diff --git a/source3/lib/sys_rw_data.h b/source3/lib/sys_rw_data.h
new file mode 100644
index 0000000..fc97573
--- /dev/null
+++ b/source3/lib/sys_rw_data.h
@@ -0,0 +1,33 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Samba system utilities
+ * Copyright (C) Andrew Tridgell 1992-1998
+ * Copyright (C) Jeremy Allison 1998-2005
+ * Copyright (C) Timur Bakeyev 2005
+ * Copyright (C) Bjoern Jacke 2006-2007
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __LIB_SYS_RW_DATA_H__
+#define __LIB_SYS_RW_DATA_H__
+
+#include <unistd.h>
+
+struct iovec;
+
+ssize_t write_data_iov(int fd, const struct iovec *iov, int iovcnt);
+ssize_t write_data(int fd, const char *buffer, size_t n);
+
+#endif
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 49eef50..b64b32b 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -32,6 +32,7 @@
#include "libcli/security/security.h"
#include "serverid.h"
#include "lib/sys_rw.h"
+#include "lib/sys_rw_data.h"
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index 163045a..682d964 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -29,7 +29,7 @@
#include "../lib/util/tevent_ntstatus.h"
#include "../lib/tsocket/tsocket.h"
#include "lib/sys_rw.h"
-#include "lib/iov_buf.h"
+#include "lib/sys_rw_data.h"
const char *client_addr(int fd, char *addr, size_t addrlen)
{
@@ -204,86 +204,6 @@ NTSTATUS read_data_ntstatus(int fd, char *buffer, size_t N)
}
/****************************************************************************
- Write all data from an iov array
- NB. This can be called with a non-socket fd, don't add dependencies
- on socket calls.
-****************************************************************************/
-
-ssize_t write_data_iov(int fd, const struct iovec *orig_iov, int iovcnt)
-{
- ssize_t to_send;
- ssize_t thistime;
- size_t sent;
- struct iovec iov_copy[iovcnt];
- struct iovec *iov;
-
- to_send = iov_buflen(orig_iov, iovcnt);
- if (to_send == -1) {
- errno = EINVAL;
- return -1;
- }
-
- thistime = sys_writev(fd, orig_iov, iovcnt);
- if ((thistime <= 0) || (thistime == to_send)) {
- return thistime;
- }
- sent = thistime;
-
- /*
- * We could not send everything in one call. Make a copy of iov that
- * we can mess with. We keep a copy of the array start in iov_copy for
- * the TALLOC_FREE, because we're going to modify iov later on,
- * discarding elements.
- */
-
- memcpy(iov_copy, orig_iov, sizeof(struct iovec) * iovcnt);
- iov = iov_copy;
-
- while (sent < to_send) {
- /*
- * We have to discard "thistime" bytes from the beginning
- * iov array, "thistime" contains the number of bytes sent
- * via writev last.
- */
- while (thistime > 0) {
- if (thistime < iov[0].iov_len) {
- char *new_base =
- (char *)iov[0].iov_base + thistime;
- iov[0].iov_base = (void *)new_base;
- iov[0].iov_len -= thistime;
- break;
- }
- thistime -= iov[0].iov_len;
- iov += 1;
- iovcnt -= 1;
- }
-
- thistime = sys_writev(fd, iov, iovcnt);
- if (thistime <= 0) {
- break;
- }
- sent += thistime;
- }
-
- return sent;
-}
-
-/****************************************************************************
- Write data to a fd.
- NB. This can be called with a non-socket fd, don't add dependencies
- on socket calls.
-****************************************************************************/
-
-ssize_t write_data(int fd, const char *buffer, size_t N)
-{
- struct iovec iov;
-
- iov.iov_base = discard_const_p(void, buffer);
- iov.iov_len = N;
- return write_data_iov(fd, &iov, 1);
-}
-
-/****************************************************************************
Send a keepalive packet (rfc1002).
****************************************************************************/
diff --git a/source3/modules/vfs_aio_fork.c b/source3/modules/vfs_aio_fork.c
index c2148a1..39334bc 100644
--- a/source3/modules/vfs_aio_fork.c
+++ b/source3/modules/vfs_aio_fork.c
@@ -27,6 +27,7 @@
#include "lib/async_req/async_sock.h"
#include "lib/util/tevent_unix.h"
#include "lib/sys_rw.h"
+#include "lib/sys_rw_data.h"
#if !defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) && !defined(HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS)
# error Can not pass file descriptors
diff --git a/source3/modules/vfs_preopen.c b/source3/modules/vfs_preopen.c
index 612b025..cc38a90 100644
--- a/source3/modules/vfs_preopen.c
+++ b/source3/modules/vfs_preopen.c
@@ -21,6 +21,7 @@
#include "includes.h"
#include "system/filesys.h"
#include "smbd/smbd.h"
+#include "lib/sys_rw_data.h"
struct preopen_state;
diff --git a/source3/modules/vfs_smb_traffic_analyzer.c b/source3/modules/vfs_smb_traffic_analyzer.c
index 92a1762..06ff1f6 100644
--- a/source3/modules/vfs_smb_traffic_analyzer.c
+++ b/source3/modules/vfs_smb_traffic_analyzer.c
@@ -29,6 +29,7 @@
#include "../librpc/gen_ndr/ndr_netlogon.h"
#include "auth.h"
#include "../lib/tsocket/tsocket.h"
+#include "lib/sys_rw_data.h"
/* abstraction for the send_over_network function */
enum sock_type {INTERNET_SOCKET = 0, UNIX_DOMAIN_SOCKET};
diff --git a/source3/nmbd/asyncdns.c b/source3/nmbd/asyncdns.c
index 4468c7b..5973c8e 100644
--- a/source3/nmbd/asyncdns.c
+++ b/source3/nmbd/asyncdns.c
@@ -19,6 +19,7 @@
#include "includes.h"
#include "nmbd/nmbd.h"
+#include "lib/sys_rw_data.h"
/***************************************************************************
Add a DNS result to the name cache.
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index 5d053cc..61afa28 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -36,6 +36,7 @@
#include "messages.h"
#include "util_tdb.h"
#include "lib/param/loadparm.h"
+#include "lib/sys_rw_data.h"
extern struct current_user current_user;
extern userdom_struct current_user_info;
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index c7f0e9a..a761669 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -39,6 +39,7 @@
#include "../libcli/security/dom_sid.h"
#include "../libcli/security/security_token.h"
#include "lib/id_cache.h"
+#include "lib/sys_rw_data.h"
#include "serverid.h"
#include "system/threads.h"
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index cd13d68..0b6c102 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -43,6 +43,7 @@
#include "../lib/tsocket/tsocket.h"
#include "lib/tevent_wait.h"
#include "libcli/smb/smb_signing.h"
+#include "lib/sys_rw_data.h"
/****************************************************************************
Ensure we check the path in *exactly* the same way as W2K for a findfirst/findnext
diff --git a/source3/smbd/smb2_read.c b/source3/smbd/smb2_read.c
index 470e496..4e974a2 100644
--- a/source3/smbd/smb2_read.c
+++ b/source3/smbd/smb2_read.c
@@ -26,6 +26,7 @@
#include "libcli/security/security.h"
#include "../lib/util/tevent_ntstatus.h"
#include "rpc_server/srv_pipe_hnd.h"
+#include "lib/sys_rw_data.h"
static struct tevent_req *smbd_smb2_read_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index f90f882..2714655 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -41,6 +41,7 @@
#include "util_tdb.h"
#include "../libcli/smb/read_smb.h"
#include "../libcli/smb/smbXcli_base.h"
+#include "lib/sys_rw_data.h"
extern char *optarg;
extern int optind;
diff --git a/source3/utils/smbfilter.c b/source3/utils/smbfilter.c
index e06fee6..ff966a8 100644
--- a/source3/utils/smbfilter.c
+++ b/source3/utils/smbfilter.c
@@ -22,6 +22,7 @@
#include "system/select.h"
#include "../lib/util/select.h"
#include "libsmb/nmblib.h"
+#include "lib/sys_rw_data.h"
#define SECURITY_MASK 0
#define SECURITY_SET 0
diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c
index 43a27b3..35838e6 100644
--- a/source3/winbindd/winbindd_dual.c
+++ b/source3/winbindd/winbindd_dual.c
@@ -39,6 +39,7 @@
#include "../lib/util/tevent_unix.h"
#include "lib/param/loadparm.h"
#include "lib/sys_rw.h"
+#include "lib/sys_rw_data.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_WINBIND
diff --git a/source3/wscript_build b/source3/wscript_build
index 591b1be..18f6b6d 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -254,8 +254,8 @@ bld.SAMBA3_SUBSYSTEM('KRBCLIENT',
public_deps='krb5samba k5crypto gssapi LIBTSOCKET CLDAP LIBNMB')
bld.SAMBA3_LIBRARY('sys_rw',
- source='lib/sys_rw.c',
- deps='replace',
+ source='lib/sys_rw.c lib/sys_rw_data.c',
+ deps='replace iov_buf',
private_library=True)
bld.SAMBA3_LIBRARY('iov_buf',
--
2.1.2
From 82fa00be7fd8ae26b570ed6cec2ff3fea2c020d9 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 19 Nov 2014 14:29:26 +0000
Subject: [PATCH 08/10] lib: Make write_data take a const void *
This aligns it with write(2)
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/lib/sys_rw_data.c | 2 +-
source3/lib/sys_rw_data.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/source3/lib/sys_rw_data.c b/source3/lib/sys_rw_data.c
index f7bedb3..e4f9a16 100644
--- a/source3/lib/sys_rw_data.c
+++ b/source3/lib/sys_rw_data.c
@@ -97,7 +97,7 @@ ssize_t write_data_iov(int fd, const struct iovec *orig_iov, int iovcnt)
on socket calls.
****************************************************************************/
-ssize_t write_data(int fd, const char *buffer, size_t n)
+ssize_t write_data(int fd, const void *buffer, size_t n)
{
struct iovec iov;
diff --git a/source3/lib/sys_rw_data.h b/source3/lib/sys_rw_data.h
index fc97573..5d1995b 100644
--- a/source3/lib/sys_rw_data.h
+++ b/source3/lib/sys_rw_data.h
@@ -28,6 +28,6 @@
struct iovec;
ssize_t write_data_iov(int fd, const struct iovec *iov, int iovcnt);
-ssize_t write_data(int fd, const char *buffer, size_t n);
+ssize_t write_data(int fd, const void *buffer, size_t n);
#endif
--
2.1.2
From 5759e223a3c249c6321280fa7d58d4b22da8654c Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 19 Nov 2014 14:35:14 +0000
Subject: [PATCH 09/10] lib: Add a simple read_data call without NTSTATUS
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/lib/sys_rw_data.c | 22 ++++++++++++++++++++++
source3/lib/sys_rw_data.h | 1 +
2 files changed, 23 insertions(+)
diff --git a/source3/lib/sys_rw_data.c b/source3/lib/sys_rw_data.c
index e4f9a16..353dbe7 100644
--- a/source3/lib/sys_rw_data.c
+++ b/source3/lib/sys_rw_data.c
@@ -105,3 +105,25 @@ ssize_t write_data(int fd, const void *buffer, size_t n)
iov.iov_len = n;
return write_data_iov(fd, &iov, 1);
}
+
+/*
+ * Blocking read n bytes from a fd
+ */
+
+ssize_t read_data(int fd, void *buffer, size_t n)
+{
+ ssize_t nread;
+
+ nread = 0;
+
+ while (nread < n) {
+ ssize_t ret;
+ ret = sys_read(fd, ((char *)buffer) + nread, n - nread);
+ if (ret <= 0) {
+ return ret;
+ }
+ nread += ret;
+ }
+
+ return nread;
+}
diff --git a/source3/lib/sys_rw_data.h b/source3/lib/sys_rw_data.h
index 5d1995b..bda3795 100644
--- a/source3/lib/sys_rw_data.h
+++ b/source3/lib/sys_rw_data.h
@@ -29,5 +29,6 @@ struct iovec;
ssize_t write_data_iov(int fd, const struct iovec *iov, int iovcnt);
ssize_t write_data(int fd, const void *buffer, size_t n);
+ssize_t read_data(int fd, void *buffer, size_t n);
#endif
--
2.1.2
From 9a2319782f51ad01db7572ace91fb56bd8c74efe Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Wed, 19 Nov 2014 14:41:42 +0000
Subject: [PATCH 10/10] smbd: Use read_data() in notify_inotify
Signed-off-by: Volker Lendecke <vl at samba.org>
---
source3/smbd/notify_inotify.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/source3/smbd/notify_inotify.c b/source3/smbd/notify_inotify.c
index a9b7131..5fbc7f2 100644
--- a/source3/smbd/notify_inotify.c
+++ b/source3/smbd/notify_inotify.c
@@ -24,6 +24,7 @@
#include "includes.h"
#include "../librpc/gen_ndr/notify.h"
#include "smbd/smbd.h"
+#include "lib/sys_rw_data.h"
#ifdef HAVE_INOTIFY
@@ -201,7 +202,7 @@ static void inotify_handler(struct tevent_context *ev, struct tevent_fd *fde,
struct inotify_event *e0, *e;
uint32_t prev_cookie=0;
int prev_wd = -1;
- NTSTATUS status;
+ ssize_t ret;
/*
we must use FIONREAD as we cannot predict the length of the
@@ -219,10 +220,10 @@ static void inotify_handler(struct tevent_context *ev, struct tevent_fd *fde,
if (e == NULL) return;
((uint8_t *)e)[bufsize] = '\0';
- status = read_data_ntstatus(in->fd, (char *)e0, bufsize);
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0,("Failed to read all inotify data - %s\n",
- nt_errstr(status)));
+ ret = read_data(in->fd, e0, bufsize);
+ if (ret != bufsize) {
+ DEBUG(0, ("Failed to read all inotify data - %s\n",
+ strerror(errno)));
talloc_free(e0);
/* the inotify fd will now be out of sync,
* can't keep reading data off it */
--
2.1.2
More information about the samba-technical
mailing list