V10/cmd/uucp/gwd.c
/* /sccs/src/cmd/uucp/s.gwd.c
gwd.c 1.3 8/30/84 17:37:28
*/
#include "uucp.h"
VERSION(@(#)gwd.c 1.3);
/*
* gwd - get working directory
* Uid and Euid are global
* return
* 0 - ok
* FAIL - failed
*/
gwd(wkdir)
char *wkdir;
{
FILE *fp;
char cmd[BUFSIZ];
*wkdir = '\0';
(void) sprintf(cmd, "%s pwd 2>&-", PATH);
#ifndef V7
(void) setuid(Uid);
fp = popen(cmd, "r");
(void) setuid(Euid);
#else
fp = popen(cmd, "r");
#endif
if (fp==NULL)
return(FAIL);
if (fgets(wkdir, MAXFULLNAME, fp) == NULL) {
(void) pclose(fp);
return(FAIL);
}
if (wkdir[strlen(wkdir)-1] == '\n')
wkdir[strlen(wkdir)-1] = '\0';
(void) pclose(fp);
return(0);
}
/*
* uidstat(file, &statbuf)
* This is a stat call with the uid set from Euid to Uid.
* Used from uucp.c and uux.c to permit file copies
* from directories that may not be searchable by other.
* return:
* same as stat()
*/
#ifndef uidstat
int
uidstat(file, buf)
char *file;
struct stat *buf;
{
#ifndef V7
register ret;
(void) setuid(Uid);
ret = stat(file, buf);
(void) setuid(Euid);
return(ret);
#else
int ret;
register pid, rpid;
if ((pid = vfork()) == 0) {
(void) setuid(Uid);
_exit(stat(file, buf));
}
ret = 1;
while ((rpid = wait(&ret)) != pid && rpid != -1)
;
return (rpid == -1 ? 1 : ret);
#endif
}
#endif