bug fixes and changes from Rick Adams
[unix-history] / usr / src / usr.bin / uucp / port / getwd.c
CommitLineData
f058ce94 1#ifndef lint
46b15d8a 2static char sccsid[] = "@(#)getwd.c 5.3 (Berkeley) %G%";
f058ce94
SL
3#endif
4
5#include "uucp.h"
6
46b15d8a
RC
7/*
8 * get working directory
f058ce94 9 *
46b15d8a 10 * return codes SUCCESS | FAIL
f058ce94
SL
11 */
12
13gwd(wkdir)
14register char *wkdir;
15{
16 register FILE *fp;
17 extern FILE *rpopen();
18 extern int rpclose();
19 register char *c;
20
46b15d8a
RC
21#ifdef BSD4_2
22 if (getwd(wkdir) == 0)
23 return FAIL;
24#else !BSD4_2
25# ifdef VMS
26 getwd(wkdir); /* Call Eunice C library version instead */
27#else !VMS
f058ce94 28 *wkdir = '\0';
46b15d8a
RC
29 if ((fp = rpopen("PATH=/bin:/usr/bin:/usr/ucb;pwd 2>&-", "r")) == NULL)
30 return FAIL;
31 if (fgets(wkdir, 100, fp) == NULL) {
32 rpclose(fp);
33 return FAIL;
f058ce94
SL
34 }
35 if (*(c = wkdir + strlen(wkdir) - 1) == '\n')
36 *c = '\0';
37 rpclose(fp);
46b15d8a
RC
38# endif !VMS
39#endif !BSD4_2
40 return SUCCESS;
f058ce94
SL
41}
42
43/*
46b15d8a 44 * gwd uses 'reverting' version of popen
f058ce94
SL
45 * which runs process with permissions of real gid/uid
46 * rather than the effective gid/uid.
f058ce94 47 */
f058ce94
SL
48#include <signal.h>
49#define tst(a,b) (*mode == 'r'? (b) : (a))
50#define RDR 0
51#define WTR 1
52static int popen_pid[20];
53
54FILE *
55rpopen(cmd,mode)
56char *cmd;
57char *mode;
58{
59 int p[2];
60 register myside, hisside, pid;
61
62 if(pipe(p) < 0)
63 return NULL;
64 myside = tst(p[WTR], p[RDR]);
65 hisside = tst(p[RDR], p[WTR]);
66 if((pid = fork()) == 0) {
67 /* myside and hisside reverse roles in child */
68 close(myside);
69 dup2(hisside, tst(0, 1));
70 close(hisside);
71 /* revert permissions */
72 setgid(getgid());
73 setuid(getuid());
74 execl("/bin/sh", "sh", "-c", cmd, (char *)0);
75 _exit(1);
76 }
77 if(pid == -1)
78 return NULL;
79 popen_pid[myside] = pid;
80 close(hisside);
81 return(fdopen(myside, mode));
82}
83
84rpclose(ptr)
85FILE *ptr;
86{
87 register f, r, (*hstat)(), (*istat)(), (*qstat)();
88 int status;
89
90 f = fileno(ptr);
91 fclose(ptr);
92 istat = signal(SIGINT, SIG_IGN);
93 qstat = signal(SIGQUIT, SIG_IGN);
94 hstat = signal(SIGHUP, SIG_IGN);
95 while((r = wait(&status)) != popen_pid[f] && r != -1)
96 ;
97 if(r == -1)
98 status = -1;
99 signal(SIGINT, istat);
100 signal(SIGQUIT, qstat);
101 signal(SIGHUP, hstat);
46b15d8a 102 return status;
f058ce94 103}