Annotation of 43BSD/usr.bin/uucp/uucpd.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)uucpd.c    5.4 (Berkeley) 6/23/85";
        !             3: #endif
        !             4: 
        !             5: /*
        !             6:  * 4.2BSD or 2.9BSD TCP/IP server for uucico
        !             7:  * uucico's TCP channel causes this server to be run at the remote end.
        !             8:  */
        !             9: 
        !            10: #include "uucp.h"
        !            11: #include <netdb.h>
        !            12: #ifdef BSD2_9
        !            13: #include <sys/localopts.h>
        !            14: #include <sys/file.h>
        !            15: #endif BSD2_9
        !            16: #include <signal.h>
        !            17: #include <errno.h>
        !            18: #include <sys/socket.h>
        !            19: #include <netinet/in.h>
        !            20: #include <sys/wait.h>
        !            21: #include <sys/ioctl.h>
        !            22: #include <pwd.h>
        !            23: #include <lastlog.h>
        !            24: 
        !            25: #if !defined(BSD4_2) && !defined(BSD2_9)
        !            26: --- You must have either BSD4_2 or BSD2_9 defined for this to work
        !            27: #endif !BSD4_2 && !BSD2_9
        !            28: #if defined(BSD4_2) && defined(BSD2_9)
        !            29: --- You may not have both BSD4_2 and BSD2_9 defined for this to work
        !            30: #endif /* check for stupidity */
        !            31: 
        !            32: char lastlog[] = "/usr/adm/lastlog";
        !            33: struct sockaddr_in hisctladdr;
        !            34: int hisaddrlen = sizeof hisctladdr;
        !            35: struct sockaddr_in myctladdr;
        !            36: int mypid;
        !            37: 
        !            38: char Username[64];
        !            39: char *nenv[] = {
        !            40:        Username,
        !            41:        NULL,
        !            42: };
        !            43: extern char **environ;
        !            44: 
        !            45: main(argc, argv)
        !            46: int argc;
        !            47: char **argv;
        !            48: {
        !            49: #ifndef BSDINETD
        !            50:        register int s, tcp_socket;
        !            51:        struct servent *sp;
        !            52: #endif !BSDINETD
        !            53:        extern int errno;
        !            54:        int dologout();
        !            55: 
        !            56:        environ = nenv;
        !            57: #ifdef BSDINETD
        !            58:        close(1); close(2);
        !            59:        dup(0); dup(0);
        !            60:        hisaddrlen = sizeof (hisctladdr);
        !            61:        if (getpeername(0, &hisctladdr, &hisaddrlen) < 0) {
        !            62:                fprintf(stderr, "%s: ", argv[0]);
        !            63:                perror("getpeername");
        !            64:                _exit(1);
        !            65:        }
        !            66:        if (fork() == 0)
        !            67:                doit(&hisctladdr);
        !            68:        dologout();
        !            69:        exit(1);
        !            70: #else !BSDINETD
        !            71:        sp = getservbyname("uucp", "tcp");
        !            72:        if (sp == NULL){
        !            73:                perror("uucpd: getservbyname");
        !            74:                exit(1);
        !            75:        }
        !            76:        if (fork())
        !            77:                exit(0);
        !            78:        if ((s=open("/dev/tty", 2)) >= 0){
        !            79:                ioctl(s, TIOCNOTTY, (char *)0);
        !            80:                close(s);
        !            81:        }
        !            82: 
        !            83:        bzero((char *)&myctladdr, sizeof (myctladdr));
        !            84:        myctladdr.sin_family = AF_INET;
        !            85:        myctladdr.sin_port = sp->s_port;
        !            86: #ifdef BSD4_2
        !            87:        tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
        !            88:        if (tcp_socket < 0) {
        !            89:                perror("uucpd: socket");
        !            90:                exit(1);
        !            91:        }
        !            92:        if (bind(tcp_socket, (char *)&myctladdr, sizeof (myctladdr)) < 0) {
        !            93:                perror("uucpd: bind");
        !            94:                exit(1);
        !            95:        }
        !            96:        listen(tcp_socket, 3);  /* at most 3 simultaneuos uucp connections */
        !            97:        signal(SIGCHLD, dologout);
        !            98: 
        !            99:        for(;;) {
        !           100:                s = accept(tcp_socket, &hisctladdr, &hisaddrlen);
        !           101:                if (s < 0){
        !           102:                        if (errno == EINTR) 
        !           103:                                continue;
        !           104:                        perror("uucpd: accept");
        !           105:                        exit(1);
        !           106:                }
        !           107:                if (fork() == 0) {
        !           108:                        close(0); close(1); close(2);
        !           109:                        dup(s); dup(s); dup(s);
        !           110:                        close(tcp_socket); close(s);
        !           111:                        doit(&hisctladdr);
        !           112:                        exit(1);
        !           113:                }
        !           114:                close(s);
        !           115:        }
        !           116: #endif BSD4_2
        !           117: 
        !           118: #ifdef BSD2_9
        !           119:        for(;;) {
        !           120:                signal(SIGCHLD, dologout);
        !           121:                s = socket(SOCK_STREAM, 0,  &myctladdr,
        !           122:                        SO_ACCEPTCONN|SO_KEEPALIVE);
        !           123:                if (s < 0) {
        !           124:                        perror("uucpd: socket");
        !           125:                        exit(1);
        !           126:                }
        !           127:                if (accept(s, &hisctladdr) < 0) {
        !           128:                        if (errno == EINTR) {
        !           129:                                close(s);
        !           130:                                continue;
        !           131:                        }
        !           132:                        perror("uucpd: accept");
        !           133:                        exit(1);
        !           134:                }
        !           135:                if (fork() == 0) {
        !           136:                        close(0); close(1); close(2);
        !           137:                        dup(s); dup(s); dup(s);
        !           138:                        close(s);
        !           139:                        doit(&hisctladdr);
        !           140:                        exit(1);
        !           141:                }
        !           142:        }
        !           143: #endif BSD2_9
        !           144: #endif !BSDINETD
        !           145: }
        !           146: 
        !           147: doit(sinp)
        !           148: struct sockaddr_in *sinp;
        !           149: {
        !           150:        char user[64], passwd[64];
        !           151:        char *xpasswd, *crypt();
        !           152:        struct passwd *pw, *getpwnam();
        !           153: 
        !           154:        alarm(60);
        !           155:        printf("login: "); fflush(stdout);
        !           156:        if (readline(user, sizeof user) < 0) {
        !           157:                fprintf(stderr, "user read\n");
        !           158:                return;
        !           159:        }
        !           160:        /* truncate username to 8 characters */
        !           161:        user[8] = '\0';
        !           162:        pw = getpwnam(user);
        !           163:        if (pw == NULL) {
        !           164:                fprintf(stderr, "user unknown\n");
        !           165:                return;
        !           166:        }
        !           167:        if (strcmp(pw->pw_shell, UUCICO)) {
        !           168:                fprintf(stderr, "Login incorrect.");
        !           169:                return;
        !           170:        }
        !           171:        if (pw->pw_passwd && *pw->pw_passwd != '\0') {
        !           172:                printf("Password: "); fflush(stdout);
        !           173:                if (readline(passwd, sizeof passwd) < 0) {
        !           174:                        fprintf(stderr, "passwd read\n");
        !           175:                        return;
        !           176:                }
        !           177:                xpasswd = crypt(passwd, pw->pw_passwd);
        !           178:                if (strcmp(xpasswd, pw->pw_passwd)) {
        !           179:                        fprintf(stderr, "Login incorrect.");
        !           180:                        return;
        !           181:                }
        !           182:        }
        !           183:        alarm(0);
        !           184:        sprintf(Username, "USER=%s", user);
        !           185:        dologin(pw, sinp);
        !           186:        setgid(pw->pw_gid);
        !           187: #ifdef BSD4_2
        !           188:        initgroups(pw->pw_name, pw->pw_gid);
        !           189: #endif BSD4_2
        !           190:        chdir(pw->pw_dir);
        !           191:        setuid(pw->pw_uid);
        !           192: #ifdef BSD4_2
        !           193:        execl(UUCICO, "uucico", (char *)0);
        !           194: #endif BSD4_2
        !           195: #ifdef BSD2_9
        !           196:        sprintf(passwd, "-h%s", inet_ntoa(sinp->sin_addr));
        !           197:        execl(UUCICO, "uucico", passwd, (char *)0);
        !           198: #endif BSD2_9
        !           199:        perror("uucico server: execl");
        !           200: }
        !           201: 
        !           202: readline(p, n)
        !           203: register char *p;
        !           204: register int n;
        !           205: {
        !           206:        char c;
        !           207: 
        !           208:        while (n-- > 0) {
        !           209:                if (read(0, &c, 1) <= 0)
        !           210:                        return(-1);
        !           211:                c &= 0177;
        !           212:                if (c == '\n' || c == '\r') {
        !           213:                        *p = '\0';
        !           214:                        return(0);
        !           215:                }
        !           216:                *p++ = c;
        !           217:        }
        !           218:        return(-1);
        !           219: }
        !           220: 
        !           221: #include <utmp.h>
        !           222: #ifdef BSD4_2
        !           223: #include <fcntl.h>
        !           224: #endif BSD4_2
        !           225: 
        !           226: #ifdef BSD2_9
        !           227: #define O_APPEND       0 /* kludge */
        !           228: #define wait3(a,b,c)   wait2(a,b)
        !           229: #endif BSD2_9
        !           230: 
        !           231: #define        SCPYN(a, b)     strncpy(a, b, sizeof (a))
        !           232: 
        !           233: struct utmp utmp;
        !           234: 
        !           235: dologout()
        !           236: {
        !           237:        union wait status;
        !           238:        int pid, wtmp;
        !           239: 
        !           240: #ifdef BSDINETD
        !           241:        while ((pid=wait(&status)) > 0) {
        !           242: #else  !BSDINETD
        !           243:        while ((pid=wait3(&status,WNOHANG,0)) > 0) {
        !           244: #endif !BSDINETD
        !           245:                wtmp = open("/usr/adm/wtmp", O_WRONLY|O_APPEND);
        !           246:                if (wtmp >= 0) {
        !           247:                        sprintf(utmp.ut_line, "uucp%.4d", pid);
        !           248:                        SCPYN(utmp.ut_name, "");
        !           249:                        SCPYN(utmp.ut_host, "");
        !           250:                        (void) time(&utmp.ut_time);
        !           251: #ifdef BSD2_9
        !           252:                        (void) lseek(wtmp, 0L, 2);
        !           253: #endif BSD2_9
        !           254:                        (void) write(wtmp, (char *)&utmp, sizeof (utmp));
        !           255:                        (void) close(wtmp);
        !           256:                }
        !           257:        }
        !           258: }
        !           259: 
        !           260: /*
        !           261:  * Record login in wtmp file.
        !           262:  */
        !           263: dologin(pw, sin)
        !           264: struct passwd *pw;
        !           265: struct sockaddr_in *sin;
        !           266: {
        !           267:        char line[32];
        !           268:        char remotehost[32];
        !           269:        int wtmp, f;
        !           270:        struct hostent *hp = gethostbyaddr(&sin->sin_addr,
        !           271:                sizeof (struct in_addr), AF_INET);
        !           272: 
        !           273:        if (hp) {
        !           274:                strncpy(remotehost, hp->h_name, sizeof (remotehost));
        !           275:                endhostent();
        !           276:        } else
        !           277:                strncpy(remotehost, inet_ntoa(sin->sin_addr),
        !           278:                    sizeof (remotehost));
        !           279:        wtmp = open("/usr/adm/wtmp", O_WRONLY|O_APPEND);
        !           280:        if (wtmp >= 0) {
        !           281:                /* hack, but must be unique and no tty line */
        !           282:                sprintf(line, "uucp%.4d", getpid());
        !           283:                SCPYN(utmp.ut_line, line);
        !           284:                SCPYN(utmp.ut_name, pw->pw_name);
        !           285:                SCPYN(utmp.ut_host, remotehost);
        !           286:                time(&utmp.ut_time);
        !           287: #ifdef BSD2_9
        !           288:                (void) lseek(wtmp, 0L, 2);
        !           289: #endif BSD2_9
        !           290:                (void) write(wtmp, (char *)&utmp, sizeof (utmp));
        !           291:                (void) close(wtmp);
        !           292:        }
        !           293:        if ((f = open(lastlog, 2)) >= 0) {
        !           294:                struct lastlog ll;
        !           295: 
        !           296:                time(&ll.ll_time);
        !           297:                lseek(f, (long)pw->pw_uid * sizeof(struct lastlog), 0);
        !           298:                strcpy(line, remotehost);
        !           299:                SCPYN(ll.ll_line, line);
        !           300:                SCPYN(ll.ll_host, remotehost);
        !           301:                (void) write(f, (char *) &ll, sizeof ll);
        !           302:                (void) close(f);
        !           303:        }
        !           304: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.