The branch, master has been updated
       via  7e621b1b530 ctdb: Modernize a few DEBUGs
       via  73e806c559d ctdb: Remove common/line.[ch]
       via  ba8f8ef33cd ctdb: Use stdio's getline() in 
ctdb_connection_list_read()
       via  4de14e27231 lib: Use fdopen_keepfd()
       via  b6f4acb9b46 rpc_server3: Use fdopen_keepfd()
       via  28335cdb5d7 lib: Add fdopen_keepfd()
       via  0baae61e423 lib: Give lib/util/util_file.c its own header file
       via  f42c5802faf ctdb-scripts: Add options to generate smb.conf 
interfaces include file
       via  56eeb058d2d ctdb-scripts: Rename and relocate function 
get_all_interfaces()
       via  ff3b92ffaed smbd-server: Process ip add/drop events for 
options:dynamic only
       via  c60fe03ef7d lib-interface: Change API for interface 'options'
       via  3edeb2bdce4 lib-interface: Add parsing for interface 'options'
       via  cfa846fa292 lib-interface: Add extra parameter 'options' to 
interface definition
       via  9fcb62cf22d param: Add additional key 'options' for interfaces
       via  916fabe7e83 smbd-server: Use MSG_SMB_IP_DROPPED
       via  644b50b05b2 messaging: Add new SMBD message
       via  4ef1eb92edc smbd-server: Handle ip drop event and close listening 
socket
       via  bca01b501cb smbd-server: Open socket for additional ip address
       via  961104262c6 lib-interface: Add new API to validate interface info 
for given interface index
       via  6f18422aadc lib-addrchange: Change API to fill up if_index value 
from netlink msg
       via  02a99126abf smbd-server: Set event callback for interface change 
notification
      from  7532c798d13 docs: Document new tdbdump -x option

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7e621b1b530f740bce8d2de084c0f710f1ddb437
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Feb 29 16:11:16 2024 +0100

    ctdb: Modernize a few DEBUGs
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    
    Autobuild-User(master): Martin Schwenke <mart...@samba.org>
    Autobuild-Date(master): Wed Apr 17 00:54:55 UTC 2024 on atb-devel-224

commit 73e806c559d8889026b2b14a8d22145bd1a2b430
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Mar 1 21:19:51 2024 +0100

    ctdb: Remove common/line.[ch]
    
    This was an implementation of getline(3), use that instead.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>

commit ba8f8ef33cd99ea60fc2682727a5497995b5f569
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Mar 1 21:16:57 2024 +0100

    ctdb: Use stdio's getline() in ctdb_connection_list_read()
    
    This is the only user of common/line.[ch], which can go next.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>

commit 4de14e2723139b488e69251e500f022f50f983e1
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 10 13:11:11 2024 +0200

    lib: Use fdopen_keepfd()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>

commit b6f4acb9b46773d61aaea242b67af90d40bc4c9c
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 10 13:08:06 2024 +0200

    rpc_server3: Use fdopen_keepfd()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>

commit 28335cdb5d72c63d52c83fe00a67b8aa28558677
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 10 13:07:56 2024 +0200

    lib: Add fdopen_keepfd()
    
    Capture the dup/fdopen pattern
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>

commit 0baae61e4233bc812c65c3646b1acf15ef7bc22f
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 10 13:02:39 2024 +0200

    lib: Give lib/util/util_file.c its own header file
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>

commit f42c5802fafa61fe29a0b78c0247eb5a5c386c15
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Jan 30 01:50:20 2024 -0800

    ctdb-scripts: Add options to generate smb.conf interfaces include file
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 56eeb058d2d5fde17c461afe7fac2f0832993a8c
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Jan 30 01:25:37 2024 -0800

    ctdb-scripts: Rename and relocate function get_all_interfaces()
    
    get_all_interfaces() functions gets all names for all public interfaces.
    However name is misleading. Thus renamed it to get_public_ifaces() and
    moved it under functions.
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit ff3b92ffaed64e8ecb250f0ad160210f511a39e2
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Mar 5 03:03:25 2024 -0800

    smbd-server: Process ip add/drop events for options:dynamic only
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit c60fe03ef7d09f98b2c91669e0ecbd880c72fa0e
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Mar 5 02:32:23 2024 -0800

    lib-interface: Change API for interface 'options'
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 3edeb2bdce41acb4ae09954adaf9dcfe9aa627cc
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Mar 5 02:15:11 2024 -0800

    lib-interface: Add parsing for interface 'options'
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit cfa846fa292fa665ee1c72671a4c41116cfb4e15
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Mar 5 02:27:04 2024 -0800

    lib-interface: Add extra parameter 'options' to interface definition
    
    Signed-off-by: Vinit Agnihotri<vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 9fcb62cf22d237fb61d1297e9e53418ce73105a3
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Mar 5 03:16:49 2024 -0800

    param: Add additional key 'options' for interfaces
    
    The key 'options' specifies if server should spawn/kill listning sockets
    in event of add/dropped ip addresses on specified interface.
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 916fabe7e838c02e1d221e7edc16ba723e7bed97
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Thu Feb 29 00:52:08 2024 -0800

    smbd-server: Use MSG_SMB_IP_DROPPED
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 644b50b05b288298b359310dd56963e0e11b9290
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Wed Feb 28 22:22:38 2024 -0800

    messaging: Add new SMBD message
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 4ef1eb92edcd6f93a743e5bb801834250ce1a8ca
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Wed Feb 28 03:56:23 2024 -0800

    smbd-server: Handle ip drop event and close listening socket
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit bca01b501cb0b521e60784e6ce4e4f9af0773ff8
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Feb 20 21:49:34 2024 -0800

    smbd-server: Open socket for additional ip address
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 961104262c6209be13cd29a67b3e323999cc5b4e
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Feb 20 02:40:13 2024 -0800

    lib-interface: Add new API to validate interface info for given interface 
index
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 6f18422aadce109ca30b7703ddd8574f49d8aff0
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Thu Feb 15 05:23:37 2024 -0800

    lib-addrchange: Change API to fill up if_index value from netlink msg
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 02a99126abf7cc4399c3784f3edf6a10d7c34c4e
Author: Vinit Agnihotri <vagniho...@ddn.com>
Date:   Tue Feb 13 03:30:50 2024 -0800

    smbd-server: Set event callback for interface change notification
    
    Signed-off-by: Vinit Agnihotri <vagniho...@ddn.com>
    Reviewed-by: Martin Schwenke <mschwe...@ddn.com>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 auth/credentials/credentials.c                |   1 +
 ctdb/common/ctdb_util.c                       |   1 +
 ctdb/common/line.c                            | 145 -----------------
 ctdb/common/line.h                            |  62 -------
 ctdb/config/events/legacy/10.interface.script |  30 +---
 ctdb/config/events/legacy/50.samba.script     |  24 +++
 ctdb/config/functions                         |  24 +++
 ctdb/doc/ctdb-script.options.5.xml            |  45 ++++++
 ctdb/protocol/protocol_util.c                 |  36 +++--
 ctdb/server/ctdb_recoverd.c                   |  36 +++--
 ctdb/server/ctdb_takeover.c                   |   1 +
 ctdb/tests/UNIT/cunit/line_test_001.sh        |  90 -----------
 ctdb/tests/src/fake_ctdbd.c                   |   1 +
 ctdb/tests/src/line_test.c                    | 102 ------------
 ctdb/tools/ctdb.c                             |   1 +
 ctdb/wscript                                  |   2 -
 docs-xml/smbdotconf/base/interfaces.xml       |  23 ++-
 lib/fuzzing/afl-fuzz-main.c                   |   2 +-
 lib/socket/interfaces.h                       |   1 +
 lib/util/samba_util.h                         |  55 -------
 lib/util/tests/file.c                         |   1 +
 lib/util/util_file.c                          |  37 ++++-
 lib/util/util_file.h                          |  82 ++++++++++
 libcli/nbt/lmhosts.c                          |   1 +
 libcli/netlogon/netlogon.c                    |   1 +
 libgpo/gpo_ini.c                              |   1 +
 librpc/idl/messaging.idl                      |   3 +
 librpc/rpc/dcerpc_pkt_auth.c                  |   1 +
 librpc/rpc/dcerpc_util.c                      |   1 +
 librpc/tools/ndrdump.c                        |   1 +
 librpc/wsp/wsp_util.c                         |   1 +
 source3/auth/user_util.c                      |   1 +
 source3/client/clitar.c                       |   1 +
 source3/include/smb.h                         |   1 +
 source3/lib/addrchange.c                      |  13 +-
 source3/lib/addrchange.h                      |   6 +-
 source3/lib/dumpcore.c                        |   1 +
 source3/lib/interface.c                       |  51 +++++-
 source3/lib/interface.h                       |   4 +
 source3/lib/tallocmsg.c                       |  13 +-
 source3/lib/util_file.c                       |   3 +-
 source3/libgpo/gpext/registry.c               |   1 +
 source3/modules/vfs_fruit.c                   |   1 +
 source3/modules/vfs_glusterfs.c               |   1 +
 source3/modules/vfs_shell_snap.c              |   1 +
 source3/nmbd/nmbd_synclists.c                 |   1 +
 source3/nmbd/nmbd_winsserver.c                |   1 +
 source3/param/loadparm.c                      |   1 +
 source3/passdb/machine_sid.c                  |   1 +
 source3/printing/nt_printing_os2.c            |   1 +
 source3/printing/print_generic.c              |   1 +
 source3/printing/print_standard.c             |   1 +
 source3/rpc_server/rpc_host.c                 |  13 +-
 source3/rpc_server/rpc_worker.c               |  15 +-
 source3/rpc_server/spoolss/srv_spoolss_nt.c   |   1 +
 source3/smbd/server.c                         | 222 ++++++++++++++++++++++++++
 source3/smbd/smb1_lanman.c                    |   1 +
 source3/smbd/smb2_process.c                   |  38 +++++
 source3/torture/test_addrchange.c             |   2 +-
 source3/torture/torture.c                     |   1 +
 source3/utils/net_ads.c                       |   1 +
 source3/utils/net_eventlog.c                  |   1 +
 source3/utils/net_offlinejoin.c               |   1 +
 source3/utils/net_usershare.c                 |   1 +
 source3/utils/smbcacls.c                      |   1 +
 source3/winbindd/winbindd.c                   |   2 +-
 source4/lib/registry/patchfile_dotreg.c       |   1 +
 source4/lib/registry/regf.c                   |   4 +-
 source4/lib/tls/tls_tstream.c                 |   1 +
 source4/lib/tls/tlscert.c                     |   1 +
 source4/libcli/dgram/browse.c                 |   1 +
 source4/libcli/dgram/netlogon.c               |   1 +
 source4/librpc/rpc/dcerpc.c                   |   1 +
 source4/torture/auth/pac.c                    |   1 +
 source4/torture/basic/misc.c                  |   1 +
 source4/torture/drs/rpc/dssync.c              |   1 +
 source4/torture/gentest.c                     |   1 +
 source4/torture/locktest.c                    |   1 +
 source4/torture/smbtorture.c                  |   1 +
 source4/torture/util_smb.c                    |   1 +
 80 files changed, 673 insertions(+), 561 deletions(-)
 delete mode 100644 ctdb/common/line.c
 delete mode 100644 ctdb/common/line.h
 delete mode 100755 ctdb/tests/UNIT/cunit/line_test_001.sh
 delete mode 100644 ctdb/tests/src/line_test.c
 create mode 100644 lib/util/util_file.h


Changeset truncated at 500 lines:

diff --git a/auth/credentials/credentials.c b/auth/credentials/credentials.c
index 20ab858e67b..6a590483e99 100644
--- a/auth/credentials/credentials.c
+++ b/auth/credentials/credentials.c
@@ -22,6 +22,7 @@
 */
 
 #include "includes.h"
+#include "lib/util/util_file.h"
 #include "librpc/gen_ndr/samr.h" /* for struct samrPassword */
 #include "auth/credentials/credentials.h"
 #include "auth/credentials/credentials_internal.h"
diff --git a/ctdb/common/ctdb_util.c b/ctdb/common/ctdb_util.c
index 3ca1f772eba..ebf0203871f 100644
--- a/ctdb/common/ctdb_util.c
+++ b/ctdb/common/ctdb_util.c
@@ -21,6 +21,7 @@
 #include "system/network.h"
 #include "system/filesys.h"
 #include "system/wait.h"
+#include "lib/util/util_file.h"
 
 #include <tdb.h>
 
diff --git a/ctdb/common/line.c b/ctdb/common/line.c
deleted file mode 100644
index c4c6726875b..00000000000
--- a/ctdb/common/line.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
-   Line based I/O over fds
-
-   Copyright (C) Amitay Isaacs  2018
-
-   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 <talloc.h>
-
-#include "lib/util/sys_rw.h"
-
-#include "common/line.h"
-
-struct line_read_state {
-       line_process_fn_t callback;
-       void *private_data;
-       char *buf;
-       size_t hint, len, offset;
-       int num_lines;
-};
-
-static bool line_read_one(char *buf, size_t start, size_t len, size_t *pos)
-{
-       size_t i;
-
-       for (i=start; i<len; i++) {
-               if (buf[i] == '\n' || buf[i] == '\0') {
-                       *pos = i;
-                       return true;
-               }
-       }
-
-       return false;
-}
-
-static int line_read_process(struct line_read_state *state)
-{
-       size_t start = 0;
-       size_t pos = 0;
-
-       while (1) {
-               int ret;
-               bool ok;
-
-               ok = line_read_one(state->buf, start, state->offset, &pos);
-               if (! ok) {
-                       break;
-               }
-
-               state->buf[pos] = '\0';
-               state->num_lines += 1;
-
-               ret = state->callback(state->buf + start, state->private_data);
-               if (ret != 0) {
-                       return ret;
-               }
-
-               start = pos+1;
-       }
-
-       if (pos > 0) {
-               if (pos+1 < state->offset) {
-                       memmove(state->buf,
-                               state->buf + pos+1,
-                               state->offset - (pos+1));
-               }
-               state->offset -= (pos+1);
-       }
-
-       return 0;
-}
-
-int line_read(int fd,
-             size_t length,
-             TALLOC_CTX *mem_ctx,
-             line_process_fn_t callback,
-             void *private_data,
-             int *num_lines)
-{
-       struct line_read_state state;
-
-       if (length < 32) {
-               length = 32;
-       }
-
-       state = (struct line_read_state) {
-               .callback = callback,
-               .private_data = private_data,
-               .hint = length,
-       };
-
-       while (1) {
-               ssize_t n;
-               int ret;
-
-               if (state.offset == state.len) {
-                       state.len += state.hint;
-                       state.buf = talloc_realloc_size(mem_ctx,
-                                                       state.buf,
-                                                       state.len);
-                       if (state.buf == NULL) {
-                               return ENOMEM;
-                       }
-               }
-
-               n = sys_read(fd,
-                            state.buf + state.offset,
-                            state.len - state.offset);
-               if (n < 0) {
-                       return errno;
-               }
-               if (n == 0) {
-                       break;
-               }
-
-               state.offset += n;
-
-               ret = line_read_process(&state);
-               if (ret != 0) {
-                       if (num_lines != NULL) {
-                               *num_lines = state.num_lines;
-                       }
-                       return ret;
-               }
-       }
-
-       if (num_lines != NULL) {
-               *num_lines = state.num_lines;
-       }
-       return 0;
-}
diff --git a/ctdb/common/line.h b/ctdb/common/line.h
deleted file mode 100644
index 6b67f1e92e1..00000000000
--- a/ctdb/common/line.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-   Line based I/O over fds
-
-   Copyright (C) Amitay Isaacs  2018
-
-   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 __CTDB_LINE_H__
-#define __CTDB_LINE_H__
-
-#include <talloc.h>
-
-/**
- * @file line.h
- *
- * @brief Line based I/O over pipes and sockets
- */
-
-/**
- * @brief The callback routine called to process a line
- *
- * @param[in]  line The line read
- * @param[in]  private_data Private data for callback
- * @return 0 to continue processing lines, non-zero to stop reading
- */
-typedef int (*line_process_fn_t)(char *line, void *private_data);
-
-/**
- * @brief Read a line (terminated by \n or \0)
- *
- * If there is any read error on fd, then errno will be returned.
- * If callback function returns a non-zero value, then that value will be
- * returned.
- *
- * @param[in]  fd The file descriptor
- * @param[in]  length The expected length of a line (this is only a hint)
- * @param[in]  mem_ctx Talloc memory context
- * @param[in]  callback Callback function called when a line is read
- * @param[in]  private_data Private data for callback
- * @param[out] num_lines Number of lines read so far
- * @return 0 on on success, errno on failure
- */
-int line_read(int fd,
-             size_t length,
-             TALLOC_CTX *mem_ctx,
-             line_process_fn_t callback,
-             void *private_data,
-             int *num_lines);
-
-#endif /* __CTDB_LINE_H__ */
diff --git a/ctdb/config/events/legacy/10.interface.script 
b/ctdb/config/events/legacy/10.interface.script
index fead88c014f..110b1213966 100755
--- a/ctdb/config/events/legacy/10.interface.script
+++ b/ctdb/config/events/legacy/10.interface.script
@@ -12,37 +12,16 @@
 
 load_script_options
 
-ctdb_public_addresses="${CTDB_BASE}/public_addresses"
-
-if [ ! -f "$ctdb_public_addresses" ]; then
+if ! have_public_addresses; then
        if [ "$1" = "init" ] ; then
                echo "No public addresses file found"
        fi
        exit 0
 fi
 
-# This sets $all_interfaces as a side-effect.
-get_all_interfaces ()
-{
-    # Get all the interfaces listed in the public_addresses file
-    all_interfaces=$(sed -e '/^#.*/d' \
-                        -e 's/^[^\t ]*[\t ]*//' \
-                        -e 's/,/ /g' \
-                        -e 's/[\t ]*$//' "$ctdb_public_addresses")
-
-    # Get the interfaces for which CTDB has public IPs configured.
-    # That is, for all but the 1st line, get the 1st field.
-    ctdb_ifaces=$($CTDB -X ifaces | sed -e '1d' -e 's@^|@@' -e 's@|.*@@')
-
-    # Add $ctdb_ifaces and make $all_interfaces unique
-    # Use word splitting to squash whitespace
-    # shellcheck disable=SC2086
-    all_interfaces=$(echo $all_interfaces $ctdb_ifaces | tr ' ' '\n' | sort -u)
-}
-
 monitor_interfaces()
 {
-       get_all_interfaces
+       get_public_ifaces
 
        down_interfaces_found=false
        up_interfaces_found=false
@@ -50,7 +29,10 @@ monitor_interfaces()
        # Note that this loop must not exit early.  It must process
        # all interfaces so that the correct state for each interface
        # is set in CTDB using setifacelink.
-       for _iface in $all_interfaces ; do
+       #
+       # public_ifaces set by get_public_ifaces() above
+       # shellcheck disable=SC2154
+       for _iface in $public_ifaces ; do
                if interface_monitor "$_iface" ; then
                        up_interfaces_found=true
                        $CTDB setifacelink "$_iface" up >/dev/null 2>&1
diff --git a/ctdb/config/events/legacy/50.samba.script 
b/ctdb/config/events/legacy/50.samba.script
index 84600e25024..90de6a3f31b 100755
--- a/ctdb/config/events/legacy/50.samba.script
+++ b/ctdb/config/events/legacy/50.samba.script
@@ -27,6 +27,27 @@ load_script_options
 
 ctdb_setup_state_dir "service" "$service_name"
 
+generate_smb_interfaces_config()
+{
+       get_public_ifaces
+       pub_iface_list=$public_ifaces
+       public_ifaces=""
+       for iface in $pub_iface_list;
+       do
+               public_ifaces="$public_ifaces \"$iface;options=dynamic\""
+       done
+
+       if [ -n "$CTDB_SAMBA_INTERFACES_EXTRA" ]; then
+               public_ifaces="$public_ifaces $CTDB_SAMBA_INTERFACES_EXTRA"
+       fi
+       public_ifaces=$(echo "$public_ifaces" | xargs -n 1 | sort -u)
+
+cat <<EOT > "$CTDB_SAMBA_INTERFACES_FILE"
+    bind interfaces only = yes
+    interfaces = lo $public_ifaces
+EOT
+}
+
 service_start()
 {
        # make sure samba is not already started
@@ -36,6 +57,9 @@ service_start()
                # make absolutely sure samba is dead
                killall -q -9 smbd
        }
+       if [ -n "$CTDB_SAMBA_INTERFACES_FILE" ]; then
+               generate_smb_interfaces_config
+       fi
        # start Samba service. Start it reniced, as under very heavy load
        # the number of smbd processes will mean that it leaves few cycles
        # for anything else
diff --git a/ctdb/config/functions b/ctdb/config/functions
index a40b276e2b8..e76082b7cb3 100755
--- a/ctdb/config/functions
+++ b/ctdb/config/functions
@@ -651,6 +651,30 @@ drop_ip()
        fi
 }
 
+have_public_addresses()
+{
+       [ -f "${CTDB_BASE}/public_addresses" ]
+}
+
+# This sets $public_ifaces as a side-effect.
+get_public_ifaces()
+{
+       # Get all the interfaces listed in the public_addresses file
+       public_ifaces=$(sed -e '/^#.*/d' \
+               -e 's/^[^\t ]*[\t ]*//' \
+               -e 's/,/ /g' \
+               -e 's/[\t ]*$//' "${CTDB_BASE}/public_addresses")
+
+       # Get the interfaces for which CTDB has public IPs configured.
+       # That is, for all but the 1st line, get the 1st field.
+       ctdb_ifaces=$($CTDB -X ifaces | sed -e '1d' -e 's@^|@@' -e 's@|.*@@')
+
+       # Add $ctdb_ifaces and make $public_ifaces unique
+       # Use word splitting to squash whitespace
+       # shellcheck disable=SC2086
+       public_ifaces=$(echo $public_ifaces $ctdb_ifaces | tr ' ' '\n' | sort 
-u)
+}
+
 drop_all_public_ips()
 {
        # _x is intentionally ignored
diff --git a/ctdb/doc/ctdb-script.options.5.xml 
b/ctdb/doc/ctdb-script.options.5.xml
index ef3ad416d0d..ffe4c3abd62 100644
--- a/ctdb/doc/ctdb-script.options.5.xml
+++ b/ctdb/doc/ctdb-script.options.5.xml
@@ -691,6 +691,51 @@ CTDB_PER_IP_ROUTING_TABLE_ID_HIGH=9000
          </listitem>
        </varlistentry>
 
+       <varlistentry>
+         <term>
+           CTDB_SAMBA_INTERFACES_FILE=<parameter>FILENAME</parameter>
+         </term>
+         <listitem>
+           <para>
+             Generates FILENAME, containing an smb.conf snippet with
+             an interfaces setting that includes interfaces for
+             configured CTDB public IP addresses.  This file then
+             needs to be explicitly included in smb.conf.
+           </para>
+           <para>
+             For example, if public IP addresses are defined on
+             interfaces eth0 and eth1, and this is set to
+             <filename>/etc/samba/interfaces.conf</filename>, then
+             that file will contain the following before smbd is
+             started:
+           </para>
+           <screen>
+     bind interfaces only = yes
+     interfaces = lo eth0 eth1
+           </screen>
+           <para>
+             This can be useful for limiting the interfaces used by
+             SMB multichannel.
+           </para>
+           <para>
+             Default is to not generate a file.
+           </para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term>
+           CTDB_SAMBA_INTERFACES_EXTRA=<parameter>INTERFACE-LIST</parameter>
+         </term>
+         <listitem>
+           <para>
+             A space separated list to provide additional interfaces to bind.
+           </para>
+           <para>
+             Default is empty - no extra interfaces are added.
+           </para>
+         </listitem>
+       </varlistentry>
       </variablelist>
 
     </refsect2>
diff --git a/ctdb/protocol/protocol_util.c b/ctdb/protocol/protocol_util.c
index 01756cfa759..25e668b73ee 100644
--- a/ctdb/protocol/protocol_util.c
+++ b/ctdb/protocol/protocol_util.c
@@ -22,12 +22,11 @@
 
 #include <talloc.h>
 
-#include "common/line.h"
-
 #include "protocol.h"
 #include "protocol_util.h"
 #include "lib/util/util.h"
 #include "lib/util/smb_strtox.h"
+#include "lib/util/util_file.h"
 
 static struct {
        enum ctdb_runstate runstate;
@@ -712,10 +711,10 @@ struct ctdb_connection_list_read_state {
        bool client_first;
 };
 
-static int ctdb_connection_list_read_line(char *line, void *private_data)
+static int ctdb_connection_list_read_line(
+       char *line,
+       struct ctdb_connection_list_read_state *state)
 {
-       struct ctdb_connection_list_read_state *state =
-               (struct ctdb_connection_list_read_state *)private_data;
        struct ctdb_connection conn;
        int ret;
 
@@ -748,7 +747,11 @@ int ctdb_connection_list_read(TALLOC_CTX *mem_ctx,
                              struct ctdb_connection_list **conn_list)
 {
        struct ctdb_connection_list_read_state state;
+       char *line = NULL;
+       FILE *f = NULL;
        int ret;
+       size_t len = 0;
+       ssize_t nread;
 
        if (conn_list == NULL) {
                return EINVAL;
@@ -761,12 +764,23 @@ int ctdb_connection_list_read(TALLOC_CTX *mem_ctx,
 
        state.client_first = client_first;
 
-       ret = line_read(fd,
-                       128,
-                       mem_ctx,
-                       ctdb_connection_list_read_line,
-                       &state,
-                       NULL);
+       f = fdopen_keepfd(fd, "r");
+       if (f == NULL) {
+               return errno;
+       }
+
+       while ((nread = getline(&line, &len, f)) != -1) {
+               if ((nread > 0) && (line[nread-1] == '\n')) {
+                       line[nread-1] = '\0';
+               }
+               ret = ctdb_connection_list_read_line(line, &state);
+               if (ret != 0) {
+                       break;
+               }
+       }


-- 
Samba Shared Repository

Reply via email to