|
|
1.1 root 1: /* /sccs/src/cmd/uucp/s.gwd.c
2: gwd.c 1.3 8/30/84 17:37:28
3: */
4: #include "uucp.h"
5: VERSION(@(#)gwd.c 1.3);
6:
7: /*
8: * gwd - get working directory
9: * Uid and Euid are global
10: * return
11: * 0 - ok
12: * FAIL - failed
13: */
14:
15: gwd(wkdir)
16: char *wkdir;
17: {
18: FILE *fp;
19: char cmd[BUFSIZ];
20:
21: *wkdir = '\0';
22: (void) sprintf(cmd, "%s pwd 2>&-", PATH);
23:
24: #ifndef V7
25: (void) setuid(Uid);
26: fp = popen(cmd, "r");
27: (void) setuid(Euid);
28: #else
29: fp = popen(cmd, "r");
30: #endif
31:
32: if (fp==NULL)
33: return(FAIL);
34: if (fgets(wkdir, MAXFULLNAME, fp) == NULL) {
35: (void) pclose(fp);
36: return(FAIL);
37: }
38: if (wkdir[strlen(wkdir)-1] == '\n')
39: wkdir[strlen(wkdir)-1] = '\0';
40: (void) pclose(fp);
41: return(0);
42: }
43:
44:
45: /*
46: * uidstat(file, &statbuf)
47: * This is a stat call with the uid set from Euid to Uid.
48: * Used from uucp.c and uux.c to permit file copies
49: * from directories that may not be searchable by other.
50: * return:
51: * same as stat()
52: */
53:
54: #ifndef uidstat
55:
56: int
57: uidstat(file, buf)
58: char *file;
59: struct stat *buf;
60: {
61: #ifndef V7
62: register ret;
63:
64: (void) setuid(Uid);
65: ret = stat(file, buf);
66: (void) setuid(Euid);
67: return(ret);
68: #else
69: int ret;
70: register pid, rpid;
71:
72: if ((pid = vfork()) == 0) {
73: (void) setuid(Uid);
74: _exit(stat(file, buf));
75: }
76: ret = 1;
77: while ((rpid = wait(&ret)) != pid && rpid != -1)
78: ;
79: return (rpid == -1 ? 1 : ret);
80: #endif
81: }
82: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.