Annotation of researchv10no/cmd/dist/sgi/dispatch.c, revision 1.1.1.1

1.1       root        1: /* usage: dispatch <ipc args> */
                      2: /* TODO: connect input to /dev/null if peer wants no output,
                      3:    connect output to logfile if peer wants no input.  */
                      4: 
                      5: #include <string.h>
                      6: #include <stdio.h>
                      7: #include <pwd.h>
                      8: #include <sys/types.h>
                      9: #include <sys/socket.h>
                     10: #include <netinet/in.h>
                     11: #include <netdb.h>
                     12: #include "../paths.h"
                     13: 
                     14: int
                     15: main(int argc, char *argv[])
                     16: {
                     17:        char c, d;
                     18:        char *args[4];
                     19:        int fd, i, sz;
                     20:        struct sockaddr_in sin;
                     21:        struct hostent *h;
                     22:        char locname[16], remname[16];
                     23:        struct passwd *pw;
                     24: 
                     25:        if (chdir(LDIR) < 0)
                     26:                exit(1);
                     27: 
                     28:        sz = sizeof sin;
                     29:        if (getpeername(0, (struct sockaddr *) &sin, &sz) < 0)
                     30:                exit(1);
                     31:        if (ntohs(sin.sin_port) >= 1024)
                     32:                exit(1);
                     33:        if (!(h = gethostbyaddr(&sin.sin_addr, sizeof sin.sin_addr, sin.sin_family)))
                     34:                exit(1);        /* another silent exit */
                     35:        /* execute the rsh authentication protocol */
                     36:        if (read(0, locname, 1) != 1 || locname[0] != '\0')
                     37:                exit(1);
                     38:        for (i = 0; i < sizeof remname; ++i)
                     39:                if (read(0, remname + i, 1) == 1 && remname[i] == '\0')
                     40:                        break;
                     41:        if (i == sizeof remname)
                     42:                exit(1);
                     43:        for (i = 0; i < sizeof locname; ++i)
                     44:                if (read(0, locname + i, 1) == 1 && locname[i] == '\0')
                     45:                        break;
                     46:        if (i == sizeof locname)
                     47:                exit(1);
                     48:        if (strcmp(locname, remname) != 0)
                     49:                exit(1);
                     50:        if (!(pw = getpwnam(locname)))
                     51:                exit(1);
                     52:        if (ruserok(h->h_name, pw->pw_uid == 0, remname, locname) != 0)
                     53:                exit(1);
                     54:        write(0, "", 1);        /* a NUL byte */
                     55: 
                     56:        setgid(pw->pw_gid);
                     57:        setuid(pw->pw_uid);
                     58: 
                     59:        args[1] = h->h_name;
                     60:        args[2] = pw->pw_name;
                     61:        args[3] = 0;
                     62: 
                     63:        if (read(0, &c, 1) != 1)
                     64:                return 1;
                     65:        do
                     66:                if (read(0, &d, 1) != 1)
                     67:                        return 1;
                     68:        while (d);
                     69: 
                     70:        dup2(0, 1);
                     71:        fd = open("/dev/null", 1);
                     72:        dup2(fd, 2);
                     73:        if (fd > 2)
                     74:                close(fd);
                     75: 
                     76:        switch (c) {
                     77:        case 's':
                     78:                args[0] = "showq";
                     79:                execv("showq", args);
                     80:                break;
                     81:        case 't':
                     82:                args[0] = "transmit";
                     83:                execv("transmit", args);
                     84:                break;
                     85:        case 'n':
                     86:                args[0] = "notice";
                     87:                execv("notice", args);
                     88:                break;
                     89:        }
                     90: 
                     91:        return 1;
                     92: }

unix.superglobalmegacorp.com

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