Research V7 development
authorS. I. Feldman <sif@research.uucp>
Thu, 15 Mar 1979 05:39:00 +0000 (00:39 -0500)
committerS. I. Feldman <sif@research.uucp>
Thu, 15 Mar 1979 05:39:00 +0000 (00:39 -0500)
Work on file usr/src/cmd/make/dosys.c

Synthesized-from: v7

usr/src/cmd/make/dosys.c [new file with mode: 0644]

diff --git a/usr/src/cmd/make/dosys.c b/usr/src/cmd/make/dosys.c
new file mode 100644 (file)
index 0000000..f0ef709
--- /dev/null
@@ -0,0 +1,170 @@
+#include "defs"
+#include <signal.h>
+
+dosys(comstring,nohalt)
+register char *comstring;
+int nohalt;
+{
+register int status;
+
+if(metas(comstring))
+       status = doshell(comstring,nohalt);
+else   status = doexec(comstring);
+
+return(status);
+}
+
+
+
+metas(s)   /* Are there are any  Shell meta-characters? */
+register char *s;
+{
+register char c;
+
+while( (funny[c = *s++] & META) == 0 )
+       ;
+return( c );
+}
+\f
+doshell(comstring,nohalt)
+char *comstring;
+int nohalt;
+{
+if((waitpid = fork()) == 0)
+       {
+       enbint(SIG_DFL);
+       doclose();
+
+       execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0);
+       fatal("Couldn't load Shell");
+       }
+
+return( await() );
+}
+
+
+
+
+await()
+{
+int intrupt();
+int status;
+register int pid;
+
+enbint(SIG_IGN);
+while( (pid = wait(&status)) != waitpid)
+       if(pid == -1)
+               fatal("bad wait code");
+waitpid = 0;
+enbint(intrupt);
+return(status);
+}
+
+
+
+
+
+
+doclose()      /* Close open directory files before exec'ing */
+{
+register struct opendir *od;
+for (od = firstod; od; od = od->nxtopendir)
+       if (od->dirfc != NULL)
+               fclose(od->dirfc);
+}
+\f
+
+
+
+
+doexec(str)
+register char *str;
+{
+register char *t;
+char *argv[200];
+register char **p;
+
+while( *str==' ' || *str=='\t' )
+       ++str;
+if( *str == '\0' )
+       return(-1);     /* no command */
+
+p = argv;
+for(t = str ; *t ; )
+       {
+       *p++ = t;
+       while(*t!=' ' && *t!='\t' && *t!='\0')
+               ++t;
+       if(*t)
+               for( *t++ = '\0' ; *t==' ' || *t=='\t'  ; ++t)
+                       ;
+       }
+
+*p = NULL;
+
+if((waitpid = fork()) == 0)
+       {
+       enbint(SIG_DFL);
+       doclose();
+       enbint(intrupt);
+       execvp(str, argv);
+       fatal1("Cannot load %s",str);
+       }
+
+return( await() );
+}
+\f
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
+
+
+touch(force, name)
+int force;
+char *name;
+{
+struct stat stbuff;
+char junk[1];
+int fd;
+
+if( stat(name,&stbuff) < 0)
+       if(force)
+               goto create;
+       else
+               {
+               fprintf(stderr, "touch: file %s does not exist.\n", name);
+               return;
+               }
+
+if(stbuff.st_size == 0)
+       goto create;
+
+if( (fd = open(name, 2)) < 0)
+       goto bad;
+
+if( read(fd, junk, 1) < 1)
+       {
+       close(fd);
+       goto bad;
+       }
+lseek(fd, 0L, 0);
+if( write(fd, junk, 1) < 1 )
+       {
+       close(fd);
+       goto bad;
+       }
+close(fd);
+return;
+
+bad:
+       fprintf(stderr, "Cannot touch %s\n", name);
+       return;
+
+create:
+       if( (fd = creat(name, 0666)) < 0)
+               goto bad;
+       close(fd);
+}