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>