1: /*
   2:    This file is meant to handle all the machine
   3:    dependencies in the network code.
   4:    Everything is conditionally compiled.
   5: 
   6:    It can be uses w/o network stuff to simulate
   7:    v7 for other programs, too.
   8: */
   9: # include <stdio.h>
  10: # include "mach.h"
  11: 
  12: char shomedir[100];
  13: 
  14: int debugflg;
  15: 
  16: /* the CC and SRC machines have the submit() call */
  17: # ifndef CC
  18: # ifndef SRC
  19: submit(a) {}
  20: # endif
  21: # endif
  22: 
  23: # ifdef FUID
  24: setgid() {};
  25: # endif
  26: 
  27: /*
  28:    Set the owner uid/gid of a file.
  29:    On v7, this is done by the chown command
  30:    with three args - (file, uid, gid).
  31:    On Vanilla V6 this is done using the
  32:    top byte of the second parameter as the gid byte.
  33:    On Berkeley Funny uids on V6, no gid is specified.
  34: */
  35: mchown(sfn,uid,gid)
  36:     char *sfn;
  37:     int uid;
  38:     int gid;
  39: {
  40: # ifndef V6
  41:     chown(sfn,uid,gid);
  42: # else
  43: # ifndef FUID
  44:         uid = uidmask(uid);
  45:         uid = ((gid&0377) << 8) | (uid & 0377);
  46: # endif
  47:     chown(sfn,uid);
  48: # endif
  49: }
  50: 
  51: 
  52: /*
  53: 	SnFromuid(uid)
  54: 
  55: 	The login name corresponding to uid.
  56: 	Reads the password file.
  57: 	Successive calls overwrite the static string returned.
  58: 	Returns NULL if error.
  59: */
  60: char *SnFromUid(uid)
  61:     register int uid;
  62: {
  63:     register struct passwd *pwd;
  64:     static int ouid = -1;
  65:     static char oresult[20] = "";
  66:     uid = uidmask(uid);
  67:     if(uid == ouid)
  68:         return(oresult);
  69: # ifdef HPASSWD
  70:     if(getname(uid,oresult) == 0){
  71:         ouid = uid;
  72:         return(oresult);
  73:     }
  74: # endif
  75:     pwd = getpwuid(uid);
  76:     if(pwd != NULL){
  77:         strcpy(oresult,pwd->pw_name);
  78:         ouid = uid;
  79:         return(oresult);
  80:     }
  81:     return(NULL);
  82: }
  83: uidfromsn(sn)
  84: register char *sn;
  85: {
  86:     register int him = -1;
  87:     register struct passwd *pwd;
  88: # ifdef HPASSWD
  89:     him = getuserid(sn);
  90: # endif
  91:     if(him == -1){
  92:         pwd = getpwnam(sn);
  93:         if(pwd != NULL)him = guid(pwd->pw_uid,pwd->pw_gid);
  94:         }
  95:     return(him);
  96: }
  97: 
  98: /* handle the regular unix and local mods difference for user id's */
  99: /* this call returns the 1 word uid = to what getuid will return */
 100: guid(uid,gid){
 101:     uid = uidmask(uid);
 102: # ifdef FUID
 103:     return((uid & 0377) | (gid << 8));
 104: # else
 105:     return(uid);
 106: # endif
 107:     }
 108: 
 109: # ifdef OLDTTY
 110: isatty(i){
 111:     return(ttyn(i) != 'x');
 112:     }
 113: char *ttyname(i){       /* return NULL if not TTY */
 114:     char c;
 115:     static char ttystr[] = "/dev/ttyx";
 116:     c = ttyn(i);
 117:     ttystr[8] = c;
 118:     return(c == 'x' ? NULL : ttystr);
 119:     }
 120: # endif
 121: 
 122: # ifdef CCTTY
 123: # undef ttyname()
 124: char *myttyname(i){     /* return NULL for non tty */
 125:     static char s[15],*p;
 126:     p = ttyname(i);
 127:     if(p == NULL)return(NULL);
 128:     strcpy(s,"/dev/");
 129:     strcat(s,p);
 130:     return(s);
 131:     }
 132: # define ttyname(S) myttyname(S)
 133: # endif
 134: 
 135: /* expand control chars in string s */
 136: expandcc(s)
 137:   register char *s; {
 138:     char stemp[100];
 139:     register char *p;
 140: 
 141:     if(s == NULL)return;
 142:     strcpy(stemp,s);
 143:     p = stemp;
 144:     while(*p){
 145:         if(!isprint(*p)){
 146:             *s++ = '^';
 147:             *s++ = *p++ + 0140;
 148:         }
 149:         else *s++ = *p++;
 150:     }
 151: }
 152: 
 153: /* get passwd from passwdf */
 154: getpwdf(pwd)
 155:   struct passwd *pwd; {
 156: # ifdef PASSWDF
 157: # ifndef TESTING
 158:     register char *p, *q;
 159:     char buf1[BUFSIZ], found;
 160:     FILE *pw;
 161:     debug("reading passwdf\n");
 162:     pwd->pw_passwd[0] = 0;
 163:     pw = fopen("/etc/passwdf","r");
 164:     if(pw == NULL) return;
 165:     found = 0;
 166:     while(fgets(buf1,BUFSIZ,pw) != NULL){
 167:         for(p=buf1; *p && *p != ':'; p++);
 168:         *p = 0;
 169:         if(strcmp(buf1,pwd->pw_name) == 0){
 170:             found = 1;
 171:             break;
 172:             }
 173:         }
 174:     fclose(pw);
 175:     if(!found)return;
 176:     q = ++p;
 177:     for(;*p && *p != ':';p++);
 178:     *p = 0;
 179:     strcpy(pwd->pw_passwd,q);
 180:     /*
 181: 	debug("user %s passwd %s %s",pwd->pw_name,pwd->pw_passwd);
 182: 	*/
 183: # endif
 184: # endif
 185:     }
 186: /*
 187: 	getutmp()
 188: 	return a pointer to the system utmp structure associated with
 189: 	terminal sttyname, e.g. "/dev/tty3"
 190: 	Is version independent-- will work on v6 systems
 191: 	return NULL if error
 192: */
 193: struct utmp *getutmp(sttyname)
 194: char *sttyname;
 195: {
 196: # ifdef OLDTTY
 197:     struct v6utmp {
 198:         char v6ut_name[8];
 199:         char v6ut_tty;
 200:         char v6ut_fill;
 201:         long v6ut_time;
 202:         int  v6ut_fl1;
 203:         } v6utmpstr;
 204: # endif
 205:     static struct utmp utmpstr;
 206:     FILE *fdutmp;
 207: 
 208:     debug("reading utmp\n");
 209:     if(sttyname == NULL || sttyname[0] == 0)return(NULL);
 210: 
 211:     fdutmp = fopen("/etc/utmp","r");
 212:     if(fdutmp == NULL)return(NULL);
 213: 
 214: # ifndef OLDTTY
 215:     while(fread(&utmpstr,1,sizeof utmpstr,fdutmp) == sizeof utmpstr)
 216:         if(strcmp(utmpstr.ut_line,sttyname+5) == 0){
 217:             fclose(fdutmp);
 218:             return(&utmpstr);
 219:         }
 220: # else
 221:     while(fread(&v6utmpstr,1,sizeof v6utmpstr,fdutmp) == sizeof v6utmpstr)
 222:         if(v6utmpstr.v6ut_tty == sttyname[8]){
 223:             strcpy(utmpstr.ut_name,v6utmpstr.v6ut_name);
 224:             strcpy(utmpstr.ut_line,"ttyx");
 225:             utmpstr.ut_line[3] = v6utmpstr.v6ut_tty;
 226:             utmpstr.ut_time = v6utmpstr.v6ut_time;
 227:             fclose(fdutmp);
 228:             return(&utmpstr);
 229:         }
 230: # endif
 231:     fclose(fdutmp);
 232:     return(NULL);
 233: }
 234: 
 235: /*
 236:    these are all the v7 routines not available on the v6 machines
 237: */
 238: 
 239: # ifdef V6
 240: 
 241: char **environ;         /* global environment pointer */
 242: 
 243: ioctl(a,b,c){
 244:     return(0);      /* always succeeds */
 245:     }
 246: long atol(s)
 247:   register char *s; {
 248:     long i = 0;
 249:     while('0' <= *s && *s <= '9')
 250:         i = i * 10 + (*s++ - '0');
 251:     return(i);
 252:     }
 253: long gettime(){
 254:     long tt;
 255:     time(&tt);
 256:     return(tt);
 257:     }
 258: long getsize(str)
 259:   struct stat *str; {
 260:     long wk;
 261:     wk = ((long)(str->st_size0 & 0377)) << 16;
 262:     wk += (long)((unsigned)str->st_size1);
 263:     return(wk);
 264:     }
 265: /*
 266: 	getenv("HOME")
 267: 
 268: 	always returns home directory.
 269: 	returns NULL if there is error.
 270: */
 271: char *getenv(){
 272:     register char *shdir = NULL;
 273:     register struct passwd *pwd;
 274:     register int it;
 275:     if(shomedir[0] != 0)return(shomedir);
 276: # ifdef BERKELEY
 277:     /* hget only works on Berkeley machines */
 278:     it = ttyn(2);
 279: # ifdef OLDTTY
 280:     if(it == 'x')it = ttyn(1);
 281:     if(it == 'x')it = ttyn(0);
 282:     if(it != 'x' && hget(it) == 0)shdir = hgethome();
 283: # endif
 284: # ifdef CCTTY
 285:     if(it == -1)it = ttyn(1);
 286:     if(it == -1)it = ttyn(0);
 287:     if(it != -1 && hget(it) == 0)shdir = hgethome();
 288: # endif
 289: # endif
 290:     if(shdir == NULL){
 291:         pwd = PwdCurrent();
 292:         if(pwd != NULL)shdir = pwd->pw_dir;
 293:         }
 294:     if(shdir != NULL)strcpy(shomedir,shdir);
 295:     return(shdir);
 296:     }
 297: 
 298: /* doesn't handle split passwd files */
 299: struct passwd *
 300: getpwuid(uid)
 301: register uid;
 302: {
 303:     register struct passwd *p;
 304:     struct passwd *getpwent();
 305: 
 306:     uid = uidmask(uid);
 307:     setpwent();
 308:     while( (p = getpwent()) && guid(p->pw_uid,p->pw_gid) != uid );
 309:     endpwent();
 310:     return(p);
 311: }
 312: 
 313: static char PASSWD[]    = "/etc/passwd";
 314: static char EMPTY[] = "";
 315: static FILE *pwf = NULL;
 316: static char line[BUFSIZ+1];
 317: static struct passwd passwd;
 318: 
 319: setpwent()
 320: {
 321:     debug("reading passwd\n");
 322:     if( pwf == NULL )
 323:         pwf = fopen( PASSWD, "r" );
 324:     else
 325:         rewind( pwf );
 326: }
 327: 
 328: endpwent()
 329: {
 330:     if( pwf != NULL ){
 331:         fclose( pwf );
 332:         pwf = NULL;
 333:     }
 334: }
 335: 
 336: static char *
 337: pwskip(p)
 338: register char *p;
 339: {
 340:     while( *p && *p != ':' )
 341:         ++p;
 342:     if( *p ) *p++ = 0;
 343:     return(p);
 344: }
 345: 
 346: struct passwd *
 347: getpwent()
 348: {
 349:     register char *p;
 350: 
 351:     if (pwf == NULL) {
 352:         if( (pwf = fopen( PASSWD, "r" )) == NULL )
 353:             return(0);
 354:     }
 355:     p = fgets(line, BUFSIZ, pwf);
 356:     if (p==NULL)
 357:         return(0);
 358:     passwd.pw_name = p;
 359:     p = pwskip(p);
 360:     passwd.pw_passwd = p;
 361:     p = pwskip(p);
 362:     passwd.pw_uid = atoi(p);
 363:     passwd.pw_uid = uidmask(passwd.pw_uid);
 364:     p = pwskip(p);
 365:     passwd.pw_gid = atoi(p);
 366:     passwd.pw_quota = 0;
 367:     passwd.pw_comment = EMPTY;
 368:     p = pwskip(p);
 369:     passwd.pw_gecos = p;
 370:     p = pwskip(p);
 371:     passwd.pw_dir = p;
 372:     p = pwskip(p);
 373:     passwd.pw_shell = p;
 374:     while(*p && *p != '\n') p++;
 375:     *p = '\0';
 376:     return(&passwd);
 377: }
 378: 
 379: struct passwd *
 380: getpwnam(name)
 381: char *name;
 382: {
 383:     register struct passwd *p;
 384:     struct passwd *getpwent();
 385: 
 386:     setpwent();
 387:     while( (p = getpwent()) && strcmp(name,p->pw_name) );
 388:     endpwent();
 389:     return(p);
 390: }
 391: /*
 392: 	getlogin()
 393: 
 394: 	Return current user name by looking at /etc/utmp (calls getutmp()).
 395: 	Returns NULL if not found.
 396: */
 397: char *getlogin()
 398: {
 399:     register struct utmp *putmp;
 400:     register char *s;
 401:     char sttyname[30];
 402: 
 403:     if(isatty(2))strcpy(sttyname,ttyname(2));
 404:     else if(isatty(0))strcpy(sttyname,ttyname(0));
 405:     else if(isatty(1))strcpy(sttyname,ttyname(1));
 406:     else return(NULL);
 407: 
 408:     putmp = getutmp(sttyname);
 409:     if(putmp == NULL)return(NULL);
 410:     s = putmp->ut_name;
 411:     while(*s != 0 && *s != ' ')s++;
 412:     *s = 0;
 413:     if(putmp->ut_name[0] == 0)return(NULL);
 414:     return(putmp->ut_name);
 415: }
 416: /*
 417:  * Unix routine to do an "fopen" on file descriptor
 418:  * The mode has to be repeated because you can't query its
 419:  * status
 420:  */
 421: 
 422: FILE *
 423: fdopen(fd, mode)
 424: register char *mode;
 425: {
 426:     extern int errno;
 427:     register FILE *iop;
 428:     extern FILE *_lastbuf;
 429: 
 430:     for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT); iop++)
 431:         if (iop >= _lastbuf)
 432:             return(NULL);
 433:     iop->_cnt = 0;
 434:     iop->_file = fd;
 435:     if (*mode != 'r') {
 436:         iop->_flag |= _IOWRT;
 437:         if (*mode == 'a')
 438:             lseek(fd, 0L, 2);
 439:     } else
 440:         iop->_flag |= _IOREAD;
 441:     return(iop);
 442: }
 443: system(s)
 444: char *s;
 445: {
 446:     int status, pid, w;
 447:     register int (*istat)(), (*qstat)();
 448: 
 449:     while((pid = fork()) == -1)sleep(2);
 450:     if (pid == 0) {
 451:         execl("/bin/sh", "sh", "-c", s, 0);
 452:         _exit(127);
 453:     }
 454:     istat = signal(SIGINT, SIG_IGN);
 455:     qstat = signal(SIGQUIT, SIG_IGN);
 456:     while ((w = wait(&status)) != pid && w != -1)
 457:         ;
 458:     if (w == -1)
 459:         status = -1;
 460:     signal(SIGINT, istat);
 461:     signal(SIGQUIT, qstat);
 462:     return(status);
 463: }
 464: 
 465: char *
 466: getpass(prompt)
 467: char *prompt;
 468: {
 469:     struct sgttyb ttyb;
 470:     int flags;
 471:     register char *p;
 472:     register c;
 473:     FILE *fi = NULL;
 474:     static char pbuf[9];
 475:     int (*signal())();
 476:     int (*sig)();
 477: 
 478:     /*	modified because Cory needs super-user to stty /dev/tty */
 479:     if ((fi = fopen("/dev/tty", "r")) == NULL)
 480:         fi = stdin;
 481:     else
 482:         setbuf(fi, (char *)NULL);
 483:     if(gtty(fileno(fi),&ttyb) < 0){
 484:         pbuf[0] = 0;
 485:         return(pbuf);
 486:     }
 487:     /*
 488: 	if(gtty(0,&ttyb) >= 0)fi = stdin;
 489: 	else if(gtty(2,&ttyb) >= 0)fi = stderr;
 490: 	else {
 491: 		pbuf[0] = 0;
 492: 		return(pbuf);
 493: 		}
 494: 	*/
 495:     sig = signal(SIGINT, SIG_IGN);
 496:     flags = ttyb.sg_flags;
 497:     ttyb.sg_flags &= ~ECHO;
 498:     if(stty(fileno(fi), &ttyb) < 0) perror("stty:");
 499:     fprintf(stderr, prompt);
 500:     for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
 501:         if (p < &pbuf[8])
 502:             *p++ = c;
 503:     }
 504:     *p = '\0';
 505:     fprintf(stderr, "\n");
 506:     ttyb.sg_flags = flags;
 507:     stty(fileno(fi), &ttyb);
 508:     signal(SIGINT, sig);
 509:     if (fi != stdin)
 510:         fclose(fi);
 511:     return(pbuf);
 512: }
 513: /*
 514:  * Compare strings (at most n bytes):  s1>s2: >0  s1==s2: 0  s1<s2: <0
 515:  */
 516: 
 517: strncmp(s1, s2, n)
 518: register char *s1, *s2;
 519: register n;
 520: {
 521: 
 522:     while (--n >= 0 && *s1 == *s2++)
 523:         if (*s1++ == '\0')
 524:             return(0);
 525:     return(n<0 ? 0 : *s1 - *--s2);
 526: }
 527: /* end of non-vax v7 routines */
 528: # endif
 529: /*
 530: 	PwdCurrent()
 531: 
 532: 	Read the password file and return pwd to
 533: 	entry for current user.
 534: 	Return NULL if error.
 535: 
 536: 	This code is a little screwed up because of the conventions
 537: 	regarding the state of the utmp file after someone su's--
 538: 	either to root or to another person.
 539: 	The final decision was to return getpwuid(getuid) if
 540: 	the machine has one login name per userid,
 541: 	and if there are multiple login names per userid, to
 542: 	search the passwd file for the getlogin() name and return
 543: 	the passwd file entry for that.
 544: 	If there is no utmp entry, just use the userid.
 545: 	This means that people who su on machine with multiple
 546: 	user-id's will get the passwd entry for the account recorded
 547: 	in the utmp file, not their current userid.
 548: */
 549: struct passwd *
 550: PwdCurrent()
 551: {
 552:     register struct passwd *pwd;
 553:     register char *sn;
 554: 
 555: # ifdef MULTNAMS
 556:     sn = getlogin();
 557:     if(sn != NULL && sn[0] != 0 && sn[0] != ' '){
 558:         pwd = getpwnam(sn);
 559:         if(pwd != NULL)return(pwd);
 560:     }
 561: # endif
 562: 
 563:     return(getpwuid(uidmask(getuid())));
 564: }
 565: /*VARARGS0*/
 566: debug(s,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,t)
 567: char *s; {
 568:     if(debugflg){
 569:         printf(s,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,t);
 570:         putchar('\n');
 571:         }
 572:     }

Defined functions

PwdCurrent defined in line 549; used 3 times
endpwent defined in line 328; used 2 times
expandcc defined in line 136; used 1 times
getlogin defined in line 397; used 2 times
getpass defined in line 465; used 2 times
getpwdf defined in line 154; used 1 times
getpwent defined in line 346; used 5 times
getpwuid defined in line 299; used 6 times
getsize defined in line 258; never used
gettime defined in line 253; never used
ioctl defined in line 243; used 4 times
isatty defined in line 110; used 10 times
myttyname defined in line 124; used 2 times
pwskip defined in line 336; used 6 times
setgid defined in line 24; used 1 times
setpwent defined in line 319; used 2 times
strncmp defined in line 517; used 9 times
submit defined in line 19; used 1 times
system defined in line 443; used 3 times
ttyname defined in line 113; never used
uidfromsn defined in line 83; used 1 times

Defined variables

EMPTY defined in line 314; used 1 times
FILE defined in line 422; never used
PASSWD defined in line 313; used 2 times
debugflg defined in line 14; used 1 times
environ defined in line 241; used 2 times
line defined in line 316; used 1 times
passwd defined in line 317; used 12 times
shomedir defined in line 12; used 3 times

Defined struct's

v6utmp defined in line 197; never used

Defined macros

ttyname defined in line 132; used 5 times
Last modified: 1980-07-16
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1693
Valid CSS Valid XHTML 1.0 Strict