File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / patches / slp.diff
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:32:36 2021 UTC (3 years, 6 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_2_3, HEAD
rsync 3.2.3

    1: This adds Service Location Protocol support.
    2: 
    3: To use this patch, run these commands for a successful build:
    4: 
    5:     patch -p1 <patches/slp.diff
    6:     ./prepare-source
    7:     ./configure --enable-slp
    8:     make
    9: 
   10: TODO: the configure changes should abort if the user requests --enable-slp
   11: and we can't honor that request.
   12: 
   13: based-on: e94bad1c156fc3910f24e2b3b71a81b0b0bdeb70
   14: diff --git a/Makefile.in b/Makefile.in
   15: --- a/Makefile.in
   16: +++ b/Makefile.in
   17: @@ -16,6 +16,8 @@ CXX=@CXX@
   18:  CXXFLAGS=@CXXFLAGS@
   19:  EXEEXT=@EXEEXT@
   20:  LDFLAGS=@LDFLAGS@
   21: +LIBSLP=@LIBSLP@
   22: +SLPOBJ=@SLPOBJ@
   23:  LIBOBJDIR=lib/
   24:  
   25:  INSTALLCMD=@INSTALL@
   26: @@ -45,7 +47,7 @@ OBJS1=flist.o rsync.o generator.o receiver.o cleanup.o sender.o exclude.o \
   27:  OBJS2=options.o io.o compat.o hlink.o token.o uidlist.o socket.o hashtable.o \
   28:  	usage.o fileio.o batch.o clientname.o chmod.o acls.o xattrs.o
   29:  OBJS3=progress.o pipe.o @ASM@
   30: -DAEMON_OBJ = params.o loadparm.o clientserver.o access.o connection.o authenticate.o
   31: +DAEMON_OBJ = params.o loadparm.o clientserver.o access.o connection.o authenticate.o $(SLPOBJ)
   32:  popt_OBJS=popt/findme.o  popt/popt.o  popt/poptconfig.o \
   33:  	popt/popthelp.o popt/poptparse.o
   34:  OBJS=$(OBJS1) $(OBJS2) $(OBJS3) @SIMD@ $(DAEMON_OBJ) $(LIBOBJ) @BUILD_ZLIB@ @BUILD_POPT@
   35: @@ -94,7 +96,7 @@ install-strip:
   36:  	$(MAKE) INSTALL_STRIP='-s' install
   37:  
   38:  rsync$(EXEEXT): $(OBJS)
   39: -	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
   40: +	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) $(LIBSLP)
   41:  
   42:  $(OBJS): $(HEADERS)
   43:  $(CHECK_OBJS): $(HEADERS)
   44: diff --git a/clientserver.c b/clientserver.c
   45: --- a/clientserver.c
   46: +++ b/clientserver.c
   47: @@ -1456,6 +1456,13 @@ int daemon_main(void)
   48:  	 * address too.  In fact, why not just do getnameinfo on the
   49:  	 * local address??? */
   50:  
   51: +#ifdef HAVE_LIBSLP
   52: +	if (lp_use_slp() && register_services()) {
   53: +		rprintf(FINFO,
   54: +		    "Couldn't register with service discovery protocol, continuing anyway\n");
   55: +	}
   56: +#endif
   57: +
   58:  	start_accept_loop(rsync_port, start_daemon);
   59:  	return -1;
   60:  }
   61: diff --git a/configure.ac b/configure.ac
   62: --- a/configure.ac
   63: +++ b/configure.ac
   64: @@ -1018,6 +1018,29 @@ if test $rsync_cv_can_hardlink_special = yes; then
   65:      AC_DEFINE(CAN_HARDLINK_SPECIAL, 1, [Define to 1 if link() can hard-link special files.])
   66:  fi
   67:  
   68: +AC_ARG_ENABLE(slp, [  --disable-slp           turn off SLP support, defaults to on])
   69: +AC_ARG_WITH(openslp-libs, [  --with-openslp-libs     set directory for OpenSLP library],
   70: +    LDFLAGS="-L$withval $LDFLAGS"
   71: +    DSOFLAGS="-L$withval $DSOFLAGS",)
   72: +AC_ARG_WITH(openslp-includes, [  --with-openslp-includes set directory for OpenSLP includes],
   73: +    CFLAGS="-I$withval $CFLAGS"
   74: +    CXXFLAGS="-I$withval $CXXFLAGS"
   75: +    CPPFLAGS="-I$withval $CPPFLAGS",)
   76: +
   77: +LIBSLP=""
   78: +SLPOBJ=""
   79: +
   80: +if test x$enable_slp != xno; then
   81: +    AC_CHECK_HEADER(slp.h,
   82: +        AC_CHECK_LIB(slp, SLPOpen,
   83: +	    AC_DEFINE(HAVE_LIBSLP, 1, [Define to 1 for SLP support])
   84: +	    SLPOBJ="srvreg.o srvloc.o"
   85: +            LIBSLP="-lslp"))
   86: +fi
   87: +
   88: +AC_SUBST(LIBSLP)
   89: +AC_SUBST(SLPOBJ)
   90: +
   91:  AC_CACHE_CHECK([for working socketpair],rsync_cv_HAVE_SOCKETPAIR,[
   92:  AC_RUN_IFELSE([AC_LANG_SOURCE([[
   93:  #include <sys/types.h>
   94: diff --git a/daemon-parm.txt b/daemon-parm.txt
   95: --- a/daemon-parm.txt
   96: +++ b/daemon-parm.txt
   97: @@ -10,8 +10,10 @@ STRING	socket_options		NULL
   98:  
   99:  INTEGER	listen_backlog		5
  100:  INTEGER	rsync_port|port		0
  101: +INTEGER	slp_refresh		0
  102:  
  103:  BOOL	proxy_protocol		False
  104: +BOOL	use_slp			False
  105:  
  106:  Locals: =================================================================
  107:  
  108: diff --git a/main.c b/main.c
  109: --- a/main.c
  110: +++ b/main.c
  111: @@ -1405,6 +1405,22 @@ static int start_client(int argc, char *argv[])
  112:  
  113:  	if (!read_batch) { /* for read_batch, NO source is specified */
  114:  		char *path = check_for_hostspec(argv[0], &shell_machine, &rsync_port);
  115: +
  116: +		if (shell_machine && !shell_machine[0]) {
  117: +#ifdef HAVE_LIBSLP
  118: +			/* User entered just rsync:// URI */
  119: +			if (lp_use_slp()) {
  120: +				print_service_list();
  121: +				exit_cleanup(0);
  122: +			}
  123: +			rprintf(FINFO, "SLP is disabled, cannot browse\n");
  124: +			exit_cleanup(RERR_SYNTAX);
  125: +#else /* No SLP, die here */
  126: +			rprintf(FINFO, "No SLP support, cannot browse\n");
  127: +			exit_cleanup(RERR_SYNTAX);
  128: +#endif
  129: +		}
  130: +
  131:  		if (path) { /* source is remote */
  132:  			char *dummy_host;
  133:  			int dummy_port = 0;
  134: diff --git a/rsync.1.md b/rsync.1.md
  135: --- a/rsync.1.md
  136: +++ b/rsync.1.md
  137: @@ -149,7 +149,19 @@ rsync daemon by leaving off the module name:
  138:  
  139:  >     rsync somehost.mydomain.com::
  140:  
  141: -See the following section for more details.
  142: +And, if Service Location Protocol is available, the following will list the
  143: +available rsync servers:
  144: +
  145: +>     rsync rsync://
  146: +
  147: +See the following section for even more usage details.
  148: +
  149: +One more thing, if Service Location Protocol is available, the following will
  150: +list the available rsync servers:
  151: +
  152: +>     rsync rsync://
  153: +
  154: +See the following section for even more usage details.
  155:  
  156:  # ADVANCED USAGE
  157:  
  158: diff --git a/rsync.h b/rsync.h
  159: --- a/rsync.h
  160: +++ b/rsync.h
  161: @@ -224,6 +224,10 @@
  162:  #define SIGNIFICANT_ITEM_FLAGS (~(\
  163:  	ITEM_BASIS_TYPE_FOLLOWS | ITEM_XNAME_FOLLOWS | ITEM_LOCAL_CHANGE))
  164:  
  165: +/* this is the minimum we'll use, irrespective of config setting */
  166: +/* definitely don't set to less than about 30 seconds */
  167: +#define SLP_MIN_TIMEOUT 120
  168: +
  169:  #define CFN_KEEP_DOT_DIRS (1<<0)
  170:  #define CFN_KEEP_TRAILING_SLASH (1<<1)
  171:  #define CFN_DROP_TRAILING_DOT_DIR (1<<2)
  172: diff --git a/rsyncd.conf b/rsyncd.conf
  173: new file mode 100644
  174: --- /dev/null
  175: +++ b/rsyncd.conf
  176: @@ -0,0 +1 @@
  177: +slp refresh = 300
  178: diff --git a/rsyncd.conf.5.md b/rsyncd.conf.5.md
  179: --- a/rsyncd.conf.5.md
  180: +++ b/rsyncd.conf.5.md
  181: @@ -136,6 +136,21 @@ a literal % into a value is to use %%.
  182:      You can override the default backlog value when the daemon listens for
  183:      connections.  It defaults to 5.
  184:  
  185: +0.  `use slp`
  186: +
  187: +    You can enable Service Location Protocol support by enabling this global
  188: +    parameter.  The default is "false".
  189: +
  190: +0.  `slp refresh`
  191: +
  192: +    This parameter is used to determine how long service advertisements are
  193: +    valid (measured in seconds), and is only applicable if you have Service
  194: +    Location Protocol support compiled in. If this is not set or is set to
  195: +    zero, then service advertisements never time out. If this is set to less
  196: +    than 120 seconds, then 120 seconds is used. If it is set to more than
  197: +    65535, then 65535 is used (which is a limitation of SLP).  Using 3600
  198: +    (one hour) is a good number if you tend to change your configuration.
  199: +
  200:  # MODULE PARAMETERS
  201:  
  202:  After the global parameters you should define a number of modules, each module
  203: @@ -1168,6 +1183,7 @@ A more sophisticated example would be:
  204:  > max connections = 4
  205:  > syslog facility = local5
  206:  > pid file = /var/run/rsyncd.pid
  207: +> slp refresh = 3600
  208:  >
  209:  > [ftp]
  210:  >         path = /var/ftp/./pub
  211: diff --git a/socket.c b/socket.c
  212: --- a/socket.c
  213: +++ b/socket.c
  214: @@ -534,6 +534,16 @@ void start_accept_loop(int port, int (*fn)(int, int))
  215:  {
  216:  	fd_set deffds;
  217:  	int *sp, maxfd, i;
  218: +#ifdef HAVE_LIBSLP
  219: +	time_t next_slp_refresh;
  220: +	short slp_timeout = lp_use_slp() ? lp_slp_refresh() : 0;
  221: +	if (slp_timeout) {
  222: +		if (slp_timeout < SLP_MIN_TIMEOUT)
  223: +			slp_timeout = SLP_MIN_TIMEOUT;
  224: +		/* re-register before slp times out */
  225: +		slp_timeout -= 15;
  226: +	}
  227: +#endif
  228:  
  229:  #ifdef HAVE_SIGACTION
  230:  	sigact.sa_flags = SA_NOCLDSTOP;
  231: @@ -561,14 +571,25 @@ void start_accept_loop(int port, int (*fn)(int, int))
  232:  			maxfd = sp[i];
  233:  	}
  234:  
  235: +#ifdef HAVE_LIBSLP
  236: +	next_slp_refresh = time(NULL) + slp_timeout;
  237: +#endif
  238: +
  239:  	/* now accept incoming connections - forking a new process
  240:  	 * for each incoming connection */
  241:  	while (1) {
  242:  		fd_set fds;
  243:  		pid_t pid;
  244:  		int fd;
  245: +		int sel_ret;
  246:  		struct sockaddr_storage addr;
  247:  		socklen_t addrlen = sizeof addr;
  248: +#ifdef HAVE_LIBSLP
  249: +		struct timeval slp_tv;
  250: +
  251: +		slp_tv.tv_sec = 10;
  252: +		slp_tv.tv_usec = 0;
  253: +#endif
  254:  
  255:  		/* close log file before the potentially very long select so
  256:  		 * file can be trimmed by another process instead of growing
  257: @@ -581,7 +602,18 @@ void start_accept_loop(int port, int (*fn)(int, int))
  258:  		fds = deffds;
  259:  #endif
  260:  
  261: -		if (select(maxfd + 1, &fds, NULL, NULL, NULL) < 1)
  262: +#ifdef HAVE_LIBSLP
  263: +		sel_ret = select(maxfd + 1, &fds, NULL, NULL,
  264: +				 slp_timeout ? &slp_tv : NULL);
  265: +		if (sel_ret == 0 && slp_timeout && time(NULL) > next_slp_refresh) {
  266: +			rprintf(FINFO, "Service registration expired, refreshing it\n");
  267: +			register_services();
  268: +			next_slp_refresh = time(NULL) + slp_timeout;
  269: +		}
  270: +#else
  271: +		sel_ret = select(maxfd + 1, &fds, NULL, NULL, NULL);
  272: +#endif
  273: +		if (sel_ret < 1)
  274:  			continue;
  275:  
  276:  		for (i = 0, fd = -1; sp[i] >= 0; i++) {
  277: diff --git a/srvloc.c b/srvloc.c
  278: new file mode 100644
  279: --- /dev/null
  280: +++ b/srvloc.c
  281: @@ -0,0 +1,103 @@
  282: +/* -*- c-file-style: "linux"; -*-
  283: +
  284: +   Copyright (C) 2002 by Brad Hards <bradh@frogmouth.net>
  285: +
  286: +   This program is free software; you can redistribute it and/or modify
  287: +   it under the terms of the GNU General Public License as published by
  288: +   the Free Software Foundation; either version 2 of the License, or
  289: +   (at your option) any later version.
  290: +
  291: +   This program is distributed in the hope that it will be useful,
  292: +   but WITHOUT ANY WARRANTY; without even the implied warranty of
  293: +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  294: +   GNU General Public License for more details.
  295: +
  296: +   You should have received a copy of the GNU General Public License
  297: +   along with this program; if not, write to the Free Software
  298: +   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  299: +*/
  300: +
  301: +/* This file implements the service location functionality */
  302: +/* Basically, it uses normal Service Location Protocol API */
  303: +
  304: +/* It is really a cheap hack - just to show how it might work
  305: +   in a real application.
  306: +*/
  307: +
  308: +#include "rsync.h"
  309: +
  310: +#include <slp.h>
  311: +#include <stdio.h>
  312: +#include <string.h>
  313: +
  314: +/* This one just prints out the attributes */
  315: +static SLPBoolean getAttrCallback(UNUSED(SLPHandle hslp), const char *attrlist,
  316: +				  SLPError errcode, UNUSED(void *cookie))
  317: +{
  318: +	char *cleanstr;
  319: +
  320: +	if (errcode == SLP_OK) {
  321: +		if (!strcmp(attrlist, "(comment=)"))
  322: +			rprintf(FINFO, "\t(No description)\n");
  323: +		else {
  324: +			cleanstr = strrchr(attrlist, ')') ;
  325: +			*cleanstr = ' '; /* remove last ')' */
  326: +			rprintf(FINFO, "\t%s\n", strchr(attrlist, '=') + 1);
  327: +		}
  328: +	}
  329: +	return SLP_FALSE;
  330: +}
  331: +
  332: +static SLPBoolean getSLPSrvURLCallback(UNUSED(SLPHandle hslp),
  333: +			const char *srvurl, UNUSED(unsigned short lifetime),
  334: +			SLPError errcode, void *cookie)
  335: +{
  336: +	SLPError    result;
  337: +	SLPHandle   attrhslp;
  338: +
  339: +	if (errcode == SLP_OK) {
  340: +		/* chop service: off the front */
  341: +		rprintf(FINFO, "  %s  ", (strchr(srvurl, ':') + 1));
  342: +		/* check for any attributes */
  343: +		if (SLPOpen("en", SLP_FALSE,&attrhslp) == SLP_OK) {
  344: +			result = SLPFindAttrs(attrhslp, srvurl,
  345: +					      "", /* return all attributes */
  346: +					      "", /* use configured scopes */
  347: +					      getAttrCallback, NULL);
  348: +			if (result != SLP_OK) {
  349: +				rprintf(FERROR, "errorcode: %i\n",result);
  350: +			}
  351: +			SLPClose(attrhslp);
  352: +		}
  353: +		*(SLPError*)cookie = SLP_OK;
  354: +	} else
  355: +		*(SLPError*)cookie = errcode;
  356: +
  357: +	/* Return SLP_TRUE because we want to be called again
  358: +	 * if more services were found. */
  359: +
  360: +	return SLP_TRUE;
  361: +}
  362: +
  363: +int print_service_list(void)
  364: +{
  365: +	SLPError err;
  366: +	SLPError callbackerr;
  367: +	SLPHandle hslp;
  368: +
  369: +	err = SLPOpen("en",SLP_FALSE,&hslp);
  370: +	if (err != SLP_OK) {
  371: +		rprintf(FERROR, "Error opening slp handle %i\n", err);
  372: +		return err;
  373: +	}
  374: +
  375: +	SLPFindSrvs(hslp, "rsync",
  376: +		    0, /* use configured scopes */
  377: +		    0, /* no attr filter        */
  378: +		    getSLPSrvURLCallback, &callbackerr);
  379: +
  380: +	/* Now that we're done using slp, close the slp handle */
  381: +	SLPClose(hslp);
  382: +
  383: +	return 0;
  384: +}
  385: diff --git a/srvreg.c b/srvreg.c
  386: new file mode 100644
  387: --- /dev/null
  388: +++ b/srvreg.c
  389: @@ -0,0 +1,128 @@
  390: +/* -*- c-file-style: "linux"; -*-
  391: +
  392: +   Copyright (C) 2002 by Brad Hards <bradh@frogmouth.net>
  393: +
  394: +   This program is free software; you can redistribute it and/or modify
  395: +   it under the terms of the GNU General Public License as published by
  396: +   the Free Software Foundation; either version 2 of the License, or
  397: +   (at your option) any later version.
  398: +
  399: +   This program is distributed in the hope that it will be useful,
  400: +   but WITHOUT ANY WARRANTY; without even the implied warranty of
  401: +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  402: +   GNU General Public License for more details.
  403: +
  404: +   You should have received a copy of the GNU General Public License
  405: +   along with this program; if not, write to the Free Software
  406: +   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  407: +*/
  408: +
  409: +/* This file implements the service registration functionality */
  410: +
  411: +/* Basically, it uses normal Service Location Protocol API */
  412: +
  413: +#include "rsync.h"
  414: +#include "slp.h"
  415: +#include "netdb.h"
  416: +
  417: +extern int rsync_port;
  418: +
  419: +static void slp_callback(UNUSED(SLPHandle hslp), SLPError errcode, void *cookie)
  420: +{
  421: +	/* return the error code in the cookie */
  422: +	*(SLPError*)cookie = errcode;
  423: +
  424: +	/* You could do something else here like print out
  425: +	 * the errcode, etc.  Remember, as a general rule,
  426: +	 * do not try to do too much in a callback because
  427: +	 * it is being executed by the same thread that is
  428: +	 * reading slp packets from the wire. */
  429: +}
  430: +
  431: +int register_services(void)
  432: +{
  433: +	SLPError err, callbackerr;
  434: +	SLPHandle hslp;
  435: +	int n;
  436: +	int i;
  437: +	char srv[120];
  438: +	char attr[120];
  439: +	char localhost[256];
  440: +	extern char *config_file;
  441: +	short timeout;
  442: +	struct addrinfo aih, *ai = 0;
  443: +
  444: +	if (!lp_load(config_file, 0)) {
  445: +		exit_cleanup(RERR_SYNTAX);
  446: +	}
  447: +
  448: +	n = lp_num_modules();
  449: +
  450: +	if (0 == lp_slp_refresh())
  451: +		timeout = SLP_LIFETIME_MAXIMUM; /* don't expire, ever */
  452: +	else if (SLP_MIN_TIMEOUT > lp_slp_refresh())
  453: +		timeout = SLP_MIN_TIMEOUT; /* use a reasonable minimum */
  454: +	else if (SLP_LIFETIME_MAXIMUM <= lp_slp_refresh())
  455: +		timeout = (SLP_LIFETIME_MAXIMUM - 1); /* as long as possible */
  456: +	else
  457: +		timeout = lp_slp_refresh();
  458: +
  459: +	rprintf(FINFO, "rsyncd registering %d service%s with slpd for %d seconds:\n", n, ((n==1)? "":"s"), timeout);
  460: +	err = SLPOpen("en",SLP_FALSE,&hslp);
  461: +	if (err != SLP_OK) {
  462: +		rprintf(FINFO, "Error opening slp handle %i\n",err);
  463: +		return err;
  464: +	}
  465: +	if (gethostname(localhost, sizeof localhost)) {
  466: +	       rprintf(FINFO, "Could not get hostname: %s\n", strerror(errno));
  467: +	       return err;
  468: +	}
  469: +	memset(&aih, 0, sizeof aih);
  470: +	aih.ai_family = PF_UNSPEC;
  471: +	aih.ai_flags = AI_CANONNAME;
  472: +	if (0 != (err = getaddrinfo(localhost, 0, &aih, &ai)) || !ai) {
  473: +	       rprintf(FINFO, "Could not resolve hostname: %s\n", gai_strerror(err));
  474: +	       return err;
  475: +	}
  476: +	/* Register each service with SLP */
  477: +	for (i = 0; i < n; i++) {
  478: +		if (!lp_list(i))
  479: +			continue;
  480: +
  481: +		snprintf(srv, sizeof srv, "service:rsync://%s:%d/%s",
  482: +			 ai->ai_canonname,
  483: +			 rsync_port,
  484: +			 lp_name(i));
  485: +		rprintf(FINFO, "    %s\n", srv);
  486: +		if (lp_comment(i)) {
  487: +			snprintf(attr, sizeof attr, "(comment=%s)",
  488: +				 lp_comment(i));
  489: +		}
  490: +		err = SLPReg(hslp,
  491: +			     srv, /* service to register */
  492: +			     timeout,
  493: +			     0,  /* this is ignored */
  494: +			     attr, /* attributes */
  495: +			     SLP_TRUE, /* new registration - don't change this */
  496: +			     slp_callback, /* callback */
  497: +			     &callbackerr);
  498: +
  499: +		/* err may contain an error code that occurred as the slp library
  500: +		 * _prepared_ to make the call. */
  501: +		if (err != SLP_OK || callbackerr != SLP_OK)
  502: +			rprintf(FINFO, "Error registering service with slp %i\n", err);
  503: +
  504: +		/* callbackerr may contain an error code (that was assigned through
  505: +		 * the callback cookie) that occurred as slp packets were sent on
  506: +		 * the wire. */
  507: +		if (callbackerr != SLP_OK)
  508: +			rprintf(FINFO, "Error registering service with slp %i\n",callbackerr);
  509: +	}
  510: +
  511: +	/* Now that we're done using slp, close the slp handle */
  512: +	freeaddrinfo(ai);
  513: +	SLPClose(hslp);
  514: +
  515: +	/* refresh is done in main select loop */
  516: +	return 0;
  517: +}
  518: diff --git a/usage.c b/usage.c
  519: --- a/usage.c
  520: +++ b/usage.c
  521: @@ -131,6 +131,11 @@ static void print_info_flags(enum logcode f)
  522:  #endif
  523:  			"crtimes",
  524:  
  525: +#ifndef HAVE_LIBSLP
  526: +		"no "
  527: +#endif
  528: +			"SLP",
  529: +
  530:  	"*Optimizations",
  531:  
  532:  #ifndef HAVE_SIMD
  533: diff -Nurp a/config.h.in b/config.h.in
  534: --- a/config.h.in
  535: +++ b/config.h.in
  536: @@ -243,6 +243,9 @@
  537:  /* Define to 1 if you have the `sec' library (-lsec). */
  538:  #undef HAVE_LIBSEC
  539:  
  540: +/* Define to 1 for SLP support */
  541: +#undef HAVE_LIBSLP
  542: +
  543:  /* Define to 1 if you have the `socket' library (-lsocket). */
  544:  #undef HAVE_LIBSOCKET
  545:  
  546: diff -Nurp a/configure.sh b/configure.sh
  547: --- a/configure.sh
  548: +++ b/configure.sh
  549: @@ -631,6 +631,8 @@ BUILD_POPT
  550:  CC_SHOBJ_FLAG
  551:  OBJ_RESTORE
  552:  OBJ_SAVE
  553: +SLPOBJ
  554: +LIBSLP
  555:  ALLOCA
  556:  LIBOBJS
  557:  ASM
  558: @@ -731,6 +733,9 @@ enable_zstd
  559:  enable_lz4
  560:  enable_iconv_open
  561:  enable_iconv
  562: +enable_slp
  563: +with_openslp_libs
  564: +with_openslp_includes
  565:  enable_acl_support
  566:  enable_xattr_support
  567:  '
  568: @@ -1386,6 +1391,7 @@ Optional Features:
  569:    --disable-lz4           disable LZ4 compression
  570:    --disable-iconv-open    disable all use of iconv_open() function
  571:    --disable-iconv         disable rsync's --iconv option
  572: +  --disable-slp           turn off SLP support, defaults to on
  573:    --disable-acl-support   disable ACL support
  574:    --disable-xattr-support disable extended attributes
  575:  
  576: @@ -1402,6 +1408,8 @@ Optional Packages:
  577:    --with-nobody-group=GROUP
  578:                            set the default unprivileged group (default nobody
  579:                            or nogroup)
  580: +  --with-openslp-libs     set directory for OpenSLP library
  581: +  --with-openslp-includes set directory for OpenSLP includes
  582:  
  583:  Some influential environment variables:
  584:    CC          C compiler command
  585: @@ -9146,6 +9154,85 @@ $as_echo "#define CAN_HARDLINK_SPECIAL 1
  586:  
  587:  fi
  588:  
  589: +# Check whether --enable-slp was given.
  590: +if test "${enable_slp+set}" = set; then :
  591: +  enableval=$enable_slp;
  592: +fi
  593: +
  594: +
  595: +# Check whether --with-openslp-libs was given.
  596: +if test "${with_openslp_libs+set}" = set; then :
  597: +  withval=$with_openslp_libs; LDFLAGS="-L$withval $LDFLAGS"
  598: +    DSOFLAGS="-L$withval $DSOFLAGS"
  599: +fi
  600: +
  601: +
  602: +# Check whether --with-openslp-includes was given.
  603: +if test "${with_openslp_includes+set}" = set; then :
  604: +  withval=$with_openslp_includes; CFLAGS="-I$withval $CFLAGS"
  605: +    CXXFLAGS="-I$withval $CXXFLAGS"
  606: +    CPPFLAGS="-I$withval $CPPFLAGS"
  607: +fi
  608: +
  609: +
  610: +LIBSLP=""
  611: +SLPOBJ=""
  612: +
  613: +if test x$enable_slp != xno; then
  614: +    ac_fn_c_check_header_mongrel "$LINENO" "slp.h" "ac_cv_header_slp_h" "$ac_includes_default"
  615: +if test "x$ac_cv_header_slp_h" = xyes; then :
  616: +  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SLPOpen in -lslp" >&5
  617: +$as_echo_n "checking for SLPOpen in -lslp... " >&6; }
  618: +if ${ac_cv_lib_slp_SLPOpen+:} false; then :
  619: +  $as_echo_n "(cached) " >&6
  620: +else
  621: +  ac_check_lib_save_LIBS=$LIBS
  622: +LIBS="-lslp  $LIBS"
  623: +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
  624: +/* end confdefs.h.  */
  625: +
  626: +/* Override any GCC internal prototype to avoid an error.
  627: +   Use char because int might match the return type of a GCC
  628: +   builtin and then its argument prototype would still apply.  */
  629: +#ifdef __cplusplus
  630: +extern "C"
  631: +#endif
  632: +char SLPOpen ();
  633: +int
  634: +main ()
  635: +{
  636: +return SLPOpen ();
  637: +  ;
  638: +  return 0;
  639: +}
  640: +_ACEOF
  641: +if ac_fn_c_try_link "$LINENO"; then :
  642: +  ac_cv_lib_slp_SLPOpen=yes
  643: +else
  644: +  ac_cv_lib_slp_SLPOpen=no
  645: +fi
  646: +rm -f core conftest.err conftest.$ac_objext \
  647: +    conftest$ac_exeext conftest.$ac_ext
  648: +LIBS=$ac_check_lib_save_LIBS
  649: +fi
  650: +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_slp_SLPOpen" >&5
  651: +$as_echo "$ac_cv_lib_slp_SLPOpen" >&6; }
  652: +if test "x$ac_cv_lib_slp_SLPOpen" = xyes; then :
  653: +
  654: +$as_echo "#define HAVE_LIBSLP 1" >>confdefs.h
  655: +
  656: +	    SLPOBJ="srvreg.o srvloc.o"
  657: +            LIBSLP="-lslp"
  658: +fi
  659: +
  660: +fi
  661: +
  662: +
  663: +fi
  664: +
  665: +
  666: +
  667: +
  668:  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working socketpair" >&5
  669:  $as_echo_n "checking for working socketpair... " >&6; }
  670:  if ${rsync_cv_HAVE_SOCKETPAIR+:} false; then :
  671: diff -Nurp a/rsync.1 b/rsync.1
  672: --- a/rsync.1
  673: +++ b/rsync.1
  674: @@ -182,7 +182,27 @@ rsync somehost.mydomain.com::
  675:  .fi
  676:  .RE
  677:  .P
  678: -See the following section for more details.
  679: +And, if Service Location Protocol is available, the following will list the
  680: +available rsync servers:
  681: +.RS 4
  682: +.P
  683: +.nf
  684: +rsync rsync://
  685: +.fi
  686: +.RE
  687: +.P
  688: +See the following section for even more usage details.
  689: +.P
  690: +One more thing, if Service Location Protocol is available, the following will
  691: +list the available rsync servers:
  692: +.RS 4
  693: +.P
  694: +.nf
  695: +rsync rsync://
  696: +.fi
  697: +.RE
  698: +.P
  699: +See the following section for even more usage details.
  700:  .P
  701:  .SH "ADVANCED USAGE"
  702:  .P
  703: diff -Nurp a/rsync.1.html b/rsync.1.html
  704: --- a/rsync.1.html
  705: +++ b/rsync.1.html
  706: @@ -160,7 +160,20 @@ rsync daemon by leaving off the module n
  707:  <pre><code>rsync somehost.mydomain.com::
  708:  </code></pre>
  709:  </blockquote>
  710: -<p>See the following section for more details.</p>
  711: +<p>And, if Service Location Protocol is available, the following will list the
  712: +available rsync servers:</p>
  713: +<blockquote>
  714: +<pre><code>rsync rsync://
  715: +</code></pre>
  716: +</blockquote>
  717: +<p>See the following section for even more usage details.</p>
  718: +<p>One more thing, if Service Location Protocol is available, the following will
  719: +list the available rsync servers:</p>
  720: +<blockquote>
  721: +<pre><code>rsync rsync://
  722: +</code></pre>
  723: +</blockquote>
  724: +<p>See the following section for even more usage details.</p>
  725:  <h1>ADVANCED USAGE</h1>
  726:  <p>The syntax for requesting multiple files from a remote host is done by
  727:  specifying additional remote-host args in the same style as the first, or with
  728: diff -Nurp a/rsyncd.conf.5 b/rsyncd.conf.5
  729: --- a/rsyncd.conf.5
  730: +++ b/rsyncd.conf.5
  731: @@ -132,6 +132,17 @@ can also be specified via the \fB\-\-soc
  732:  .IP "\fBlisten\ backlog\fP"
  733:  You can override the default backlog value when the daemon listens for
  734:  connections.  It defaults to 5.
  735: +.IP "\fBuse\ slp\fP"
  736: +You can enable Service Location Protocol support by enabling this global
  737: +parameter.  The default is "false".
  738: +.IP "\fBslp\ refresh\fP"
  739: +This parameter is used to determine how long service advertisements are
  740: +valid (measured in seconds), and is only applicable if you have Service
  741: +Location Protocol support compiled in. If this is not set or is set to
  742: +zero, then service advertisements never time out. If this is set to less
  743: +than 120 seconds, then 120 seconds is used. If it is set to more than
  744: +65535, then 65535 is used (which is a limitation of SLP).  Using 3600
  745: +(one hour) is a good number if you tend to change your configuration.
  746:  .P
  747:  .SH "MODULE PARAMETERS"
  748:  .P
  749: @@ -1198,6 +1209,7 @@ use chroot = yes
  750:  max connections = 4
  751:  syslog facility = local5
  752:  pid file = /var/run/rsyncd.pid
  753: +slp refresh = 3600
  754:  
  755:  [ftp]
  756:          path = /var/ftp/./pub
  757: diff -Nurp a/rsyncd.conf.5.html b/rsyncd.conf.5.html
  758: --- a/rsyncd.conf.5.html
  759: +++ b/rsyncd.conf.5.html
  760: @@ -140,6 +140,21 @@ can also be specified via the <code>--so
  761:  <p>You can override the default backlog value when the daemon listens for
  762:  connections.  It defaults to 5.</p>
  763:  </dd>
  764: +
  765: +<dt><code>use slp</code></dt><dd>
  766: +<p>You can enable Service Location Protocol support by enabling this global
  767: +parameter.  The default is &quot;false&quot;.</p>
  768: +</dd>
  769: +
  770: +<dt><code>slp refresh</code></dt><dd>
  771: +<p>This parameter is used to determine how long service advertisements are
  772: +valid (measured in seconds), and is only applicable if you have Service
  773: +Location Protocol support compiled in. If this is not set or is set to
  774: +zero, then service advertisements never time out. If this is set to less
  775: +than 120 seconds, then 120 seconds is used. If it is set to more than
  776: +65535, then 65535 is used (which is a limitation of SLP).  Using 3600
  777: +(one hour) is a good number if you tend to change your configuration.</p>
  778: +</dd>
  779:  </dl>
  780:  <h1>MODULE PARAMETERS</h1>
  781:  <p>After the global parameters you should define a number of modules, each module
  782: @@ -1113,6 +1128,7 @@ use chroot = yes
  783:  max connections = 4
  784:  syslog facility = local5
  785:  pid file = /var/run/rsyncd.pid
  786: +slp refresh = 3600
  787:  
  788:  [ftp]
  789:          path = /var/ftp/./pub

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>