X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fafp_options.c;h=705652a69d54ac379625c5b8aa09ea2f30ab00b2;hb=7db833b1021f3daa8e30966e6f025b2a894348dc;hp=e39bf3f7217985cd8babe174e8379a6d370666c7;hpb=a2ddc8384c1881c66db1fbba6698bfd09da84b64;p=netatalk.git diff --git a/etc/afpd/afp_options.c b/etc/afpd/afp_options.c index e39bf3f7..705652a6 100644 --- a/etc/afpd/afp_options.c +++ b/etc/afpd/afp_options.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "status.h" #include "auth.h" @@ -46,6 +47,8 @@ /* get rid of any allocated afp_option buffers. */ void afp_options_free(struct afp_options *opt) { + if (opt->hostname) + free(opt->hostname); if (opt->adminauthuser) free(opt->adminauthuser); if (opt->configfile) @@ -54,8 +57,8 @@ void afp_options_free(struct afp_options *opt) free(opt->fqdn); if (opt->guest) free(opt->guest); - if (opt->ipaddr) - free(opt->ipaddr); + if (opt->listen) + free(opt->listen); if (opt->k5realm) free(opt->k5realm); if (opt->k5keytab) @@ -64,6 +67,8 @@ void afp_options_free(struct afp_options *opt) free(opt->k5service); if (opt->logconfig) free(opt->logconfig); + if (opt->logfile) + free(opt->logfile); if (opt->loginmesg) free(opt->loginmesg); if (opt->maccodepage) @@ -78,8 +83,6 @@ void afp_options_free(struct afp_options *opt) free(opt->passwdfile); if (opt->port) free(opt->port); - if (opt->server) - free(opt->server); if (opt->signatureopt) free(opt->signatureopt); if (opt->uamlist) @@ -93,42 +96,28 @@ void afp_options_free(struct afp_options *opt) #define MAXVAL 1024 int afp_config_parse(AFPObj *AFPObj) { + EC_INIT; dictionary *config; struct afp_options *options = &AFPObj->options; - int i; + int i, c; const char *p, *tmp; + char *q, *r; char val[MAXVAL]; - memset(options, 0, sizeof(struct afp_options)); - options->configfile = strdup(_PATH_CONFDIR "afp.conf"); + options->configfile = AFPObj->cmdlineconfigfile ? strdup(AFPObj->cmdlineconfigfile) : strdup(_PATH_CONFDIR "afp.conf"); options->sigconffile = strdup(_PATH_CONFDIR "afp_signature.conf"); options->uuidconf = strdup(_PATH_CONFDIR "afp_voluuid.conf"); - options->flags |= OPTION_ACL2MACCESS | OPTION_UUID | OPTION_SERVERNOTIF; - - while (EOF != (p = getopt(AFPObj->argc, AFPObj->argv, "dF:"))) { - switch (p) { - case 'd': - options->flags |= OPTION_DEBUG; - break; - case 'F': - if (options->configfile) - free(options->configfile); - options->configfile = strdup(optarg); - break; - default : - break; - } - } + options->flags = OPTION_ACL2MACCESS | OPTION_UUID | OPTION_SERVERNOTIF | AFPObj->cmdlineflags; if ((config = iniparser_load(AFPObj->options.configfile)) == NULL) return -1; AFPObj->iniconfig = config; /* [Global] */ - options->logconfig = iniparser_getstring(config, INISEC_GLOBAL, "loglevel", "default:note"); - options->logfile = iniparser_getstring(config, INISEC_GLOBAL, "logfile", NULL); + options->logconfig = iniparser_getstrdup(config, INISEC_GLOBAL, "loglevel", "default:note"); + options->logfile = iniparser_getstrdup(config, INISEC_GLOBAL, "logfile", NULL); set_processname("afpd"); - setuplog(logconfig, logfile); + setuplog(options->logconfig, options->logfile); /* [AFP] "options" options wo values */ p = iniparser_getstring(config, INISEC_AFP, "options", ""); @@ -147,7 +136,7 @@ int afp_config_parse(AFPObj *AFPObj) options->flags &= ~OPTION_ACL2MACCESS; if (strstr(val, " keepsessions")) options->flags |= OPTION_KEEPSESSIONS; - if (strstr(val, " keepsessions")) + if (strstr(val, " closevol")) options->flags |= OPTION_CLOSEVOL; if (strstr(val, " client_polling")) options->flags &= ~OPTION_SERVERNOTIF; @@ -173,7 +162,6 @@ int afp_config_parse(AFPObj *AFPObj) options->k5realm = iniparser_getstrdup(config, INISEC_AFP, "k5realm", NULL); options->authprintdir = iniparser_getstrdup(config, INISEC_AFP, "authprintdir", NULL); options->listen = iniparser_getstrdup(config, INISEC_AFP, "listen", NULL); - options->hostname = iniparser_getstrdup(config, INISEC_AFP, "hostname", NULL); options->ntdomain = iniparser_getstrdup(config, INISEC_AFP, "ntdomain", NULL); options->ntseparator = iniparser_getstrdup(config, INISEC_AFP, "ntseparator", NULL); options->mimicmodel = iniparser_getstrdup(config, INISEC_AFP, "mimicmodel", NULL); @@ -190,8 +178,19 @@ int afp_config_parse(AFPObj *AFPObj) 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->disconnected = iniparser_getint (config, INISEC_AFP, "disconnect", 24) * 60 * 2; + if ((p = iniparser_getstring(config, INISEC_AFP, "hostname", NULL))) { + EC_NULL_LOG( options->hostname = strdup(p) ); + } else { + if (gethostname(val, sizeof(val)) < 0 ) { + perror( "gethostname" ); + EC_FAIL; + } + if ((q = strchr(val, '.'))) + *q = '\0'; + options->hostname = strdup(val); + } if ((p = iniparser_getstring(config, INISEC_AFP, "k5keytab", NULL))) { EC_NULL_LOG( options->k5keytab = malloc(strlen(p) + 14) ); @@ -207,45 +206,58 @@ int afp_config_parse(AFPObj *AFPObj) } #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); + q = iniparser_getstrdup(config, INISEC_AFP, "cnidserver", "localhost:4700"); + r = strrchr(q, ':'); + if (r) + *r = 0; + options->Cnid_srv = strdup(q); + if (r) + options->Cnid_port = strdup(r + 1); + else + options->Cnid_port = strdup("4700"); LOG(log_debug, logtype_afpd, "CNID Server: %s:%s", options->Cnid_srv, options->Cnid_port); + if (q) + free(q); - - if ((p = iniparser_getstring(config, INISEC_AFP, "fqdn", NULL))) { + if ((q = iniparser_getstrdup(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; + r = strchr(q, ':'); + if (r) + *r = '\0'; + if (gethostbyname(q)) { + if (r) + *r = ':'; + EC_NULL_LOG( options->fqdn = strdup(q) ); } else { LOG(log_error, logtype_afpd, "error parsing -fqdn, gethostbyname failed for: %s", c); } + free(q); } - p = iniparser_getstring(config, INISEC_AFP, "unixcodepage", "LOCALE"); - if ((options->unixcharset = add_charset(p)) == (charset_t)-1) { + if (!(p = iniparser_getstring(config, INISEC_AFP, "unixcodepage", NULL))) { options->unixcharset = CH_UNIX; - LOG(log_warning, logtype_afpd, "Setting Unix codepage to '%s' failed", p); + options->unixcodepage = strdup("LOCALE"); } else { - options->unixcodepage = strdup(p); + if ((options->unixcharset = add_charset(p)) == (charset_t)-1) { + options->unixcharset = CH_UNIX; + options->unixcodepage = strdup("LOCALE"); + 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) { + if (!(p = iniparser_getstring(config, INISEC_AFP, "maccodepage", NULL))) { options->maccharset = CH_MAC; - LOG(log_warning, logtype_afpd, "Setting Unix codepage to '%s' failed", p); + options->maccodepage = strdup("MAC_ROMAN"); } else { - options->maccharset = strdup(p); + if ((options->maccharset = add_charset(p)) == (charset_t)-1) { + options->maccharset = CH_MAC; + options->maccodepage = strdup("MAC_ROMAN"); + LOG(log_warning, logtype_afpd, "Setting Unix codepage to '%s' failed", p); + } else { + options->maccodepage = strdup(p); + } } if ((p = iniparser_getstring(config, INISEC_AFP, "fcelistener", NULL))) { @@ -275,7 +287,8 @@ int afp_config_parse(AFPObj *AFPObj) if (options->volnamelen > 255) options->volnamelen = 255; /* AFP3 spec */ - return 0; +EC_CLEANUP: + EC_EXIT; } /* @@ -404,16 +417,9 @@ 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( " afp_signature.conf:\t%s\n", _PATH_CONFDIR "afp_signature.conf"); + printf( " afp_voluuid.conf:\t%s\n", _PATH_CONFDIR "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); @@ -422,31 +428,24 @@ static void show_paths( void ) /* * 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) +void afp_options_parse_cmdline(AFPObj *obj, int ac, char **av) { - 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, "vVh" )) ) { + while (EOF != ( c = getopt( ac, av, "dFvVh" )) ) { switch ( c ) { + case 'd': + obj->cmdlineflags |= OPTION_DEBUG; + break; + case 'F': + obj->cmdlineconfigfile = strdup(optarg); + break; case 'v': /* version */ show_version( ); puts( "" ); show_paths( ); puts( "" ); @@ -458,7 +457,7 @@ int afp_options_parse_cmdline(int ac, char **av) exit( 0 ); break; case 'h': /* usage */ - show_usage( p ); + show_usage(); exit( 0 ); break; default : @@ -466,9 +465,9 @@ int afp_options_parse_cmdline(int ac, char **av) } } if ( err || optind != ac ) { - show_usage( p ); + show_usage(); exit( 2 ); } - return 1; + return; }