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