Skip to content
Snippets Groups Projects
run_unix.c 828 B
Newer Older
  • Learn to ignore specific revisions
  • // Copyright 2013 The Go Authors.  All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.
    
    
    // +build darwin dragonfly freebsd linux netbsd openbsd solaris
    
    
    #include <u.h>
    #include <errno.h>
    #include <sys/wait.h>
    #define NOPLAN9DEFINES
    #include <libc.h>
    
    int
    runcmd(char **argv)
    {
    	int pid, pid1, status;
    	
    	switch(pid = fork()) {
    	case -1:
    		return -1;
    	case 0:
    		execvp(argv[0], argv);
    
    		fprint(2, "exec %s: %r\n", argv[0]);
    
    		_exit(1);
    	}
    	
    	while((pid1 = wait(&status)) < 0) {
    		if(errno != EINTR) {
    			werrstr("waitpid: %r");
    			return -1;
    		}
    	}
    	if(pid1 != pid) {
    		werrstr("unexpected pid in wait");
    		return -1;
    	}
    	if(!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
    		werrstr("unsuccessful exit status %#x", status);
    		return -1;
    	}
    	return 0;
    }