#include #include #include #define PATH_LEN 256 int main(int argc,char **argv); char *getcwd(char *buff,int size); char *getcxd(char *buff,int size); char *getCmdResult(char *buff,int size,char *cmd); int fork(char *cmd); int main(argc,argv) int argc; char *argv[]; { char buff[1024]; printf("cwd:%s\n",getcwd(buff,sizeof(buff))); printf("cxd:%s\n",getcxd(buff,sizeof(buff))); return 0; } char *getcwd(buff,size) char *buff; int size; { return(getCmdResult(buff,size,"pd")); } char *getcxd(buff,size) char *buff; int size; { return(getCmdResult(buff,size,"pd -x")); } char *getCmdResult(buff,size,cmd) char *buff; int size; char *cmd; { int ph; int h1; char *p; if((ph=open("/pipe",FAM_READ|FAM_WRITE))==-1){ return NULL; } h1=dup(1); close(1); dup(ph); fork(cmd); close(1); dup(h1); close(h1); p=buff; while(read(ph,p,1)==1){ size--; if(size==0){ *p='\0'; close(ph); return buff; } if(*p=='\n'){ *p='\0'; close(ph); return buff; } p++; } close(ph); return NULL; } int fork(cmd) char *cmd; { extern char **_environ; extern int os9forkc(); int pid; char procs[PATH_LEN]; int argc=0; char *argv[32]; char **envp=_environ; int stack=0; int priority=0; int pathcnt=3; char *p,*a; strcpy(procs,cmd); a=procs; while(*a!='\0'){ while(*a=='\x20') *a++='\0'; if(*a=='\0') break; if((p=strchr(a,'\x20'))!=NULL) *p++='\0'; argv[argc++]=a; if(p==NULL) break; a=p; } argv[argc]=NULL; pid=os9exec(os9forkc,argv[0],argv,envp,stack,priority,pathcnt); return(pid); }