int main(int argc, char *argv[]) { set_processname("logger_Test"); #if 0 LOG(log_severe, logtype_logger, "Logging Test starting: this should only log to syslog"); /* syslog testing */ LOG(log_severe, logtype_logger, "Disabling syslog logging."); unsetuplog("Default"); LOG(log_error, logtype_default, "This shouldn't log to syslog: LOG(log_error, logtype_default)."); LOG(log_error, logtype_logger, "This shouldn't log to syslog: LOG(log_error, logtype_logger)."); setuplog("Default LOG_INFO"); LOG(log_info, logtype_logger, "Set syslog logging to 'log_info', so this should log again. LOG(log_info, logtype_logger)."); LOG(log_error, logtype_logger, "This should log to syslog: LOG(log_error, logtype_logger)."); LOG(log_error, logtype_default, "This should log to syslog. LOG(log_error, logtype_default)."); LOG(log_debug, logtype_logger, "This shouldn't log to syslog. LOG(log_debug, logtype_logger)."); LOG(log_debug, logtype_default, "This shouldn't log to syslog. LOG(log_debug, logtype_default)."); LOG(log_severe, logtype_logger, "Disabling syslog logging."); unsetuplog("Default"); #endif /* filelog testing */ setuplog("DSI:maxdebug", "test.log"); LOG(log_info, logtype_dsi, "This should log."); LOG(log_error, logtype_default, "This should not log."); setuplog("Default:debug", "test.log"); LOG(log_debug, logtype_default, "This should log."); LOG(log_maxdebug, logtype_default, "This should not log."); LOG(log_maxdebug, logtype_dsi, "This should still log."); /* flooding prevention check */ LOG(log_debug, logtype_default, "Flooding 3x"); for (int i = 0; i < 3; i++) { LOG(log_debug, logtype_default, "Flooding..."); } /* wipe the array */ LOG(log_debug, logtype_default, "1"); LOG(log_debug, logtype_default, "2"); LOG(log_debug, logtype_default, "3"); LOG(log_debug, logtype_default, "-============"); LOG(log_debug, logtype_default, "Flooding 5x"); for (int i = 0; i < 5; i++) { LOG(log_debug, logtype_default, "Flooding..."); } LOG(log_debug, logtype_default, "1"); LOG(log_debug, logtype_default, "2"); LOG(log_debug, logtype_default, "3"); LOG(log_debug, logtype_default, "o============"); LOG(log_debug, logtype_default, "Flooding 2005x"); for (int i = 0; i < 2005; i++) { LOG(log_debug, logtype_default, "Flooding..."); } LOG(log_debug, logtype_default, "1"); LOG(log_debug, logtype_default, "2"); LOG(log_debug, logtype_default, "3"); LOG(log_debug, logtype_default, "0============"); LOG(log_debug, logtype_default, "Flooding 11x1"); for (int i = 0; i < 11; i++) { LOG(log_error, logtype_default, "flooding 11x1 1"); } LOG(log_debug, logtype_default, "1============"); LOG(log_debug, logtype_default, "Flooding 11x2"); for (int i = 0; i < 11; i++) { LOG(log_error, logtype_default, "flooding 11x2 1"); LOG(log_error, logtype_default, "flooding 11x2 2"); } LOG(log_debug, logtype_default, "2============"); LOG(log_debug, logtype_default, "Flooding 11x3"); for (int i = 0; i < 11; i++) { LOG(log_error, logtype_default, "flooding 11x3 1"); LOG(log_error, logtype_default, "flooding 11x3 2"); LOG(log_error, logtype_default, "flooding 11x3 3"); } LOG(log_debug, logtype_default, "3============"); LOG(log_debug, logtype_default, "Flooding 11x4"); for (int i = 0; i < 11; i++) { LOG(log_error, logtype_default, "flooding 11x4 1"); LOG(log_error, logtype_default, "flooding 11x4 2"); LOG(log_error, logtype_default, "flooding 11x4 3"); LOG(log_error, logtype_default, "flooding 11x4 4"); } return 0; }
/* parse an afpd.conf line. i'm doing it this way because it's * easy. it is, however, massively hokey. sample afpd.conf: * server:AFPServer@zone -loginmesg "blah blah blah" -nodsi * "private machine"@zone2 -noguest -port 11012 * server2 -nocleartxt -nodsi * * NOTE: this ignores unknown options */ int afp_options_parseline(char *buf, struct afp_options *options) { char *c, *opt; /* handle server */ if (*buf != '-' && (c = getoption(buf, NULL)) && (opt = strdup(c))) options->server = opt; /* parse toggles */ if (strstr(buf, " -nodebug")) options->flags &= ~OPTION_DEBUG; #ifdef USE_SRVLOC if (strstr(buf, " -slp")) options->flags &= ~OPTION_NOSLP; #endif #ifdef USE_ZEROCONF if (strstr(buf, " -nozeroconf")) options->flags |= OPTION_NOZEROCONF; #endif if (strstr(buf, " -nouservolfirst")) options->flags &= ~OPTION_USERVOLFIRST; if (strstr(buf, " -uservolfirst")) options->flags |= OPTION_USERVOLFIRST; if (strstr(buf, " -nouservol")) options->flags |= OPTION_NOUSERVOL; if (strstr(buf, " -uservol")) options->flags &= ~OPTION_NOUSERVOL; if (strstr(buf, " -proxy")) options->flags |= OPTION_PROXY; if (strstr(buf, " -noicon")) options->flags &= ~OPTION_CUSTOMICON; if (strstr(buf, " -icon")) options->flags |= OPTION_CUSTOMICON; if (strstr(buf, " -advertise_ssh")) options->flags |= OPTION_ANNOUNCESSH; if (strstr(buf, " -noacl2maccess")) options->flags &= ~OPTION_ACL2MACCESS; /* passwd bits */ if (strstr(buf, " -nosavepassword")) options->passwdbits |= PASSWD_NOSAVE; if (strstr(buf, " -savepassword")) options->passwdbits &= ~PASSWD_NOSAVE; if (strstr(buf, " -nosetpassword")) options->passwdbits &= ~PASSWD_SET; if (strstr(buf, " -setpassword")) options->passwdbits |= PASSWD_SET; /* transports */ if (strstr(buf, " -transall")) options->transports = AFPTRANS_ALL; if (strstr(buf, " -notransall")) options->transports = AFPTRANS_NONE; if (strstr(buf, " -tcp")) options->transports |= AFPTRANS_TCP; if (strstr(buf, " -notcp")) options->transports &= ~AFPTRANS_TCP; if (strstr(buf, " -ddp")) options->transports |= AFPTRANS_DDP; if (strstr(buf, " -noddp")) options->transports &= ~AFPTRANS_DDP; if (strstr(buf, "-client_polling")) options->server_notif = 0; /* figure out options w/ values. currently, this will ignore the setting * if memory is lacking. */ if ((c = getoption(buf, "-hostname"))) { int len = strlen (c); if (len <= MAXHOSTNAMELEN) { memcpy(options->hostname, c, len); options->hostname[len] = 0; } else LOG(log_info, logtype_afpd, "WARNING: hostname %s is too long (%d)",c,len); } if ((c = getoption(buf, "-defaultvol")) && (opt = strdup(c))) options->defaultvol.name = opt; if ((c = getoption(buf, "-systemvol")) && (opt = strdup(c))) options->systemvol.name = opt; if ((c = getoption(buf, "-loginmesg")) && (opt = strdup(c))) { int i = 0, j = 0; while (c[i]) { if (c[i] != '\\') { opt[j++] = c[i]; } else { i++; if (c[i] == 'n') opt[j++] = '\n'; } i++; } opt[j] = 0; options->loginmesg = opt; } if ((c = getoption(buf, "-guestname")) && (opt = strdup(c))) options->guest = opt; if ((c = getoption(buf, "-passwdfile")) && (opt = strdup(c))) options->passwdfile = opt; if ((c = getoption(buf, "-passwdminlen"))) options->passwdminlen = MIN(1, atoi(c)); if ((c = getoption(buf, "-loginmaxfail"))) options->loginmaxfail = atoi(c); if ((c = getoption(buf, "-tickleval"))) { options->tickleval = atoi(c); if (options->tickleval <= 0) { options->tickleval = 30; } } if ((c = getoption(buf, "-timeout"))) { options->timeout = atoi(c); if (options->timeout <= 0) { options->timeout = 4; } } if ((c = getoption(buf, "-sleep"))) { options->sleep = atoi(c) *120; if (options->sleep <= 4) { options->sleep = 4; } } if ((c = getoption(buf, "-dsireadbuf"))) { options->dsireadbuf = atoi(c); if (options->dsireadbuf < 6) options->dsireadbuf = 6; } if ((c = getoption(buf, "-server_quantum"))) options->server_quantum = strtoul(c, NULL, 0); if ((c = getoption(buf, "-volnamelen"))) { options->volnamelen = atoi(c); if (options->volnamelen < 8) { options->volnamelen = 8; /* max mangled volname "???#FFFF" */ } if (options->volnamelen > 255) { options->volnamelen = 255; /* AFP3 spec */ } } /* -[no]setuplog <logtype> <loglevel> [<filename>]*/ c = buf; /* Now THIS is hokey! Multiple occurrences are not supported by our current code, */ /* so I have to loop myself. */ while (NULL != (c = strstr(c, "-setuplog"))) { char *optstr; if ((optstr = getoption(c, "-setuplog"))) { setuplog(optstr); options->logconfig = optstr; /* at least store the last (possibly only) one */ c += sizeof("-setuplog"); } } if ((c = getoption(buf, "-unsetuplog"))) unsetuplog(c); #ifdef ADMIN_GRP if ((c = getoption(buf, "-admingroup"))) { struct group *gr = getgrnam(c); if (gr != NULL) { options->admingid = gr->gr_gid; } } #endif /* ADMIN_GRP */ if ((c = getoption(buf, "-k5service")) && (opt = strdup(c))) options->k5service = opt; if ((c = getoption(buf, "-k5realm")) && (opt = strdup(c))) options->k5realm = opt; if ((c = getoption(buf, "-k5keytab"))) { if ( NULL == (options->k5keytab = (char *) malloc(sizeof(char)*(strlen(c)+14)) )) { LOG(log_error, logtype_afpd, "malloc failed"); exit(-1); } snprintf(options->k5keytab, strlen(c)+14, "KRB5_KTNAME=%s", c); putenv(options->k5keytab); /* setenv( "KRB5_KTNAME", c, 1 ); */ } if ((c = getoption(buf, "-authprintdir")) && (opt = strdup(c))) options->authprintdir = opt; if ((c = getoption(buf, "-uampath")) && (opt = strdup(c))) options->uampath = opt; if ((c = getoption(buf, "-uamlist")) && (opt = strdup(c))) options->uamlist = opt; if ((c = getoption(buf, "-ipaddr"))) { #if 0 struct in_addr inaddr; if (inet_aton(c, &inaddr) && (opt = strdup(c))) { if (!gethostbyaddr((const char *) &inaddr, sizeof(inaddr), AF_INET)) LOG(log_info, logtype_afpd, "WARNING: can't find %s", opt); options->ipaddr = opt; } else { LOG(log_error, logtype_afpd, "Error parsing -ipaddr, is %s in numbers-and-dots notation?", c); } #endif options->ipaddr = strdup(c); } /* FIXME CNID Cnid_srv is a server attribute */ if ((c = getoption(buf, "-cnidserver"))) { char *p = strrchr(c, ':'); if (p) *p = 0; Cnid_srv = strdup(c); if (p) Cnid_port = strdup(p + 1); LOG(log_debug, logtype_afpd, "CNID Server: %s:%s", Cnid_srv, Cnid_port); } if ((c = getoption(buf, "-port"))) options->port = strdup(c); if ((c = getoption(buf, "-ddpaddr"))) atalk_aton(c, &options->ddpaddr); if ((c = getoption(buf, "-signature")) && (opt = strdup(c))) options->signatureopt = opt; /* do a little checking for the domain name. */ if ((c = getoption(buf, "-fqdn"))) { char *p = strchr(c, ':'); if (p) *p = '\0'; if (gethostbyname(c)) { if (p) *p = ':'; if ((opt = strdup(c))) options->fqdn = opt; } else { LOG(log_error, logtype_afpd, "error parsing -fqdn, gethostbyname failed for: %s", c); } } if ((c = getoption(buf, "-unixcodepage"))) { if ((charset_t)-1 == ( options->unixcharset = add_charset(c)) ) { options->unixcharset = CH_UNIX; LOG(log_warning, logtype_afpd, "setting Unix codepage to '%s' failed", c); } else { if ((opt = strdup(c))) options->unixcodepage = opt; } } if ((c = getoption(buf, "-maccodepage"))) { if ((charset_t)-1 == ( options->maccharset = add_charset(c)) ) { options->maccharset = CH_MAC; LOG(log_warning, logtype_afpd, "setting Mac codepage to '%s' failed", c); } else { if ((opt = strdup(c))) options->maccodepage = opt; } } if ((c = strstr(buf, "-closevol"))) { options->closevol= 1; } if ((c = getoption(buf, "-ntdomain")) && (opt = strdup(c))) options->ntdomain = opt; if ((c = getoption(buf, "-ntseparator")) && (opt = strdup(c))) options->ntseparator = opt; if ((c = getoption(buf, "-dircachesize"))) options->dircachesize = atoi(c); if ((c = getoption(buf, "-tcpsndbuf"))) options->tcp_sndbuf = atoi(c); if ((c = getoption(buf, "-tcprcvbuf"))) options->tcp_rcvbuf = atoi(c); return 1; }