Main Page | Modules | Data Structures | File List | Data Fields | Related Pages

Exec functions


Functions

int di_exec_env_full (const char *path, const char *const argv[], const char *const envp[], di_io_handler *stdout_handler, di_io_handler *stderr_handler, void *io_user_data, di_process_handler *parent_prepare_handler, void *parent_prepare_user_data, di_process_handler *child_prepare_handler, void *child_prepare_user_data)
int di_exec_env (const char *path, const char *const argv[], const char *const envp[])
int di_exec_full (const char *path, const char *const argv[], di_io_handler *stdout_handler, di_io_handler *stderr_handler, void *io_user_data, di_process_handler *parent_prepare_handler, void *parent_prepare_user_data, di_process_handler *child_prepare_handler, void *child_prepare_user_data)
int di_exec (const char *path, const char *const argv[])
int di_exec_shell_full (const char *const cmd, di_io_handler *stdout_handler, di_io_handler *stderr_handler, void *io_user_data, di_process_handler *parent_prepare_handler, void *parent_prepare_user_data, di_process_handler *child_prepare_handler, void *child_prepare_user_data)
int di_exec_shell (const char *const cmd)
int di_exec_shell_log (const char *const cmd)
int di_exec_mangle_status (int status)
int di_execlog (const char *const cmd) __attribute__((deprecated))

Variables

di_io_handler di_exec_io_log
di_process_handler di_exec_prepare_chdir
di_process_handler di_exec_prepare_chroot

Function Documentation

int di_exec const char *  path,
const char *const   argv[]
[inline, static]
 

execv like call

Parameters:
path executable with path
argv NULL-terminated area of char pointer
Returns:
status or error
00114 {
00115   return di_exec_full (path, argv, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
00116 }

int di_exec_env const char *  path,
const char *const   argv[],
const char *const   envp[]
[inline, static]
 

execve like call

Parameters:
path executable with path
argv NULL-terminated area of char pointer
envp NULL-terminated area of char pointer
Returns:
status or error
00084 {
00085   return di_exec_env_full (path, argv, envp, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
00086 }

int di_exec_env_full const char *  path,
const char *const   argv[],
const char *const   envp[],
di_io_handler stdout_handler,
di_io_handler stderr_handler,
void *  io_user_data,
di_process_handler parent_prepare_handler,
void *  parent_prepare_user_data,
di_process_handler child_prepare_handler,
void *  child_prepare_user_data
 

execve like call

Parameters:
path executable with path
argv NULL-terminated area of char pointer
envp NULL-terminated area of char pointer
stdout_handler di_io_handler which gets stdout (and to stderr if stderr_handler is NULL)
stderr_handler di_io_handler which gets stderr
io_user_data user_data for di_io_handler
parent_prepare_handler di_process_handler which is called after the fork in the parent
parent_prepare_user_data user_data for parent_prepare_handler
child_prepare_handler di_process_handler which is called after the fork in the child
child_prepare_user_data user_data for child_prepare_handler
Returns:
status or error
00042 {
00043   char line[MAXLINE];
00044   pid_t pid;
00045   int fds[4] = { -1, }, mode = 0, pipes = 0, i;
00046 
00047   if (stdout_handler)
00048   {
00049     mode += 1;
00050     pipes++;
00051   }
00052   if (stderr_handler)
00053   {
00054     mode += 2;
00055     pipes++;
00056   }
00057 
00058   for (i = 0; i < pipes; i++)
00059     pipe (&fds[i * 2]);
00060 
00061   pid = fork ();
00062 
00063   if (pid <= 0)
00064   {
00065     for (i = 0; i < pipes; i++)
00066       close (fds[i * 2]);
00067   }
00068 
00069   if (pid == 0)
00070   {
00071     int temp, realfds[3] =
00072     {
00073       0,
00074       fds[1],
00075       fds[3]
00076     };
00077 
00078     temp = open ("/dev/null", O_RDWR);
00079 
00080     switch (mode)
00081     {
00082       case 0:
00083         realfds[1] = temp;
00084         realfds[2] = temp;
00085         break;
00086       case 2:
00087         realfds[1] = temp;
00088         realfds[2] = fds[1];
00089         break;
00090       case 1:
00091         realfds[2] = fds[1];
00092         break;
00093     }
00094 
00095     for (i = 1; i <= 2; i++)
00096       dup2 (realfds[i], i);
00097 
00098     close (temp);
00099   }
00100 
00101   for (i = 0; i < pipes; i++)
00102     close (fds[i * 2 + 1]);
00103 
00104   if (pid == 0)
00105   {
00106     if (child_prepare_handler)
00107       if (child_prepare_handler (pid, child_prepare_user_data))
00108         exit (255);
00109 
00110     if (envp)
00111       execve (path, (char *const *) argv, (char *const *) envp);
00112     else
00113       execv (path, (char *const *) argv);
00114     exit (127);
00115   }
00116   else if (pid < 0)
00117   {
00118     di_log (DI_LOG_LEVEL_WARNING, "fork failed");
00119     return -1;
00120   }
00121   else
00122   {
00123     int status = -1;
00124     struct pollfd pollfds[pipes];
00125     struct files
00126     {
00127       FILE *file;
00128       di_io_handler *handler;
00129     }
00130     files[pipes];
00131 
00132     for (i = 0; i < pipes; i++)
00133     {
00134       fcntl (fds[i * 2], F_SETFL, O_NONBLOCK);
00135       files[i].file = fdopen (fds[i * 2], "r");
00136       pollfds[i].fd = fds[i * 2];
00137       pollfds[i].events = POLLIN;
00138     }
00139 
00140     switch (mode)
00141     {
00142       case 2:
00143         files[0].handler = stderr_handler;
00144         break;
00145       case 3:
00146         files[1].handler = stderr_handler;
00147       case 1:
00148         files[0].handler = stdout_handler;
00149         break;
00150     }
00151 
00152     if (parent_prepare_handler && parent_prepare_handler (pid, parent_prepare_user_data))
00153       kill (pid, 9);
00154     else if (pipes)
00155       while (poll (pollfds, pipes, -1) >= 0)
00156       {
00157         bool exit = false;
00158 
00159         for (i = 0; i < pipes; i++)
00160         {
00161           if (pollfds[i].revents & POLLIN)
00162           {
00163             while (fgets (line, sizeof (line), files[i].file) != NULL)
00164             {
00165               size_t len = strlen (line);
00166               if (line[len - 1] == '\n')
00167               {
00168                 line[len - 1] = '\0';
00169                 len--;
00170               }
00171               files[i].handler (line, len, io_user_data);
00172             }
00173             exit = true;
00174           }
00175         }
00176 
00177         if (exit)
00178           continue;
00179 
00180         for (i = 0; i < pipes; i++)
00181           if (pollfds[i].revents & POLLHUP)
00182             exit = true;
00183 
00184         if (exit)
00185           break;
00186       }
00187 
00188     if (!waitpid (pid, &status, 0))
00189       return -1;
00190 
00191     for (i = 0; i < pipes; i++)
00192       fclose (files[i].file); /* closes fds[i * 2] */
00193 
00194     return status;
00195   }
00196 
00197   return -1;
00198 }

int di_exec_full const char *  path,
const char *const   argv[],
di_io_handler stdout_handler,
di_io_handler stderr_handler,
void *  io_user_data,
di_process_handler parent_prepare_handler,
void *  parent_prepare_user_data,
di_process_handler child_prepare_handler,
void *  child_prepare_user_data
 

execv like call

Parameters:
path executable with path
argv NULL-terminated area of char pointer
stdout_handler di_io_handler which gets stdout (and to stderr if stderr_handler is NULL)
stderr_handler di_io_handler which gets stderr
io_user_data user_data for di_io_handler
parent_prepare_handler di_process_handler which is called after the fork in the parent
parent_prepare_user_data user_data for parent_prepare_handler
child_prepare_handler di_process_handler which is called after the fork in the child
child_prepare_user_data user_data for child_prepare_handler
Returns:
status or error
00201 {
00202   return di_exec_env_full (path, argv, NULL, stdout_handler, stderr_handler, io_user_data, parent_prepare_handler, parent_prepare_user_data, child_prepare_handler, child_prepare_user_data);
00203 }

int di_exec_mangle_status int  status  ) 
 

mangle status like sh does it: * if signaled: 128 + signal * else return code

00236 {
00237   if (WIFEXITED (status))
00238     return WEXITSTATUS (status);
00239   if (WIFSIGNALED (status))
00240     return 128 + WTERMSIG (status);
00241   if (WIFSTOPPED (status))
00242     return 128 + WSTOPSIG (status);
00243   return status;
00244 }

int di_exec_shell const char *const   cmd  )  [inline, static]
 

system like call

Parameters:
cmd command
Returns:
status or error
00142 {
00143   return di_exec_shell_full (cmd, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
00144 }

int di_exec_shell_full const char *const   cmd,
di_io_handler stdout_handler,
di_io_handler stderr_handler,
void *  io_user_data,
di_process_handler parent_prepare_handler,
void *  parent_prepare_user_data,
di_process_handler child_prepare_handler,
void *  child_prepare_user_data
 

system like call

Parameters:
cmd command
stdout_handler di_io_handler which gets stdout
stderr_handler di_io_handler which gets stderr
io_user_data user_data for di_io_handler
parent_prepare_handler di_process_handler which is called after the fork in the parent
parent_prepare_user_data user_data for parent_prepare_handler
child_prepare_handler di_process_handler which is called after the fork in the child
child_prepare_user_data user_data for child_prepare_handler
Returns:
status or error
00206 {
00207   const char *const argv[] = { "sh", "-c", cmd, NULL };
00208   return di_exec_full ("/bin/sh", argv, stdout_handler, stderr_handler, io_user_data, parent_prepare_handler, parent_prepare_user_data, child_prepare_handler, child_prepare_user_data); 
00209 }

int di_exec_shell_log const char *const   cmd  )  [inline, static]
 

system like call with output via log

Parameters:
cmd command
Returns:
status or error
00154 {
00155   return di_exec_shell_full (cmd, di_exec_io_log, NULL, NULL, NULL, NULL, NULL, NULL);
00156 }

int di_execlog const char *const   cmd  )  [inline, static]
 

Deprecated:
Alias of di_exec_shell_log
00171 {
00172   return di_exec_shell_log (cmd);
00173 }


Variable Documentation

di_io_handler di_exec_io_log
 

logs the output

di_process_handler di_exec_prepare_chdir
 

chdir to user_data

Parameters:
user_data path

di_process_handler di_exec_prepare_chroot
 

chroot to user_data

Parameters:
user_data path


Generated on Fri Nov 26 11:48:19 2004 for libdebian-installer by  doxygen 1.3.9.1