|
|
1.1 root 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: # ifndef CC
15: submit(a) {}
16: # endif
17:
18: # ifdef FUID
19: setgid() {};
20: # endif
21:
22: /*
23: Set the owner uid/gid of a file.
24: On v7, this is done by the chown command
25: with three args - (file, uid, gid).
26: On Vanilla V6 this is done using the
27: top byte of the second parameter as the gid byte.
28: On Berkeley Funny uids on V6, no gid is specified.
29: */
30: mchown(sfn,uid,gid)
31: char *sfn;
32: int uid;
33: int gid;
34: {
35: # ifndef V6
36: chown(sfn,uid,gid);
37: # else
38: # ifndef FUID
39: uid = uidmask(uid);
40: uid = ((gid&0377) << 8) | (uid & 0377);
41: # endif
42: chown(sfn,uid);
43: # endif
44: }
45:
46:
47: char vaxtovax;
48: long fixuplong(a)
49: long a; {
50: # ifdef ISVAX
51: register char *p,c1,c2;
52: char c3,c4;
53: if(!vaxtovax){
54: p = (char*) &a;
55: c1 = *p++;
56: c2 = *p++;
57: c3 = *p++;
58: c4 = *p++;
59: p = (char*) &a;
60: *p++ = c3;
61: *p++ = c4;
62: *p++ = c1;
63: *p++ = c2;
64: }
65: # endif
66: return(a);
67: }
68: /*
69: SnFromuid(uid)
70:
71: The login name corresponding to uid.
72: Reads the password file.
73: Successive calls overwrite the static string returned.
74: Returns NULL if error.
75: */
76: char *SnFromUid(uid)
77: register int uid;
78: {
79: register struct passwd *pwd;
80: static int ouid = -1;
81: static char oresult[20] = "";
82: uid = uidmask(uid);
83: if(uid == ouid)
84: return(oresult);
85: # ifdef HPASSWD
86: if(getname(uid,oresult) == 0){
87: ouid = uid;
88: return(oresult);
89: }
90: # endif
91: pwd = getpwuid(uid);
92: if(pwd != NULL){
93: strcpy(oresult,pwd->pw_name);
94: ouid = uid;
95: return(oresult);
96: }
97: return(NULL);
98: }
99:
100: /* handle the regular unix and local mods difference for user id's */
101: /* this call returns the 1 word uid = to what getuid will return */
102: guid(uid,gid){
103: uid = uidmask(uid);
104: # ifdef FUID
105: return((uid & 0377) | (gid << 8));
106: # else
107: return(uid);
108: # endif
109: }
110:
111: # ifdef OLDTTY
112: isatty(i){
113: return(ttyn(i) != 'x');
114: }
115: char *ttyname(i){ /* return NULL if not TTY */
116: char c;
117: static char ttystr[] = "/dev/ttyx";
118: c = ttyn(i);
119: ttystr[8] = c;
120: return(c == 'x' ? NULL : ttystr);
121: }
122: # endif
123:
124: # ifdef CCTTY
125: # undef ttyname()
126: myttyname(i){ /* return NULL for non tty */
127: static char s[15],*p;
128: p = ttyname(i);
129: if(p == NULL)return(NULL);
130: strcpy(s,"/dev/");
131: strcat(s,p);
132: return(s);
133: }
134: # define ttyname(S) myttyname(S)
135: # endif
136:
137: /* get passwd from passwdf */
138: getpwdf(pwd)
139: struct passwd *pwd; {
140: # ifdef PASSWDF
141: # ifndef TESTING
142: register char *p, *q;
143: char buf1[BUFSIZ], found;
144: FILE *pw;
145: pwd->pw_passwd[0] = 0;
146: pw = fopen("/etc/passwdf","r");
147: if(pw == NULL) return;
148: found = 0;
149: while(fgets(buf1,BUFSIZ,pw) != NULL){
150: for(p=buf1; *p && *p != ':'; p++);
151: *p = 0;
152: if(strcmp(buf1,pwd->pw_name) == 0){
153: found = 1;
154: break;
155: }
156: }
157: fclose(pw);
158: if(!found)return;
159: q = ++p;
160: for(;*p && *p != ':';p++);
161: *p = 0;
162: strcpy(pwd->pw_passwd,q);
163: /*
164: debug("user %s passwd %s %s",pwd->pw_name,pwd->pw_passwd);
165: */
166: # endif
167: # endif
168: }
169: /*
170: these are all the v7 routines not available on the v6 machines
171: */
172:
173: # ifdef V6
174:
175: char **environ; /* global environment pointer */
176:
177: ioctl(a,b,c){
178: return(0); /* always succeeds */
179: }
180: long atol(s)
181: register char *s; {
182: long i = 0;
183: while('0' <= *s && *s <= '9')
184: i = i * 10 + (*s++ - '0');
185: return(i);
186: }
187: long gettime(){
188: long tt;
189: time(&tt);
190: return(tt);
191: }
192: long getsize(str)
193: struct stat *str; {
194: long wk;
195: wk = ((long)(str->st_size0 & 0377)) << 16;
196: wk += (long)((unsigned)str->st_size1);
197: return(wk);
198: }
199: /*
200: getenv("HOME")
201:
202: always returns home directory.
203: returns NULL if there is error.
204: */
205: char *getenv(){
206: register char *shdir = NULL;
207: register struct passwd *pwd;
208: register int it;
209: if(shomedir[0] != 0)return(shomedir);
210: it = ttyn(2);
211: # ifdef OLDTTY
212: if(it == 'x')it = ttyn(1);
213: if(it == 'x')it = ttyn(0);
214: if(it != 'x' && hget(it) == 0)shdir = hgethome();
215: # endif
216: # ifdef CCTTY
217: if(it == -1)it = ttyn(1);
218: if(it == -1)it = ttyn(0);
219: if(it != -1 && hget(it) == 0)shdir = hgethome();
220: # endif
221: if(shdir == NULL){
222: pwd = PwdCurrent();
223: if(pwd != NULL)shdir = pwd->pw_dir;
224: }
225: if(shdir != NULL)strcpy(shomedir,shdir);
226: return(shdir);
227: }
228:
229: /* doesn't handle split passwd files */
230: struct passwd *
231: getpwuid(uid)
232: register uid;
233: {
234: register struct passwd *p;
235: struct passwd *getpwent();
236:
237: uid = uidmask(uid);
238: setpwent();
239: while( (p = getpwent()) && guid(p->pw_uid,p->pw_gid) != uid );
240: endpwent();
241: return(p);
242: }
243:
244: static char PASSWD[] = "/etc/passwd";
245: static char EMPTY[] = "";
246: static FILE *pwf = NULL;
247: static char line[BUFSIZ+1];
248: static struct passwd passwd;
249:
250: setpwent()
251: {
252: if( pwf == NULL )
253: pwf = fopen( PASSWD, "r" );
254: else
255: rewind( pwf );
256: }
257:
258: endpwent()
259: {
260: if( pwf != NULL ){
261: fclose( pwf );
262: pwf = NULL;
263: }
264: }
265:
266: static char *
267: pwskip(p)
268: register char *p;
269: {
270: while( *p && *p != ':' )
271: ++p;
272: if( *p ) *p++ = 0;
273: return(p);
274: }
275:
276: struct passwd *
277: getpwent()
278: {
279: register char *p;
280:
281: if (pwf == NULL) {
282: if( (pwf = fopen( PASSWD, "r" )) == NULL )
283: return(0);
284: }
285: p = fgets(line, BUFSIZ, pwf);
286: if (p==NULL)
287: return(0);
288: passwd.pw_name = p;
289: p = pwskip(p);
290: passwd.pw_passwd = p;
291: p = pwskip(p);
292: passwd.pw_uid = atoi(p);
293: passwd.pw_uid = uidmask(passwd.pw_uid);
294: p = pwskip(p);
295: passwd.pw_gid = atoi(p);
296: passwd.pw_quota = 0;
297: passwd.pw_comment = EMPTY;
298: p = pwskip(p);
299: passwd.pw_gecos = p;
300: p = pwskip(p);
301: passwd.pw_dir = p;
302: p = pwskip(p);
303: passwd.pw_shell = p;
304: while(*p && *p != '\n') p++;
305: *p = '\0';
306: return(&passwd);
307: }
308:
309: struct passwd *
310: getpwnam(name)
311: char *name;
312: {
313: register struct passwd *p;
314: struct passwd *getpwent();
315:
316: setpwent();
317: while( (p = getpwent()) && strcmp(name,p->pw_name) );
318: endpwent();
319: return(p);
320: }
321: /*
322: getlogin()
323:
324: Return current user name by looking at /etc/utmp.
325: Returns NULL if not found.
326: */
327: char *getlogin()
328: {
329: struct utmp utmpstr;
330: static char snSave[10];
331: register char *sttyname,*s;
332: register FILE *fp;
333:
334: sttyname = ttyname(2);
335: if(sttyname == NULL)sttyname = ttyname(1);
336: if(sttyname == NULL)sttyname = ttyname(0);
337: if(sttyname == NULL)return(NULL);
338:
339: fp = fopen("/etc/utmp","r");
340: if(fp == NULL)return(NULL);
341:
342: snSave[0] = 0;
343: while(fread(&utmpstr,1,sizeof utmpstr,fp) == sizeof utmpstr){
344: # ifdef OLDTTY
345: if(utmpstr.ut_tty == sttyname[8]){
346: # else
347: if(strcmp(utmpstr.ut_line,sttyname+5) == 0){
348: # endif
349: utmpstr.ut_tty = 0;
350: strcpy(snSave,utmpstr.ut_name);
351: }
352: }
353:
354: fclose(fp);
355: s = snSave;
356: while(*s != 0 && *s != ' ')s++;
357: *s = 0;
358: if(snSave[0] == 0)return(NULL);
359: return(snSave);
360: }
361: /*
362: * Unix routine to do an "fopen" on file descriptor
363: * The mode has to be repeated because you can't query its
364: * status
365: */
366:
367: FILE *
368: fdopen(fd, mode)
369: register char *mode;
370: {
371: extern int errno;
372: register FILE *iop;
373: extern FILE *_lastbuf;
374:
375: for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT); iop++)
376: if (iop >= _lastbuf)
377: return(NULL);
378: iop->_cnt = 0;
379: iop->_file = fd;
380: if (*mode != 'r') {
381: iop->_flag |= _IOWRT;
382: if (*mode == 'a')
383: lseek(fd, 0L, 2);
384: } else
385: iop->_flag |= _IOREAD;
386: return(iop);
387: }
388: system(s)
389: char *s;
390: {
391: int status, pid, w;
392: register int (*istat)(), (*qstat)();
393:
394: while((pid = fork()) == -1)sleep(2);
395: if (pid == 0) {
396: execl("/bin/sh", "sh", "-c", s, 0);
397: _exit(127);
398: }
399: istat = signal(SIGINT, SIG_IGN);
400: qstat = signal(SIGQUIT, SIG_IGN);
401: while ((w = wait(&status)) != pid && w != -1)
402: ;
403: if (w == -1)
404: status = -1;
405: signal(SIGINT, istat);
406: signal(SIGQUIT, qstat);
407: return(status);
408: }
409:
410: char *
411: getpass(prompt)
412: char *prompt;
413: {
414: struct sgttyb ttyb;
415: int flags;
416: register char *p;
417: register c;
418: FILE *fi = NULL;
419: static char pbuf[9];
420: int (*signal())();
421: int (*sig)();
422:
423: /* modified because Cory needs super-user to stty /dev/tty */
424: # ifndef CORY
425: if ((fi = fopen("/dev/tty", "r")) == NULL)
426: fi = stdin;
427: else
428: setbuf(fi, (char *)NULL);
429: gtty(fileno(fi), &ttyb);
430: # else
431: if(gtty(0,&ttyb) >= 0)fi = stdin;
432: else if(gtty(2,&ttyb) >= 0)fi = stderr;
433: else {
434: pbuf[0] = 0;
435: return(pbuf);
436: }
437: # endif
438: sig = signal(SIGINT, SIG_IGN);
439: flags = ttyb.sg_flags;
440: ttyb.sg_flags &= ~ECHO;
441: if(stty(fileno(fi), &ttyb) < 0) perror("stty:");
442: fprintf(stderr, prompt);
443: for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
444: if (p < &pbuf[8])
445: *p++ = c;
446: }
447: *p = '\0';
448: fprintf(stderr, "\n");
449: ttyb.sg_flags = flags;
450: stty(fileno(fi), &ttyb);
451: signal(SIGINT, sig);
452: # ifndef CORY
453: if (fi != stdin)
454: fclose(fi);
455: # endif
456: return(pbuf);
457: }
458: /* end of non-vax v7 routines */
459: # endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.