]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/afp_options.c
New MySQL CNID backend
[netatalk.git] / etc / afpd / afp_options.c
index 65710c1082f91bd434f6b3c43c754c54ecedcb4b..f06bfb373665ca9bc4ff25c8be20501ceb04619e 100644 (file)
 #include <atalk/compat.h>
 #include <atalk/globals.h>
 #include <atalk/fce_api.h>
+#include <atalk/errchk.h>
 
 #include "status.h"
 #include "auth.h"
 #include "dircache.h"
 
-#define OPTIONS "dn:uc:g:P:ptS:L:F:U:hIvVm:"
 #define LENGTH 512
 
-/* initialize options */
-void afp_options_init(struct afp_options *options)
-{
-    memset(options, 0, sizeof(struct afp_options));
-
-    options->pidfile = _PATH_AFPDLOCK;
-    options->configfile = D_PATH_CONFDIR "afp.conf";
-    options->sigconffile = _PATH_AFPDSIGCONF;
-    options->uuidconf = _PATH_AFPDUUIDCONF;
-    options->server_notif = 1;
-    options->dsireadbuf = 12;
-}
-
-/* get rid of any allocated afp_option buffers. */
-void afp_options_free(struct afp_options *opt)
-{
-       if (opt->adminauthuser)
-        free(opt->adminauthuser);
-       if (opt->configfile)
-        free(opt->configfile);
-    if (opt->fqdn)
-        free(opt->fqdn);
-    if (opt->guest)
-        free(opt->guest);
-    if (opt->ipaddr)
-        free(opt->ipaddr);
-    if (opt->k5realm)
-        free(opt->k5realm);
-    if (opt->k5keytab)
-        free(opt->k5keytab);
-    if (opt->k5service)
-        free(opt->k5service);
-    if (opt->logconfig)
-        free(opt->logconfig);
-    if (opt->loginmesg)
-        free(opt->loginmesg);
-    if (opt->maccodepage)
-        free(opt->maccodepage);
-       if (opt->mimicmodel)
-        free(opt->mimicmodel);
-    if (opt->ntdomain)
-        free(opt->ntdomain);
-    if (opt->ntseparator)
-        free(opt->ntseparator);
-    if (opt->passwdfile)
-        free(opt->passwdfile);
-    if (opt->port)
-        free(opt->port);
-    if (opt->server)
-        free(opt->server);
-    if (opt->signatureopt)
-        free(opt->signatureopt);
-    if (opt->uamlist)
-        free(opt->uamlist);
-    if (opt->uampath)
-        free(opt->uampath);
-    if (opt->unixcodepage)
-        free(opt->unixcodepage);
-}
-
-void afp_options_duplicate(struct afp_options *options, const struct afp_options *soptions)
-{
-    memcpy(options, soptions, sizeof(struct afp_options));
-
-    options->pidfile = NULL;
-    options->uuidconf = NULL;
-
-    options->configfile = strdup(options->configfile);
-    options->guest = strdup(options->guest);
-    options->loginmesg = strdup(options->loginmesg);
-    options->maccodepage = strdup(options->maccodepage);
-    options->passwdfile = strdup(options->passwdfile);
-    options->sigconffile = strdup(options->sigconffile);
-    options->signatureopt = strdup(options->signatureopt);
-    options->uamlist = strdup(options->uamlist);
-    options->uampath = strdup(options->uampath);
-    options->unixcodepage = strdup(options->unixcodepage);
-}
-
-#define MAXVAL
-int afp_options_parse(AFPObj *AFPObj)
-{
-    dictionary *config = AFPObj->iniconfig;
-    struct afp_options *options = &AFPObj->options;
-    int i;
-    const char *p, *tmp;
-    char val[MAXVAL];
-
-    /* [Global] */
-
-    options->logconfig      = iniparser_getstring(config, INISEC_GLOBAL, "loglevel",       "default:note");
-    options->logfile        = iniparser_getstring(config, INISEC_GLOBAL, "logfile",        NULL);
-    setuplog(logconfig, logfile);
-
-    /* [AFP] "options" options wo values */
-    options->flags |= OPTION_ACL2MACCESS | OPTION_UUID;
-
-    p = iniparser_getstring(config, INISEC_AFP, "options", "");
-    strcpy(val, " ");
-    strlcat(val, p, MAXVAL);
-
-    if (strstr(val, " nozeroconf"))
-        options->flags |= OPTION_NOZEROCONF;
-    if (strstr(val, " icon"))
-        options->flags |= OPTION_CUSTOMICON;
-    if (strstr(val, " noicon"))
-        options->flags &= ~OPTION_CUSTOMICON;
-    if (strstr(val, " advertise_ssh"))
-        options->flags |= OPTION_ANNOUNCESSH;
-    if (strstr(val, " noacl2maccess"))
-        options->flags &= ~OPTION_ACL2MACCESS;
-    if (strstr(val, " keepsessions"))
-        options->flags |= OPTION_KEEPSESSIONS;
-    if (strstr(val, " keepsessions"))
-        options->flags |= OPTION_CLOSEVOL;
-    if (strstr(val, " nosavepassword"))
-        options->passwdbits |= PASSWD_NOSAVE;
-    if (strstr(val, " savepassword"))
-        options->passwdbits &= ~PASSWD_NOSAVE;
-    if (strstr(val, " nosetpassword"))
-        options->passwdbits &= ~PASSWD_SET;
-    if (strstr(val, " setpassword"))
-        options->passwdbits |= PASSWD_SET;
-    if (strstr(val, " client_polling"))
-        options->server_notif = 0;
-
-    /* figure out options w values */
-
-    options->loginmesg      = iniparser_getstring(config, INISEC_AFP, "loginmesg",      "");
-    options->guest          = iniparser_getstring(config, INISEC_AFP, "guestname",      "nobody");
-    options->passwdfile     = iniparser_getstring(config, INISEC_AFP, "passwdfile",     _PATH_AFPDPWFILE);
-    options->uampath        = iniparser_getstring(config, INISEC_AFP, "uampath",        _PATH_AFPDUAMPATH);
-    options->uamlist        = iniparser_getstring(config, INISEC_AFP, "uamlist",        "uams_dhx.so,uams_dhx2.so");
-    options->port           = iniparser_getstring(config, INISEC_AFP, "port",           "548");
-    options->signatureopt   = iniparser_getstring(config, INISEC_AFP, "signature",      "auto");
-
-    options->connections    = iniparser_getint   (config, INISEC_AFP, "maxcon",         200);
-    options->passwdminlen   = iniparser_getint   (config, INISEC_AFP, "passwdminlen",   0);
-    options->tickleval      = iniparser_getint   (config, INISEC_AFP, "tickleval",      30);
-    options->timeout        = iniparser_getint   (config, INISEC_AFP, "timeout",        4);
-    options->dsireadbuf     = iniparser_getint   (config, INISEC_AFP, "dsireadbuf",     12);
-    options->server_quantum = iniparser_getint   (config, INISEC_AFP, "server_quantum", DSI_SERVQUANT_DEF);
-    options->volnamelen     = iniparser_getint   (config, INISEC_AFP, "volnamelen",     80);
-    options->dircachesize   = iniparser_getint   (config, INISEC_AFP, "dircachesize",   DEFAULT_MAX_DIRCACHE_SIZE);
-    options->tcp_sndbuf     = iniparser_getint   (config, INISEC_AFP, "tcpsndbuf",      0);
-    options->tcp_rcvbuf     = iniparser_getint   (config, INISEC_AFP, "tcprcvbuf",      0);
-    options->fce_fmodwait   = iniparser_getint   (config, INISEC_AFP, "fceholdfmod",    60);
-    options->sleep          = iniparser_getint   (config, INISEC_AFP, "sleep",          10) * 60 * 2;
-    options->disconnect     = iniparser_getint   (config, INISEC_AFP, "disconnect"      24) * 60 * 2;
-
-    options->k5service      = iniparser_getstringdup(config, INISEC_AFP, "k5service", NULL);
-    options->k5realm        = iniparser_getstringdup(config, INISEC_AFP, "k5realm", NULL);
-    options->authprintdir   = iniparser_getstringdup(config, INISEC_AFP, "authprintdir", NULL);
-    options->ipaddr         = iniparser_getstringdup(config, INISEC_AFP, "ipaddr", NULL);
-    options->hostname       = iniparser_getstringdup(config, INISEC_AFP, "hostname", NULL);
-    options->ntdomain       = iniparser_getstringdup(config, INISEC_AFP, "ntdomain", NULL);
-    options->ntseparator    = iniparser_getstringdup(config, INISEC_AFP, "ntseparator", NULL);
-    options->mimicmodel     = iniparser_getstringdup(config, INISEC_AFP, "mimicmodel", NULL);
-    options->adminauthuser  = iniparser_getstringdup(config, INISEC_AFP, "adminauthuser", NULL);
-
-    if ((p = iniparser_getstring(config, INISEC_AFP, "k5keytab", NULL))) {
-        EC_NULL_LOG( options->k5keytab = malloc(strlen(p) + 14) );
-        snprintf(options->k5keytab, strlen(p) + 14, "KRB5_KTNAME=%s", p);
-        putenv(options->k5keytab);
-    }
-
-#ifdef ADMIN_GRP
-    if ((p = iniparser_getstring(config, INISEC_AFP, "admingroup",  NULL))) {
-         struct group *gr = getgrnam(p);
-         if (gr != NULL)
-             options->admingid = gr->gr_gid;
-    }
-#endif /* ADMIN_GRP */
-
-    p = iniparser_getstring(config, INISEC_AFP, "cnidserver", "localhost:4700");
-    tmp = strrchr(p, ':');
-    if (tmp)
-        *t = 0;
-    options->Cnid_srv = strdup(p);
-    if (tmp)
-        options->Cnid_port = strdup(tmp + 1);
-    LOG(log_debug, logtype_afpd, "CNID Server: %s:%s", options->Cnid_srv, options->Cnid_port);
-
-
-    if ((p = iniparser_getstring(config, INISEC_AFP, "fqdn", NULL))) {
-        /* do a little checking for the domain name. */
-        tmp = strchr(c, ':');
-        if (tmp)
-            *tmp = '\0';
-        if (gethostbyname(p)) {
-            if (tmp)
-                *tmp = ':';
-            if ((opt = strdup(p)))
-                options->fqdn = opt;
-        } else {
-            LOG(log_error, logtype_afpd, "error parsing -fqdn, gethostbyname failed for: %s", c);
-        }
-    }
-
-    p = iniparser_getstring(config, INISEC_AFP, "unixcodepage", "LOCALE");
-    if ((options->unixcharset = add_charset(p)) == (charset_t)-1) {
-        options->unixcharset = CH_UNIX;
-        LOG(log_warning, logtype_afpd, "Setting Unix codepage to '%s' failed", p);
-    } else {
-        options->unixcodepage = strdup(p);
-    }
-       
-    p = iniparser_getstring(config, INISEC_AFP, "maccodepage", "MAC_ROMAN");
-    if ((options->maccharset = add_charset(p)) == (charset_t)-1) {
-        options->maccharset = CH_MAC;
-        LOG(log_warning, logtype_afpd, "Setting Unix codepage to '%s' failed", p);
-    } else {
-        options->maccharset = strdup(p);
-    }
-
-    if ((p = iniparser_getstring(config, INISEC_AFP, "fcelistener", NULL))) {
-               LOG(log_note, logtype_afpd, "Adding FCE listener: %s", p);
-               fce_add_udp_socket(p);
-    }
-    if ((p = iniparser_getstring(config, INISEC_AFP, "fcecoalesce", NULL))) {
-               LOG(log_note, logtype_afpd, "Fce coalesce: %s", p);
-               fce_set_coalesce(p);
-    }
-    if ((p = iniparser_getstring(config, INISEC_AFP, "fceevents", NULL))) {
-               LOG(log_note, logtype_afpd, "Fce events: %s", p);
-               fce_set_events(p);
-    }
-
-    /* Check for sane values */
-    if (options->tickleval <= 0)
-        options->tickleval = 30;
-    if (options->timeout <= 0)
-        options->timeout = 4;
-    if (options->sleep <= 4)
-        options->disconnected = options->sleep = 4;
-    if (options->dsireadbuf < 6)
-        options->dsireadbuf = 6;
-    if (options->volnamelen < 8)
-        options->volnamelen = 8; /* max mangled volname "???#FFFF" */
-    if (options->volnamelen > 255)
-           options->volnamelen = 255; /* AFP3 spec */
-
-    return 1;
-}
-
 /*
  * Show version information about afpd.
  * Used by "afp -v".
@@ -338,6 +93,9 @@ static void show_version( void )
 #endif
 #ifdef CNID_BACKEND_TDB
        printf( "tdb " );
+#endif
+#ifdef CNID_BACKEND_MYSQL
+       printf( "mysql " );
 #endif
        puts( "" );
 }
@@ -351,8 +109,10 @@ static void show_version_extended(void )
        show_version( );
 
        printf( "      Zeroconf support:\t" );
-#ifdef USE_ZEROCONF
-       puts( "Yes" );
+#if defined (HAVE_MDNS)
+       puts( "mDNSResponder" );
+#elif defined (HAVE_AVAHI)
+       puts( "Avahi" );
 #else
        puts( "No" );
 #endif
@@ -408,6 +168,20 @@ static void show_version_extended(void )
 #else
        puts( "No" );
 #endif
+
+       printf( "         D-Bus support:\t" );
+#ifdef HAVE_DBUS_GLIB
+       puts( "Yes" );
+#else
+       puts( "No" );
+#endif
+
+       printf( "         DTrace probes:\t" );
+#ifdef WITH_DTRACE
+       puts( "Yes" );
+#else
+       puts( "No" );
+#endif
 }
 
 /*
@@ -415,57 +189,35 @@ static void show_version_extended(void )
  */
 static void show_paths( void )
 {
-       printf( "             afpd.conf:\t%s\n", _PATH_AFPDCONF );
-       printf( "   AppleVolumes.system:\t%s\n", _PATH_AFPDSYSVOL );
-       printf( "  AppleVolumes.default:\t%s\n", _PATH_AFPDDEFVOL );
-       printf( "    afp_signature.conf:\t%s\n", _PATH_AFPDSIGCONF );
-       printf( "      afp_voluuid.conf:\t%s\n", _PATH_AFPDUUIDCONF );
-#ifdef HAVE_LDAP
-       printf( "         afp_ldap.conf:\t%s\n", _PATH_ACL_LDAPCONF );
-#else
-       printf( "         afp_ldap.conf:\tnot supported\n");
-#endif
+       printf( "              afp.conf:\t%s\n", _PATH_CONFDIR "afp.conf");
+       printf( "           extmap.conf:\t%s\n", _PATH_CONFDIR "extmap.conf");
+       printf( "       state directory:\t%s\n", _PATH_STATEDIR);
+       printf( "    afp_signature.conf:\t%s\n", _PATH_STATEDIR "afp_signature.conf");
+       printf( "      afp_voluuid.conf:\t%s\n", _PATH_STATEDIR "afp_voluuid.conf");
        printf( "       UAM search path:\t%s\n", _PATH_AFPDUAMPATH );
        printf( "  Server messages path:\t%s\n", SERVERTEXT);
-       printf( "              lockfile:\t%s\n", _PATH_AFPDLOCK);
 }
 
 /*
  * Display usage information about afpd.
  */
-static void show_usage( char *name )
+static void show_usage(void)
 {
-       fprintf( stderr, "Usage:\t%s [-duptDTI] [-n nbpname]\n", name );
-       fprintf( stderr, "\t     [-c maxconnections] [-g guest] [-P pidfile] [-S port] [-L message]\n" );
-       fprintf( stderr, "\t     [-F configfile] [-U uams] [-m umask]\n" );
-       fprintf( stderr, "\t%s -h|-v|-V\n", name );
+       fprintf( stderr, "Usage:\tafpd [-d] [-F configfile]\n");
+       fprintf( stderr, "\tafpd -h|-v|-V\n");
 }
 
-int afp_options_parse_cmdline(int ac, char **av, struct afp_options *options)
+void afp_options_parse_cmdline(AFPObj *obj, int ac, char **av)
 {
-    extern char *optarg;
-    extern int optind;
-
-    char *p;
-    char *tmp; /* Used for error checking the result of strtol */
     int c, err = 0;
-    char buf[1024];
-
-    if (gethostname(buf, sizeof(buf)) < 0 ) {
-        perror( "gethostname" );
-        return 0;
-    }
-    if (NULL != (p = strchr(buf, '.')))
-        *p = '\0';
-    options->hostname = strdup(buf);
 
-    while (EOF != ( c = getopt( ac, av, OPTIONS )) ) {
+    while (EOF != ( c = getopt( ac, av, "dF:vVh" )) ) {
         switch ( c ) {
-        case 'd' :
-            options->flags |= OPTION_DEBUG;
+        case 'd':
+            obj->cmdlineflags |= OPTION_DEBUG;
             break;
         case 'F':
-            options->configfile = optarg;
+            obj->cmdlineconfigfile = strdup(optarg);
             break;
         case 'v':      /* version */
             show_version( ); puts( "" );
@@ -478,7 +230,7 @@ int afp_options_parse_cmdline(int ac, char **av, struct afp_options *options)
             exit( 0 );
             break;
         case 'h':      /* usage */
-            show_usage( p );
+            show_usage();
             exit( 0 );
             break;
         default :
@@ -486,9 +238,9 @@ int afp_options_parse_cmdline(int ac, char **av, struct afp_options *options)
         }
     }
     if ( err || optind != ac ) {
-        show_usage( p );
+        show_usage();
         exit( 2 );
     }
 
-    return 1;
+    return;
 }