Annotation of embedaddon/rsync/srvreg.c, revision 1.1
1.1 ! misho 1: /* -*- c-file-style: "linux"; -*-
! 2:
! 3: Copyright (C) 2002 by Brad Hards <bradh@frogmouth.net>
! 4:
! 5: This program is free software; you can redistribute it and/or modify
! 6: it under the terms of the GNU General Public License as published by
! 7: the Free Software Foundation; either version 2 of the License, or
! 8: (at your option) any later version.
! 9:
! 10: This program is distributed in the hope that it will be useful,
! 11: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 13: GNU General Public License for more details.
! 14:
! 15: You should have received a copy of the GNU General Public License
! 16: along with this program; if not, write to the Free Software
! 17: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
! 18: */
! 19:
! 20: /* This file implements the service registration functionality */
! 21:
! 22: /* Basically, it uses normal Service Location Protocol API */
! 23:
! 24: #include "rsync.h"
! 25: #include "slp.h"
! 26: #include "netdb.h"
! 27:
! 28: extern int rsync_port;
! 29:
! 30: static void slp_callback(UNUSED(SLPHandle hslp), SLPError errcode, void *cookie)
! 31: {
! 32: /* return the error code in the cookie */
! 33: *(SLPError*)cookie = errcode;
! 34:
! 35: /* You could do something else here like print out
! 36: * the errcode, etc. Remember, as a general rule,
! 37: * do not try to do too much in a callback because
! 38: * it is being executed by the same thread that is
! 39: * reading slp packets from the wire. */
! 40: }
! 41:
! 42: int register_services(void)
! 43: {
! 44: SLPError err, callbackerr;
! 45: SLPHandle hslp;
! 46: int n;
! 47: int i;
! 48: char srv[120];
! 49: char attr[120];
! 50: char localhost[256];
! 51: extern char *config_file;
! 52: short timeout;
! 53: struct addrinfo aih, *ai = 0;
! 54:
! 55: if (!lp_load(config_file, 0)) {
! 56: exit_cleanup(RERR_SYNTAX);
! 57: }
! 58:
! 59: n = lp_num_modules();
! 60:
! 61: if (0 == lp_slp_refresh())
! 62: timeout = SLP_LIFETIME_MAXIMUM; /* don't expire, ever */
! 63: else if (SLP_MIN_TIMEOUT > lp_slp_refresh())
! 64: timeout = SLP_MIN_TIMEOUT; /* use a reasonable minimum */
! 65: else if (SLP_LIFETIME_MAXIMUM <= lp_slp_refresh())
! 66: timeout = (SLP_LIFETIME_MAXIMUM - 1); /* as long as possible */
! 67: else
! 68: timeout = lp_slp_refresh();
! 69:
! 70: rprintf(FINFO, "rsyncd registering %d service%s with slpd for %d seconds:\n", n, ((n==1)? "":"s"), timeout);
! 71: err = SLPOpen("en",SLP_FALSE,&hslp);
! 72: if (err != SLP_OK) {
! 73: rprintf(FINFO, "Error opening slp handle %i\n",err);
! 74: return err;
! 75: }
! 76: if (gethostname(localhost, sizeof localhost)) {
! 77: rprintf(FINFO, "Could not get hostname: %s\n", strerror(errno));
! 78: return err;
! 79: }
! 80: memset(&aih, 0, sizeof aih);
! 81: aih.ai_family = PF_UNSPEC;
! 82: aih.ai_flags = AI_CANONNAME;
! 83: if (0 != (err = getaddrinfo(localhost, 0, &aih, &ai)) || !ai) {
! 84: rprintf(FINFO, "Could not resolve hostname: %s\n", gai_strerror(err));
! 85: return err;
! 86: }
! 87: /* Register each service with SLP */
! 88: for (i = 0; i < n; i++) {
! 89: if (!lp_list(i))
! 90: continue;
! 91:
! 92: snprintf(srv, sizeof srv, "service:rsync://%s:%d/%s",
! 93: ai->ai_canonname,
! 94: rsync_port,
! 95: lp_name(i));
! 96: rprintf(FINFO, " %s\n", srv);
! 97: if (lp_comment(i)) {
! 98: snprintf(attr, sizeof attr, "(comment=%s)",
! 99: lp_comment(i));
! 100: }
! 101: err = SLPReg(hslp,
! 102: srv, /* service to register */
! 103: timeout,
! 104: 0, /* this is ignored */
! 105: attr, /* attributes */
! 106: SLP_TRUE, /* new registration - don't change this */
! 107: slp_callback, /* callback */
! 108: &callbackerr);
! 109:
! 110: /* err may contain an error code that occurred as the slp library
! 111: * _prepared_ to make the call. */
! 112: if (err != SLP_OK || callbackerr != SLP_OK)
! 113: rprintf(FINFO, "Error registering service with slp %i\n", err);
! 114:
! 115: /* callbackerr may contain an error code (that was assigned through
! 116: * the callback cookie) that occurred as slp packets were sent on
! 117: * the wire. */
! 118: if (callbackerr != SLP_OK)
! 119: rprintf(FINFO, "Error registering service with slp %i\n",callbackerr);
! 120: }
! 121:
! 122: /* Now that we're done using slp, close the slp handle */
! 123: freeaddrinfo(ai);
! 124: SLPClose(hslp);
! 125:
! 126: /* refresh is done in main select loop */
! 127: return 0;
! 128: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>