diff options
Diffstat (limited to 'libexec/uucpd/uucpd.c')
-rw-r--r-- | libexec/uucpd/uucpd.c | 214 |
1 files changed, 85 insertions, 129 deletions
diff --git a/libexec/uucpd/uucpd.c b/libexec/uucpd/uucpd.c index 76a994c6b729..c862ccea137d 100644 --- a/libexec/uucpd/uucpd.c +++ b/libexec/uucpd/uucpd.c @@ -65,11 +65,18 @@ static char sccsid[] = "@(#)uucpd.c 5.10 (Berkeley) 2/26/91"; #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <utmp.h> +#include <syslog.h> +#include <varargs.h> #include "pathnames.h" -struct sockaddr_in hisctladdr; +#define SCPYN(a, b) strncpy(a, b, sizeof (a)) + +struct utmp utmp; + +struct sockaddr hisctladdr; int hisaddrlen = sizeof hisctladdr; -struct sockaddr_in myctladdr; +struct sockaddr myctladdr; int mypid; char Username[64]; @@ -83,176 +90,128 @@ main(argc, argv) int argc; char **argv; { -#ifndef BSDINETD - register int s, tcp_socket; - struct servent *sp; -#endif !BSDINETD extern int errno; int dologout(); environ = nenv; -#ifdef BSDINETD close(1); close(2); dup(0); dup(0); hisaddrlen = sizeof (hisctladdr); + openlog("uucpd", LOG_PID, LOG_DAEMON); if (getpeername(0, &hisctladdr, &hisaddrlen) < 0) { - fprintf(stderr, "%s: ", argv[0]); - perror("getpeername"); + syslog(LOG_ERR, "getpeername: %m"); _exit(1); } - if (fork() == 0) - doit(&hisctladdr); + doit(&hisctladdr); dologout(); - exit(1); -#else !BSDINETD - sp = getservbyname("uucp", "tcp"); - if (sp == NULL){ - perror("uucpd: getservbyname"); - exit(1); - } - if (fork()) - exit(0); - if ((s=open(_PATH_TTY, 2)) >= 0){ - ioctl(s, TIOCNOTTY, (char *)0); - close(s); - } + _exit(0); +} - bzero((char *)&myctladdr, sizeof (myctladdr)); - myctladdr.sin_family = AF_INET; - myctladdr.sin_port = sp->s_port; -#ifdef BSD4_2 - tcp_socket = socket(AF_INET, SOCK_STREAM, 0); - if (tcp_socket < 0) { - perror("uucpd: socket"); - exit(1); - } - if (bind(tcp_socket, (char *)&myctladdr, sizeof (myctladdr)) < 0) { - perror("uucpd: bind"); - exit(1); - } - listen(tcp_socket, 3); /* at most 3 simultaneuos uucp connections */ - signal(SIGCHLD, dologout); +login_incorrect() +{ + char passwd[64]; - for(;;) { - s = accept(tcp_socket, &hisctladdr, &hisaddrlen); - if (s < 0){ - if (errno == EINTR) - continue; - perror("uucpd: accept"); - exit(1); - } - if (fork() == 0) { - close(0); close(1); close(2); - dup(s); dup(s); dup(s); - close(tcp_socket); close(s); - doit(&hisctladdr); - exit(1); - } - close(s); + printf("Password: "); fflush(stdout); + if (readline(passwd, sizeof passwd, 1) < 0) { + syslog(LOG_WARNING, "passwd read"); + _exit(1); } -#endif BSD4_2 - -#endif !BSDINETD + fprintf(stderr, "Login incorrect.\n"); + exit(1); } doit(sinp) -struct sockaddr_in *sinp; +struct sockaddr *sinp; { - char user[64], passwd[64]; + char user[64], passwd[64], ubuf[64]; char *xpasswd, *crypt(); struct passwd *pw, *getpwnam(); + int s; alarm(60); printf("login: "); fflush(stdout); - if (readline(user, sizeof user) < 0) { - fprintf(stderr, "user read\n"); - return; + if (readline(user, sizeof user, 0) < 0) { + syslog(LOG_WARNING, "login read"); + _exit(1); } /* truncate username to 8 characters */ user[8] = '\0'; pw = getpwnam(user); - if (pw == NULL) { - fprintf(stderr, "user unknown\n"); - return; - } - if (strcmp(pw->pw_shell, _PATH_UUCICO)) { - fprintf(stderr, "Login incorrect."); - return; - } + if (pw == NULL) + login_incorrect(); + if (strcmp(pw->pw_shell, _PATH_UUCICO)) + login_incorrect(); if (pw->pw_passwd && *pw->pw_passwd != '\0') { printf("Password: "); fflush(stdout); - if (readline(passwd, sizeof passwd) < 0) { - fprintf(stderr, "passwd read\n"); - return; + if (readline(passwd, sizeof passwd, 1) < 0) { + syslog(LOG_WARNING, "passwd read"); + _exit(1); } xpasswd = crypt(passwd, pw->pw_passwd); if (strcmp(xpasswd, pw->pw_passwd)) { - fprintf(stderr, "Login incorrect."); - return; + fprintf(stderr, "Login incorrect.\n"); + exit(1); } } alarm(0); - sprintf(Username, "USER=%s", user); - dologin(pw, sinp); - setgid(pw->pw_gid); -#ifdef BSD4_2 - initgroups(pw->pw_name, pw->pw_gid); -#endif BSD4_2 - chdir(pw->pw_dir); - setuid(pw->pw_uid); -#ifdef BSD4_2 - execl(UUCICO, "uucico", (char *)0); -#endif BSD4_2 - perror("uucico server: execl"); + sprintf(Username, "USER=%s", pw->pw_name); + sprintf(ubuf, "-u%s", pw->pw_name); + if ((s = fork()) < 0) { + syslog(LOG_ERR, "fork: %m"); + _exit(1); + } else if (s == 0) { + dologin(pw, sinp); + setgid(pw->pw_gid); + initgroups(pw->pw_name, pw->pw_gid); + chdir(pw->pw_dir); + setuid(pw->pw_uid); + execl(pw->pw_shell, "uucico", ubuf, NULL); + syslog(LOG_ERR, "execl: %m"); + _exit(1); + } } -readline(p, n) -register char *p; -register int n; +readline(start, num, pass) +char start[]; +int num, pass; { char c; + register char *p = start; + register int n = num; while (n-- > 0) { if (read(0, &c, 1) <= 0) return(-1); c &= 0177; - if (c == '\n' || c == '\r') { + if (c == '\n' || c == '\r' || c == '\0') { + if (p == start && pass) { + n++; + continue; + } *p = '\0'; return(0); } + if (c == 025) { + n = num; + p = start; + continue; + } *p++ = c; } return(-1); } -#include <utmp.h> -#ifdef BSD4_2 -#include <fcntl.h> -#endif BSD4_2 - -#define SCPYN(a, b) strncpy(a, b, sizeof (a)) - -struct utmp utmp; dologout() { union wait status; - int pid, wtmp; + int pid; + char line[32]; -#ifdef BSDINETD while ((pid=wait((int *)&status)) > 0) { -#else !BSDINETD - while ((pid=wait3((int *)&status,WNOHANG,0)) > 0) { -#endif !BSDINETD - wtmp = open(_PATH_WTMP, O_WRONLY|O_APPEND); - if (wtmp >= 0) { - sprintf(utmp.ut_line, "uucp%.4d", pid); - SCPYN(utmp.ut_name, ""); - SCPYN(utmp.ut_host, ""); - (void) time(&utmp.ut_time); - (void) write(wtmp, (char *)&utmp, sizeof (utmp)); - (void) close(wtmp); - } + sprintf(line, "uu%d", pid); + logout(line); + logwtmp(line, "", ""); } } @@ -265,7 +224,8 @@ struct sockaddr_in *sin; { char line[32]; char remotehost[32]; - int wtmp, f; + int f; + time_t cur_time; struct hostent *hp = gethostbyaddr((char *)&sin->sin_addr, sizeof (struct in_addr), AF_INET); @@ -275,26 +235,22 @@ struct sockaddr_in *sin; } else strncpy(remotehost, inet_ntoa(sin->sin_addr), sizeof (remotehost)); - wtmp = open(_PATH_WTMP, O_WRONLY|O_APPEND); - if (wtmp >= 0) { - /* hack, but must be unique and no tty line */ - sprintf(line, "uucp%.4d", getpid()); - SCPYN(utmp.ut_line, line); - SCPYN(utmp.ut_name, pw->pw_name); - SCPYN(utmp.ut_host, remotehost); - time(&utmp.ut_time); - (void) write(wtmp, (char *)&utmp, sizeof (utmp)); - (void) close(wtmp); - } + sprintf(line, "uu%d", getpid()); + /* hack, but must be unique and no tty line */ + time(&cur_time); if ((f = open(_PATH_LASTLOG, O_RDWR)) >= 0) { struct lastlog ll; - time(&ll.ll_time); - lseek(f, (long)pw->pw_uid * sizeof(struct lastlog), 0); - strcpy(line, remotehost); + ll.ll_time = cur_time; + lseek(f, (long)pw->pw_uid * sizeof(struct lastlog), L_SET); SCPYN(ll.ll_line, line); SCPYN(ll.ll_host, remotehost); (void) write(f, (char *) &ll, sizeof ll); (void) close(f); } + utmp.ut_time = cur_time; + SCPYN(utmp.ut_line, line); + SCPYN(utmp.ut_name, pw->pw_name); + SCPYN(utmp.ut_host, remotehost); + login(&utmp); } |