Annotation of researchv10no/ipc/mgrs/svcmgr/exec_act.c, revision 1.1.1.1

1.1       root        1: #include "mgr.h"
                      2: #include <sys/param.h>
                      3: #include <sys/filio.h>
                      4: #include <sys/inio.h>
                      5: #include <pwd.h>
                      6: #include <ctype.h>
                      7: #include "defs.h"
                      8: 
                      9: int debug;
                     10: 
                     11: /*
                     12:  *  get parameters from caller
                     13:  */
                     14: parms(rp, ap)
                     15:        Request *rp;
                     16:        Action *ap;
                     17: {
                     18:        char *s;
                     19:        char *rdline();
                     20: 
                     21:        USE(ap);
                     22:        if ((s = rdline(rp->i->cfd)) == NULL)
                     23:                return -1;
                     24:        rp->args = strdup(s);
                     25:        return 0;
                     26: }
                     27: 
                     28: /*
                     29:  *  get system V parameters from caller
                     30:  */
                     31: char *
                     32: rdstring(fd)
                     33:        int fd;
                     34: {
                     35:        static char buf[ARB];
                     36:        int len;
                     37: 
                     38:        /* get count */
                     39:        if (read(fd, buf, 2)!=2)
                     40:                return NULL;
                     41:        len = (((unsigned char)buf[1])<<8)+((unsigned char)buf[0]);
                     42:        if(len>=ARB||len<0)
                     43:                return NULL;
                     44:        if (len>0 && read(fd, buf, len)!=len)
                     45:                return NULL;
                     46:        buf[len] = '\0';
                     47:        return buf;
                     48: }
                     49: 
                     50: s5parms(rp, ap)
                     51:        Request *rp;
                     52:        Action *ap;
                     53: {
                     54: #include <sys/ttyio.h>
                     55:        struct sgttyb ttyb;
                     56:        char *s;
                     57:        char *cp;
                     58: 
                     59:        USE(ap);
                     60: 
                     61:        /*
                     62:         *  name is flag string for service
                     63:         */
                     64:        for (cp=rp->i->name; *cp && *cp!='.'; cp++){
                     65:                switch(*cp){
                     66:                case 'v':
                     67:                case 'd':
                     68:                        /* ignore an input string */
                     69:                        rdstring(rp->i->cfd);
                     70:                        break;
                     71:                case 'a':
                     72:                        /* get the arg string */
                     73:                        if ((s = rdstring(rp->i->cfd)) == NULL)
                     74:                                return -1;
                     75:                        rp->args = strdup(s);
                     76:                        break;
                     77:                case 't':
                     78:                        if(ttyld(rp, ap)!=0)
                     79:                                return -1;
                     80:                        ioctl(rp->i->cfd, TIOCGETP, &ttyb);
                     81:                        ttyb.sg_flags &= ~ECHO;
                     82:                        ioctl(rp->i->cfd, TIOCSETP, &ttyb);
                     83:                        break;
                     84:                }
                     85:        }
                     86:        if(*cp=='.')
                     87:                cp++;
                     88: 
                     89:        /*
                     90:         *  cp now points to field after flag field
                     91:         */
                     92:        return 0;
                     93: }
                     94: 
                     95: /*
                     96:  *  get terminal type(speed, etc) from caller
                     97:  */
                     98: term(rp, ap)
                     99:        Request *rp;
                    100:        Action *ap;
                    101: {
                    102:        char pbuf[ARB];
                    103:        char *s, *sl;
                    104:        char *rdline();
                    105:        char *strchr();
                    106: 
                    107:        USE(ap);
                    108:        if (ap->arg!=NULL && *(ap->arg)!='\0') {
                    109:                rp->term = strdup(ap->arg);
                    110:        } else {
                    111:                if((s = rdline(rp->i->cfd)) == NULL)
                    112:                        return -1;
                    113:                if(sl=strchr(s, '/'))
                    114:                        *sl = '\0';
                    115:                rp->term = strdup(s);
                    116:        }
                    117:        return 0;
                    118: }
                    119: 
                    120: /*
                    121:  *  action routines that end in execs
                    122:  */
                    123: 
                    124: doconn(rp, ap)
                    125:        Request *rp;
                    126:        Action *ap;
                    127: {
                    128:        USE(ap);
                    129:        ioctl(rp->i->cfd, TCPIOHUP, 0);         /* hang-up TCP on FIN */
                    130:        login(rp, rp->line, (char *)NULL);
                    131: }
                    132: 
                    133: #define SNDMSG(x) write(rp->i->cfd, x, strlen(x))
                    134: doexec(rp, ap)
                    135:        Request *rp;
                    136:        Action *ap;
                    137: {
                    138:        USE(ap);
                    139:        if(rp->line==0 || *rp->line==0) {
                    140:                SNDMSG("access denied\n");
                    141:                _exit(1);
                    142:        }
                    143:        login(rp, rp->line, rp->args);
                    144: }
                    145: 
                    146: docmd(rp, ap)
                    147:        Request *rp;
                    148:        Action *ap;
                    149: {
                    150:        register char *p;
                    151:        char buf[ARB];
                    152:        int execit;
                    153: 
                    154:        /*
                    155:         *  protect against sh security holes
                    156:         */
                    157:        for(p=rp->args; *p; p++)
                    158:                if (strchr("\n&;^|<>(){}`", *p))
                    159:                        *p = ' ';
                    160:        /*
                    161:         *  avoid an extra process
                    162:         */
                    163:        for(execit=1,p=ap->arg; *p; p++)
                    164:                if (strchr("=\n&;^|(){}`", *p))
                    165:                        execit=0;
                    166:        if(execit)
                    167:                strcpy(buf, "exec ");
                    168:        else
                    169:                buf[0]=0;
                    170:        strcat(buf, ap->arg);
                    171:        strcat(buf, " ");
                    172:        /*
                    173:        for(p=rp->args; *p && !isspace(*p); p++)
                    174:                ;
                    175:         */
                    176:        strcat(buf, rp->args);
                    177:        login(rp, rp->line, buf);
                    178: }
                    179: 
                    180: dologin(rp, ap)
                    181:        Request *rp;
                    182:        Action *ap;
                    183: {
                    184:        USE(ap);
                    185:        login(rp, (char *)0, (char *)0);
                    186: }
                    187: 
                    188: login(rp, pw, cmd)
                    189:        Request *rp;
                    190:        char *pw, *cmd;
                    191: {
                    192:        char *args[5];
                    193:        char buf[512];
                    194:        char *cp;
                    195:        register char **ap;
                    196:        register int i;
                    197:        char **inienv;
                    198:        char **srcenv(), **termenv();
                    199: 
                    200:        if(debug)
                    201:                logtime("login:\n");
                    202:        errno = 0; errstr = "";
                    203:        buf[0] = '\0';
                    204:        logstatus("in", rp->i);
                    205:        ap = args;
                    206:        *ap++ = "login";
                    207:        if (pw) {
                    208:                *ap++ = "-p";
                    209:                *ap++ = pw;
                    210:                strcpy(buf, " -p ");
                    211:                for(cp=buf+4; *pw && *pw!=':';)
                    212:                        *cp++ = *pw++;
                    213:                *cp = '\0';
                    214:        }
                    215:        if (cmd) {
                    216:                *ap++ = cmd;
                    217:                strcat(buf, " ");
                    218:                strcat(buf, cmd);
                    219:        }
                    220:        *ap = NULL;
                    221:        pwclose();
                    222:        logevent("login %s\n", buf);
                    223:        for (i = 0; i < NSYSFILE; i++)
                    224:                dup2(rp->i->cfd, i);
                    225:        if (rp->errfd>=0)
                    226:                dup2(rp->errfd, 2);
                    227:        if(rp->i->cfd>=NSYSFILE)
                    228:                close(rp->i->cfd);
                    229:        if(rp->errfd>=NSYSFILE)
                    230:                close(rp->errfd);
                    231:        if (rp->term)
                    232:                termenv(rp);
                    233:        inienv = srcenv(rp);
                    234:        ioctl(0, TIOCSPGRP, 0);
                    235:        execve("/etc/login", args, inienv);
                    236:        execve("/bin/login", args, inienv);
                    237:        _exit(1);
                    238: }
                    239: 
                    240: char **newep;  /* set up by init */
                    241: char *newenv[5];
                    242: 
                    243: char **
                    244: srcenv(rp)
                    245:        Request *rp;
                    246: {
                    247:        static char cbuf[ARB];
                    248:        static char nbuf[ARB];
                    249:        char param[ARB];
                    250:        char *field[10];
                    251:        char *line;
                    252:        int i;
                    253: 
                    254:        line="";
                    255:        strcpy(param, rp->i->param);
                    256:        setfields(" ");
                    257:        i=getfields(param, field, 10);
                    258:        for(; i; i--)
                    259:                if(strncmp(field[i-1], "PSOURCE=", 8)==0){
                    260:                        line=field[i-1]+8;
                    261:                        break;
                    262:                }
                    263:        sprintf(cbuf, "CSOURCE=source=%s user=%s line=%s",
                    264:                rp->i->machine, rp->i->user, line);
                    265:        *newep++ = cbuf;
                    266:        sprintf(nbuf, "CDEST=%s!%s", rp->i->myname, rp->i->name);
                    267:        *newep++ = nbuf;
                    268:        *newep = NULL;
                    269:        return (newenv);
                    270: }
                    271: 
                    272: char **
                    273: termenv(rp)
                    274:        Request *rp;
                    275: {
                    276:        static char buf[100];
                    277: 
                    278:        sprintf(buf, "TERM=%s", rp->term);
                    279:        *newep++ = buf;
                    280:        *newep = NULL;
                    281:        return (newenv);
                    282: }

unix.superglobalmegacorp.com

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