int main(int argc, char **argv, char **envp) { FILE *config; char *line, *cp, *from, *to, *ap; const char *progname; size_t len, lineno = 0; int i; struct arglist al; /* change progname to mailwrapper so we get sensible error messages */ progname = getprogname(); setprogname("mailwrapper"); if ((config = fopen(_PATH_MAILERCONF, "r")) == NULL) { openlog("mailwrapper", LOG_PID, LOG_MAIL); syslog(LOG_INFO, "can't open %s, using %s as default MTA", _PATH_MAILERCONF, _PATH_DEFAULTMTA); closelog(); execve(_PATH_DEFAULTMTA, argv, envp); err(1, "cannot exec %s", _PATH_DEFAULTMTA); /*NOTREACHED*/ } initarg(&al); addarg(&al, argv[0], 0); for (;;) { if ((line = fparseln(config, &len, &lineno, NULL, 0)) == NULL) { if (feof(config)) errx(1, "no mapping in %s", _PATH_MAILERCONF); err(1, NULL); } #define WS " \t\n" cp = line; cp += strspn(cp, WS); if (cp[0] == '\0') { /* empty line */ free(line); continue; } if ((from = strsep(&cp, WS)) == NULL) goto parse_error; cp += strspn(cp, WS); if ((to = strsep(&cp, WS)) == NULL) goto parse_error; if (strcmp(from, progname) == 0) { for (ap = strsep(&cp, WS); ap != NULL; ap = strsep(&cp, WS)) if (*ap) addarg(&al, ap, 0); break; } free(line); } fclose(config); for (i = 1; i < argc; i++) addarg(&al, argv[i], 0); addarg(&al, NULL, 0); execve(to, al.argv, envp); err(1, "cannot exec %s", to); /*NOTREACHED*/ parse_error: errx(1, "parse error in %s at line %lu", _PATH_MAILERCONF, (u_long)lineno); /*NOTREACHED*/ }
void start_login(const char *host, int autologin, const char *name) { struct argv_stuff avs; char *const *argvfoo; (void)autologin; initarg(&avs); /* * -h : pass on name of host. * WARNING: -h is accepted by login if and only if * getuid() == 0. * -p : don't clobber the environment (so terminal type stays set). * * -f : force this login, he has already been authenticated */ addarg(&avs, loginprg); addarg(&avs, "-h"); addarg(&avs, host); #if !defined(NO_LOGIN_P) addarg(&avs, "-p"); #endif #ifdef BFTPDAEMON /* * Are we working as the bftp daemon? If so, then ask login * to start bftp instead of shell. */ if (bftpd) { addarg(&avs, "-e"); addarg(&avs, BFTPPATH); } else #endif { #if defined (SecurID) /* * don't worry about the -f that might get sent. * A -s is supposed to override it anyhow. */ if (require_SecurID) addarg(&avs, "-s"); #endif if (*name=='-') { syslog(LOG_ERR, "Attempt to login with an option!"); name = ""; } #if defined (AUTHENTICATE) if (auth_level >= 0 && autologin == AUTH_VALID) { # if !defined(NO_LOGIN_F) addarg(&avs, "-f"); # endif addarg(&avs, name); } else #endif { if (getenv("USER")) { addarg(&avs, getenv("USER")); if (*getenv("USER") == '-') { write(1,"I don't hear you!\r\n",19); syslog(LOG_ERR,"Attempt to login with an option!"); exit(1); } } } } closelog(); /* execv() should really take char const* const *, but it can't */ /*argvfoo = argv*/; memcpy(&argvfoo, &avs.argv, sizeof(argvfoo)); execv(loginprg, argvfoo); openlog("telnetd", LOG_PID | LOG_ODELAY, LOG_DAEMON); syslog(LOG_ERR, "%s: %m\n", loginprg); closelog(); fatalperror(net, loginprg); }
void main(int argc, char *argv[]) { int i, err; Arg *ap; Binit(&bout, 1, OWRITE); err = 0; ap = 0; while(argc>1 && argv[1][0]=='-' && argv[1][1]){ --argc; argv++; argv[0]++; if(argv[0][0] == 'r'){ repeats = 1; if(argv[0][1]) goto Usage; continue; } if(argv[0][0] == 's'){ swizzle = 1; if(argv[0][1]) goto Usage; continue; } if(argv[0][0] == 'u'){ flush = 1; if(argv[0][1]) goto Usage; continue; } if(argv[0][0] == 'a'){ argv[0]++; switch(argv[0][0]){ case 'o': abase = 0; break; case 'd': abase = 1; break; case 'x': abase = 2; break; default: goto Usage; } if(argv[0][1]) goto Usage; continue; } ap = &arg[narg]; initarg(); while(argv[0][0]){ switch(argv[0][0]){ case 'c': ap->chartype = TAscii; ap->loglen = 0; if(argv[0][1] || argv[0][-1]!='-') goto Usage; break; case 'R': ap->chartype = TRune; ap->loglen = 0; if(argv[0][1] || argv[0][-1]!='-') goto Usage; break; case 'o': ap->base = 0; break; case 'd': ap->base = 1; break; case 'x': ap->base = 2; break; case 'b': case '1': ap->loglen = 0; break; case 'w': case '2': ap->loglen = 1; break; case 'l': case '4': ap->loglen = 2; break; case 'v': case '8': ap->loglen = 3; break; default: Usage: fprint(2, "usage: xd [-u] [-r] [-s] [-a{odx}] [-c|{b1w2l4v8}{odx}] ... file ...\n"); exits("usage"); } argv[0]++; } if(ap->chartype == TRune) ap->fn = fmtr; else if(ap->chartype == TAscii) ap->fn = fmtc; else ap->fn = fmt[ap->loglen]; ap->fmt = dfmt[ap->loglen][ap->base]; ap->afmt = afmt[ap>arg][abase]; } if(narg == 0) initarg(); if(argc == 1) err = xd(0, 0); else if(argc == 2) err = xd(argv[1], 0); else for(i=1; i<argc; i++) err |= xd(argv[i], 1); exits(err? "error" : 0); }
int main(int argc, char *argv[], char *envp[]) { FILE *config; char *line, *cp, *from, *to, *ap; const char *progname; char localmailerconf[MAXPATHLEN]; const char *mailerconf; size_t len, lineno = 0; int i; struct arglist al; /* change __progname to mailwrapper so we get sensible error messages */ progname = getprogname(); setprogname("mailwrapper"); initarg(&al); addarg(&al, argv[0]); snprintf(localmailerconf, MAXPATHLEN, "%s/etc/mail/mailer.conf", getenv("LOCALBASE") ? getenv("LOCALBASE") : "/usr/local"); mailerconf = localmailerconf; if ((config = fopen(localmailerconf, "r")) == NULL) mailerconf = _PATH_MAILERCONF; if (config == NULL && ((config = fopen(mailerconf, "r")) == NULL)) { addarg(&al, NULL); openlog(getprogname(), LOG_PID, LOG_MAIL); syslog(LOG_INFO, "cannot open %s, using %s as default MTA", mailerconf, _PATH_DEFAULTMTA); closelog(); execve(_PATH_DEFAULTMTA, al.argv, envp); err(EX_OSERR, "cannot exec %s", _PATH_DEFAULTMTA); /*NOTREACHED*/ } for (;;) { if ((line = fparseln(config, &len, &lineno, NULL, 0)) == NULL) { if (feof(config)) errx(EX_CONFIG, "no mapping in %s", mailerconf); err(EX_CONFIG, "cannot parse line %lu", (u_long)lineno); } #define WS " \t\n" cp = line; cp += strspn(cp, WS); if (cp[0] == '\0') { /* empty line */ free(line); continue; } if ((from = strsep(&cp, WS)) == NULL || cp == NULL) goto parse_error; cp += strspn(cp, WS); if ((to = strsep(&cp, WS)) == NULL) goto parse_error; if (strcmp(from, progname) == 0) { for (ap = strsep(&cp, WS); ap != NULL; ap = strsep(&cp, WS)) { if (*ap) addarg(&al, ap); } break; } free(line); } (void)fclose(config); for (i = 1; i < argc; i++) addarg(&al, argv[i]); addarg(&al, NULL); execve(to, al.argv, envp); err(EX_OSERR, "cannot exec %s", to); /*NOTREACHED*/ parse_error: errx(EX_CONFIG, "parse error in %s at line %lu", mailerconf, (u_long)lineno); /*NOTREACHED*/ }