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

1.1       root        1: /*
                      2:  * 4.2BSD TCP/IP server for uucico - VMS version
                      3:  * uucico's TCP channel causes this server to be run at the remote end.
                      4:  *
                      5:  *     Lou Salkind
                      6:  *     New York University
                      7:  */
                      8: 
                      9: #include <stdio.h>
                     10: #include <signal.h>
                     11: #include <sys/param.h>
                     12: #include <sys/socket.h>
                     13: #include <sys/ioctl.h>
                     14: #include <netinet/in.h>
                     15: #include <netdb.h>
                     16: #include <sys/wait.h>
                     17: #include <pwd.h>
                     18: 
                     19: #include <eunice/eunice.h>
                     20: #include <vms/uafdef.h>
                     21: #include <vms/pcbdef.h>
                     22: #include <vms/phddef.h>
                     23: #include <vms/jibdef.h>
                     24: #include <vms/arbdef.h>
                     25: #include <vms/prvdef.h>
                     26: 
                     27: 
                     28: struct uaf uaf;                        /* VMS UAF record for local user */
                     29: struct passwd *getpwnam();
                     30: char *getenv(), *sprintf();
                     31: 
                     32: main(argc, argv)
                     33: int argc;
                     34: char **argv;
                     35: {
                     36:        struct servent *sp;
                     37:        char user[64];
                     38:        char passwd[64];
                     39:        char *p;
                     40:        char ebuf[30];
                     41:        struct passwd *pwd;
                     42:        struct hostent *hp;
                     43:        struct sockaddr_in from;
                     44:        struct sockaddr_in *fromp;
                     45:        unsigned int *q;
                     46:        extern Set_VMS_UAF_Info();
                     47:        int s;
                     48: 
                     49:        {
                     50:                /*
                     51:                 *      Make stdin/stdout/stderr read/write
                     52:                 */
                     53:                if (FD_FAB_Pointer[0]->status == AUTO_OPENR)
                     54:                        FD_FAB_Pointer[0]->status = AUTO_OPENRW;
                     55:                close(1); close(2);
                     56:                dup(0); dup(0);
                     57:        }
                     58: 
                     59:        (void) signal(SIGINT, SIG_DFL);
                     60:        (void) signal(SIGQUIT, SIG_DFL);
                     61:        (void) signal(SIGTERM, SIG_DFL);
                     62: 
                     63:        /*
                     64:         * Get stuff out of the environment
                     65:         */
                     66:        fromp = &from;
                     67:        q = (unsigned int *)fromp;
                     68:        if ((p = getenv("SYS$ERROR")) == NULL) {
                     69:                fprintf(stderr, "Can not translate SYS$ERROR\n");
                     70:                exit(1);
                     71:        }
                     72:        sscanf(p, "%x,%x,%x,%x", &q[0], &q[1], &q[2], &q[3]);
                     73: 
                     74:        fromp->sin_port = ntohs((u_short)fromp->sin_port);
                     75:        if (fromp->sin_family != AF_INET) {
                     76:                fprintf(stderr, "uucpd: malformed from address\n");
                     77:                exit(1);
                     78:        }
                     79:        hp = gethostbyaddr(&fromp->sin_addr, sizeof (struct in_addr),
                     80:                fromp->sin_family);
                     81:        if (hp == 0) {
                     82:                fprintf(stderr, "Host name for your address unknown\n");
                     83:                exit(1);
                     84:        }
                     85:        alarm(60);
                     86:        if (readline(user, sizeof user) < 0) {
                     87:                fprintf(stderr, "user read\n");
                     88:                exit(0);
                     89:        }
                     90:        if (readline(passwd, sizeof passwd) < 0) {
                     91:                fprintf(stderr, "passwd read\n");
                     92:                exit(0);
                     93:        }
                     94: 
                     95:        alarm(0);
                     96:        setpwent();
                     97:        if (!(validate_vms_user(user, passwd, &uaf) & 1) ||
                     98:             (uaf.uaf$b_flags & UAF$M_DISACNT)) {
                     99:                fprintf(stderr, "Login incorrect.\n");
                    100:                exit(1);
                    101:        }
                    102:        pwd = getpwnam(user);
                    103:        if (pwd == NULL) {
                    104:                fprintf(stderr, "Login incorrect.\n");
                    105:                exit(1);
                    106:        }
                    107:        endpwent();
                    108:        if (chdir(pwd->pw_dir) < 0) {
                    109:                fprintf(stderr, "No remote directory.\n");
                    110:                exit(1);
                    111:        }
                    112:        sys$cmkrnl(Set_VMS_UAF_Info, 0); /* Set the VMS environment info */
                    113:        sprintf(ebuf, "-h%s", inet_ntoa(from.sin_addr));
                    114:        if (vfork() == 0) {
                    115:                execl("/usr/lib/uucp/uucico", "uucico", ebuf, (char *)0);
                    116:                perror("uucico server: execl");
                    117:                _exit(1);
                    118:        }
                    119:        wait(&s);
                    120:        exit(0);
                    121: }
                    122: 
                    123: /*
                    124:  *
                    125:  *     KERNEL Mode routine to stuff the PCB/JIB for this process with
                    126:  *     the correct quotas/information from the VMS UAF record.
                    127:  *
                    128:  */
                    129: Set_VMS_UAF_Info()
                    130: {
                    131:        extern struct PCB *ctl$gl_pcb;
                    132:        extern struct PHD *ctl$gl_phd;
                    133:        extern char ctl$t_username[], ctl$t_account[];
                    134:        extern unsigned int ctl$gq_procpriv[2];
                    135:        register struct PCB *pcb;
                    136:        register struct JIB *jib;
                    137:        register struct ARB *arb;
                    138:        register struct PHD *phd;
                    139:        register int i;
                    140: 
                    141:        /*
                    142:         *      Get PCB and JIB pointers
                    143:         */
                    144:        pcb = ctl$gl_pcb;
                    145:        phd = ctl$gl_phd;
                    146:        jib = pcb->pcb$l_jib;
                    147:        arb = pcb->pcb$l_arb;
                    148:        /*
                    149:         *      Set our execution priority
                    150:         */
                    151:        sys$setpri(0,0,uaf.uaf$b_pri,0);
                    152: 
                    153:        /* DEFAULT DIRECTORY/DISK ALREADY SET */
                    154: 
                    155:        /*
                    156:         *      Set username (space padded)
                    157:         */
                    158:        for(i = 0; i < sizeof(uaf.uaf$t_username); i++) {
                    159:                        jib->jib$t_username[i] = uaf.uaf$t_username[i];
                    160:                        ctl$t_username[i] = uaf.uaf$t_username[i];
                    161:        }
                    162:        for(i = sizeof(uaf.uaf$t_username); i < sizeof(jib->jib$t_username); i++) {
                    163:                        jib->jib$t_username[i] = ' ';
                    164:        }
                    165:        /*
                    166:         *      Set account (blank padded) [to ctl region as well???]
                    167:         */
                    168:        for(i = 0; i < sizeof(uaf.uaf$t_account); i++) {
                    169:                        jib->jib$t_account[i] = uaf.uaf$t_account[i];
                    170:                        ctl$t_account[i] = uaf.uaf$t_account[i];
                    171:        }
                    172:        for(i = sizeof(uaf.uaf$t_account); i < sizeof(jib->jib$t_account); i++) {
                    173:                        jib->jib$t_account[i] = ' ';
                    174:        }
                    175:        /*
                    176:         *      Set UIC
                    177:         */
                    178:        arb->arb$w_grp = pcb->pcb$w_grp = uaf.uaf$w_grp;
                    179:        arb->arb$w_mem = pcb->pcb$w_mem = uaf.uaf$w_mem;
                    180: 
                    181:        /* SET PROCESS NAME TO USERNAME?? */
                    182: 
                    183:        /*
                    184:         *      Set quotas
                    185:         */
                    186:        i = (uaf.uaf$w_biolm - pcb->pcb$w_biolm);
                    187:        pcb->pcb$w_biolm += i;
                    188:        pcb->pcb$w_biocnt += i;
                    189: 
                    190:        i = (uaf.uaf$w_diolm - pcb->pcb$w_diolm);
                    191:        pcb->pcb$w_diolm += i;
                    192:        pcb->pcb$w_diocnt += i;
                    193: 
                    194:        i = uaf.uaf$l_bytlm ? uaf.uaf$l_bytlm : uaf.uaf$w_bytlm;
                    195:        i = i - jib->jib$l_bytlm;
                    196:        jib->jib$l_bytlm += i;
                    197:        jib->jib$l_bytcnt += i;
                    198: 
                    199:        jib->jib$w_prclim = uaf.uaf$w_prccnt;
                    200: 
                    201:        i = (uaf.uaf$w_fillm - jib->jib$w_fillm);
                    202:        jib->jib$w_fillm += i;
                    203:        jib->jib$w_filcnt += i;
                    204: 
                    205:        i = *((int *)&uaf.uaf$w_pgflquota[0]);
                    206:        i = (i - jib->jib$l_pgflquota);
                    207:        jib->jib$l_pgflquota += i;
                    208:        jib->jib$l_pgflcnt += i;
                    209: 
                    210:        i = (uaf.uaf$w_tqcnt - jib->jib$w_tqlm);
                    211:        jib->jib$w_tqlm += i;
                    212:        jib->jib$w_tqcnt += i;
                    213: 
                    214:        i = (uaf.uaf$w_enqlm - jib->jib$w_enqlim);
                    215:        jib->jib$w_enqlim += i;
                    216:        jib->jib$w_enqcnt += i;
                    217: 
                    218:        i = (uaf.uaf$w_shrfillm - jib->jib$w_shrflim);
                    219:        jib->jib$w_shrflim += i;
                    220:        jib->jib$w_shrfcnt += i;
                    221: 
                    222:        i = (uaf.uaf$l_pbytlm - jib->jib$l_pbytlim);
                    223:        jib->jib$l_pbytlim += i;
                    224:        jib->jib$l_pbytcnt += i;
                    225: 
                    226:        /*
                    227:         *      Fill in privileges
                    228:         */
                    229:        i = *((int *)&uaf.uaf$l_priv[0]);
                    230:        i &= ~(1<<PRV$V_BYPASS);        /* TOO DANGEROUS TO GIVE TO USER */
                    231:        pcb->pcb$q_priv[0]     = i;
                    232:        arb->arb$q_priv[0]     = i;
                    233:        jib->jib$q_priv[0]     = i;
                    234:        phd->phd$q_authpriv[0] = i;
                    235:        ctl$gq_procpriv[0]     = i;
                    236:        i = *((int *)&uaf.uaf$l_priv[2]);
                    237:        pcb->pcb$q_priv[1]     = i;
                    238:        arb->arb$q_priv[1]     = i;
                    239:        jib->jib$q_priv[1]     = i;
                    240:        phd->phd$q_authpriv[1] = i;
                    241:        ctl$gq_procpriv[1]     = i;
                    242: }
                    243: 
                    244: 
                    245: /*
                    246:  *     Read a line from standard input (NETWORK)
                    247:  */
                    248: readline(p, n)
                    249:        register char *p;
                    250:        register int n;
                    251: {
                    252:        char c;
                    253: 
                    254:        while (n-- > 0) {
                    255:                if (read(0, &c, 1) <= 0)
                    256:                        return(-1);
                    257:                c &= 0177;
                    258:                if (c == '\n' || c == '\r') {
                    259:                        *p = '\0';
                    260:                        return(0);
                    261:                }
                    262:                *p++ = c;
                    263:        }
                    264:        return(-1);
                    265: }
                    266: 

unix.superglobalmegacorp.com

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