~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/libs/port/spawn.c

Version: ~ [ wine-1.1.33 ] ~ [ wine-1.1.32 ] ~ [ wine-1.1.31 ] ~ [ wine-1.1.30 ] ~ [ wine-1.1.29 ] ~ [ wine-1.1.28 ] ~ [ wine-1.1.27 ] ~ [ wine-1.1.26 ] ~ [ wine-1.1.25 ] ~ [ wine-1.1.24 ] ~ [ wine-1.1.23 ] ~ [ wine-1.1.22 ] ~ [ wine-1.1.21 ] ~ [ wine-1.1.20 ] ~ [ wine-1.1.19 ] ~ [ wine-1.1.18 ] ~ [ wine-1.1.17 ] ~ [ wine-1.1.16 ] ~ [ wine-1.1.15 ] ~ [ wine-1.1.14 ] ~ [ wine-1.1.13 ] ~ [ wine-1.1.12 ] ~ [ wine-1.1.11 ] ~ [ wine-1.1.10 ] ~ [ wine-1.1.9 ] ~ [ wine-1.1.8 ] ~ [ wine-1.1.7 ] ~ [ wine-1.0.1 ] ~ [ wine-1.1.6 ] ~ [ wine-1.1.5 ] ~ [ wine-1.1.4 ] ~ [ wine-1.1.3 ] ~ [ wine-1.1.2 ] ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~

  1 /*
  2  * spawnvp function
  3  *
  4  * Copyright 2003 Dimitrie O. Paun
  5  *
  6  * This library is free software; you can redistribute it and/or
  7  * modify it under the terms of the GNU Lesser General Public
  8  * License as published by the Free Software Foundation; either
  9  * version 2.1 of the License, or (at your option) any later version.
 10  *
 11  * This library is distributed in the hope that it will be useful,
 12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 14  * Lesser General Public License for more details.
 15  *
 16  * You should have received a copy of the GNU Lesser General Public
 17  * License along with this library; if not, write to the Free Software
 18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 19  */
 20 
 21 #include "config.h"
 22 #include "wine/port.h"
 23 
 24 #include <errno.h>
 25 #include <signal.h>
 26 #include <stdlib.h>
 27 #ifdef HAVE_SYS_WAIT_H
 28 #include <sys/wait.h>
 29 #endif
 30 #include <sys/stat.h>
 31 #ifdef HAVE_UNISTD_H
 32 # include <unistd.h>
 33 #endif
 34 
 35 #ifndef HAVE_SPAWNVP
 36 int spawnvp(int mode, const char *cmdname, const char *const argv[])
 37 {
 38 #ifndef HAVE__SPAWNVP
 39     int pid = 0, status, wret;
 40     struct sigaction dfl_act, old_act;
 41 
 42     if (mode == _P_OVERLAY)
 43     {
 44         execvp(cmdname, (char **)argv);
 45         /* if we get here it failed */
 46 #ifdef ENOTSUP
 47         if (errno != ENOTSUP)  /* exec fails on MacOS if the process has multiple threads */
 48 #endif
 49             return -1;
 50     }
 51 
 52     dfl_act.sa_handler = SIG_DFL;
 53     dfl_act.sa_flags = 0;
 54     sigemptyset( &dfl_act.sa_mask );
 55 
 56     if (mode == _P_WAIT) sigaction( SIGCHLD, &dfl_act, &old_act );
 57 
 58     pid = fork();
 59     if (pid == 0)
 60     {
 61         sigaction( SIGPIPE, &dfl_act, NULL );
 62         execvp(cmdname, (char **)argv);
 63         _exit(1);
 64     }
 65 
 66     if (pid != -1 && mode == _P_OVERLAY) exit(0);
 67 
 68     if (pid != -1 && mode == _P_WAIT)
 69     {
 70         while (pid != (wret = waitpid(pid, &status, 0)))
 71             if (wret == -1 && errno != EINTR) break;
 72 
 73         if (pid == wret && WIFEXITED(status)) pid = WEXITSTATUS(status);
 74         else pid = 255; /* abnormal exit with an abort or an interrupt */
 75     }
 76 
 77     if (mode == _P_WAIT) sigaction( SIGCHLD, &old_act, NULL );
 78     return pid;
 79 #else   /* HAVE__SPAWNVP */
 80     return _spawnvp(mode, cmdname, argv);
 81 #endif  /* HAVE__SPAWNVP */
 82 }
 83 #endif  /* HAVE_SPAWNVP */
 84 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.