add exec.c......... :)

SVN revision: 3977
This commit is contained in:
Carsten Haitzler 2000-12-11 20:36:02 +00:00
parent 22aa9d2a5d
commit a9dde4e152
1 changed files with 109 additions and 0 deletions

109
src/exec.c Normal file
View File

@ -0,0 +1,109 @@
#include "e.h"
static int e_argc = 0;
static char **e_argv = NULL;
void
e_exec_set_args(int argc, char **argv)
{
e_argc = argc;
e_argv = argv;
}
void
e_exec_restart(void)
{
int i, num;
char exe[4096];
printf("e_exec_restart()\n");
/* unset events on root */
e_window_set_events(0, XEV_NONE);
/* destroy all desktops */
num = e_desktops_get_num();
for (i = 0; i < num; i++)
{
E_Desktop *desk;
desk = e_desktops_get(0);
e_desktops_delete(desk);
}
/* ensure it's all done */
e_sync();
/* rerun myself */
exe[0] = 0;
for (i = 0; i < e_argc; i++)
{
strcat(exe, e_argv[i]);
strcat(exe, " ");
}
execl("/bin/sh", "/bin/sh", "-c", exe, NULL);
}
pid_t
e_exec_run(char *exe)
{
pid_t pid;
pid = fork();
if (pid)
return pid;
setsid();
execl("/bin/sh", "/bin/sh", "-c", exe, NULL);
exit(0);
return 0;
}
pid_t
e_exec_run_in_dir(char *exe, char *dir)
{
pid_t pid;
pid = fork();
if (pid)
return pid;
chdir(dir);
setsid();
execl("/bin/sh", "/bin/sh", "-c", exe, NULL);
exit(0);
return 0;
}
pid_t
e_run_in_dir_with_env(char *exe, char *dir, int *launch_id_ret, char **env, char *launch_path)
{
static int launch_id = 0;
char preload_paths[4096];
char preload[4096];
char *exe2;
pid_t pid;
launch_id++;
if (launch_id_ret) *launch_id_ret = launch_id;
pid = fork();
if (pid) return pid;
chdir(dir);
setsid();
if (env)
{
while (*env)
{
e_set_env(env[0], env[1]);
env += 2;
}
}
/* launch Id hack - if it's an X program the windows popped up should */
/* have this launch Id number set on them - as well as process ID */
/* machine name, and user name */
if (launch_path) e_set_env("E_HACK_LAUNCH_PATH", launch_path);
sprintf(preload_paths, "E_HACK_LAUNCH_ID=%i LD_PRELOAD_PATH='%s'",
launch_id, PACKAGE_LIB_DIR);
sprintf(preload, "LD_PRELOAD='libehack.so libX11.so libdl.so'");
exe2 = malloc(strlen(exe) + 1 +
strlen(preload_paths) + 1 +
strlen(preload) + 1);
sprintf(exe2, "%s %s %s", preload_paths, preload, exe);
execl("/bin/sh", "/bin/sh", "-c", exe2, NULL);
exit(0);
return 0;
}