xref: /csrg-svn/usr.bin/uucp/port/getwd.c (revision 13656)
1*13656Ssam #ifndef lint
2*13656Ssam static char sccsid[] = "@(#)getwd.c	5.1 (Berkeley) 07/02/83";
3*13656Ssam #endif
4*13656Ssam 
5*13656Ssam #include "uucp.h"
6*13656Ssam 
7*13656Ssam /*******
8*13656Ssam  *	gwd(wkdir)	get working directory
9*13656Ssam  *
10*13656Ssam  *	return codes  0 | FAIL
11*13656Ssam  */
12*13656Ssam 
13*13656Ssam gwd(wkdir)
14*13656Ssam register char *wkdir;
15*13656Ssam {
16*13656Ssam 	register FILE *fp;
17*13656Ssam 	extern FILE *rpopen();
18*13656Ssam 	extern int rpclose();
19*13656Ssam 	register char *c;
20*13656Ssam 
21*13656Ssam 	*wkdir = '\0';
22*13656Ssam 	/* PATH added to rpopen.  Suggested by Henry Spencer (utzoo!henry) */
23*13656Ssam 	if ((fp = rpopen("PATH=/bin:/usr/bin;pwd 2>&-", "r")) == NULL)
24*13656Ssam 		return(FAIL);
25*13656Ssam 	if (fgets(wkdir, 100, fp) == NULL) {
26*13656Ssam 		pclose(fp);
27*13656Ssam 		return(FAIL);
28*13656Ssam 	}
29*13656Ssam 	if (*(c = wkdir + strlen(wkdir) - 1) == '\n')
30*13656Ssam 		*c = '\0';
31*13656Ssam 	rpclose(fp);
32*13656Ssam 	return(0);
33*13656Ssam }
34*13656Ssam 
35*13656Ssam /*
36*13656Ssam  * rti!trt: gwd uses 'reverting' version of popen
37*13656Ssam  * which runs process with permissions of real gid/uid
38*13656Ssam  * rather than the effective gid/uid.
39*13656Ssam  * Bug noted by we13!rjk  (Randy King).
40*13656Ssam  */
41*13656Ssam /* @(#)popen.c	4.1 (Berkeley) 12/21/80 */
42*13656Ssam #include <signal.h>
43*13656Ssam #define	tst(a,b)	(*mode == 'r'? (b) : (a))
44*13656Ssam #define	RDR	0
45*13656Ssam #define	WTR	1
46*13656Ssam static	int	popen_pid[20];
47*13656Ssam 
48*13656Ssam FILE *
49*13656Ssam rpopen(cmd,mode)
50*13656Ssam char	*cmd;
51*13656Ssam char	*mode;
52*13656Ssam {
53*13656Ssam 	int p[2];
54*13656Ssam 	register myside, hisside, pid;
55*13656Ssam 
56*13656Ssam 	if(pipe(p) < 0)
57*13656Ssam 		return NULL;
58*13656Ssam 	myside = tst(p[WTR], p[RDR]);
59*13656Ssam 	hisside = tst(p[RDR], p[WTR]);
60*13656Ssam 	if((pid = fork()) == 0) {
61*13656Ssam 		/* myside and hisside reverse roles in child */
62*13656Ssam 		close(myside);
63*13656Ssam 		dup2(hisside, tst(0, 1));
64*13656Ssam 		close(hisside);
65*13656Ssam 		/* revert permissions */
66*13656Ssam 		setgid(getgid());
67*13656Ssam 		setuid(getuid());
68*13656Ssam 		execl("/bin/sh", "sh", "-c", cmd, (char *)0);
69*13656Ssam 		_exit(1);
70*13656Ssam 	}
71*13656Ssam 	if(pid == -1)
72*13656Ssam 		return NULL;
73*13656Ssam 	popen_pid[myside] = pid;
74*13656Ssam 	close(hisside);
75*13656Ssam 	return(fdopen(myside, mode));
76*13656Ssam }
77*13656Ssam 
78*13656Ssam rpclose(ptr)
79*13656Ssam FILE *ptr;
80*13656Ssam {
81*13656Ssam 	register f, r, (*hstat)(), (*istat)(), (*qstat)();
82*13656Ssam 	int status;
83*13656Ssam 
84*13656Ssam 	f = fileno(ptr);
85*13656Ssam 	fclose(ptr);
86*13656Ssam 	istat = signal(SIGINT, SIG_IGN);
87*13656Ssam 	qstat = signal(SIGQUIT, SIG_IGN);
88*13656Ssam 	hstat = signal(SIGHUP, SIG_IGN);
89*13656Ssam 	while((r = wait(&status)) != popen_pid[f] && r != -1)
90*13656Ssam 		;
91*13656Ssam 	if(r == -1)
92*13656Ssam 		status = -1;
93*13656Ssam 	signal(SIGINT, istat);
94*13656Ssam 	signal(SIGQUIT, qstat);
95*13656Ssam 	signal(SIGHUP, hstat);
96*13656Ssam 	return(status);
97*13656Ssam }
98