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

Defined functions

gwd defined in line 13; used 2 times
rpclose defined in line 78; used 2 times
rpopen defined in line 48; used 5 times

Defined variables

popen_pid defined in line 46; used 2 times
sccsid defined in line 2; never used

Defined macros

RDR defined in line 44; used 2 times
WTR defined in line 45; used 2 times
tst defined in line 43; used 3 times
Last modified: 1983-07-03
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 705
Valid CSS Valid XHTML 1.0 Strict