Changed lauch() code
This commit is contained in:
parent
81266cc973
commit
ba17b61b84
@ -432,6 +432,43 @@ void load_taskcfg(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Milliseconds timer, returns 0 on success.
|
||||||
|
*/
|
||||||
|
int msleep(int msecs)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct timespec req, rem;
|
||||||
|
|
||||||
|
rem.tv_sec = 0;
|
||||||
|
rem.tv_nsec = 0;
|
||||||
|
req.tv_sec = msecs / 1000;
|
||||||
|
req.tv_nsec = (msecs % 1000) * 1000000;
|
||||||
|
|
||||||
|
while (TRUE) {
|
||||||
|
|
||||||
|
rc = nanosleep(&req, &rem);
|
||||||
|
if (rc == 0)
|
||||||
|
break;
|
||||||
|
if ((errno == EINVAL) || (errno == EFAULT)) {
|
||||||
|
WriteError("$msleep(%d)", msecs);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Error was EINTR, run timer again to complete.
|
||||||
|
*/
|
||||||
|
req.tv_sec = rem.tv_sec;
|
||||||
|
req.tv_nsec = rem.tv_nsec;
|
||||||
|
rem.tv_sec = 0;
|
||||||
|
rem.tv_nsec = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Launch an external program in the background.
|
* Launch an external program in the background.
|
||||||
* On success add it to the tasklist and return
|
* On success add it to the tasklist and return
|
||||||
@ -449,40 +486,39 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memset(vector, 0, sizeof(vector));
|
memset(vector, 0, sizeof(vector));
|
||||||
Syslog('r', "launch() step 2");
|
|
||||||
|
|
||||||
if (opts == NULL)
|
if (opts == NULL)
|
||||||
snprintf(buf, PATH_MAX, "%s", cmd);
|
snprintf(buf, PATH_MAX, "%s", cmd);
|
||||||
else
|
else
|
||||||
snprintf(buf, PATH_MAX, "%s %s", cmd, opts);
|
snprintf(buf, PATH_MAX, "%s %s", cmd, opts);
|
||||||
Syslog('r', "launch() step 3");
|
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
vector[i++] = strtok(buf," \t\n\0");
|
vector[i++] = strtok(buf," \t\n\0");
|
||||||
while ((vector[i++] = strtok(NULL," \t\n")) && (i<16));
|
while ((vector[i++] = strtok(NULL," \t\n")) && (i<16));
|
||||||
vector[15] = NULL;
|
vector[15] = NULL;
|
||||||
Syslog('r', "launch() step 4");
|
|
||||||
|
|
||||||
if (file_exist(vector[0], X_OK)) {
|
if (file_exist(vector[0], X_OK)) {
|
||||||
Syslog('?', "Launch: can't execute %s, command not found", vector[0]);
|
Syslog('?', "Launch: can't execute %s, command not found", vector[0]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Syslog('r', "launch() step 5");
|
Syslog('r', "launch() step 2");
|
||||||
|
|
||||||
pid = fork();
|
switch (pid = fork()) {
|
||||||
Syslog('r', "launch() step 6");
|
|
||||||
|
|
||||||
switch (pid) {
|
|
||||||
case -1:
|
case -1:
|
||||||
Syslog('?', "$Launch: error, can't fork grandchild");
|
Syslog('?', "$Launch: error, can't fork grandchild");
|
||||||
return 0;
|
return 0;
|
||||||
case 0:
|
case 0:
|
||||||
Syslog('r', "launch() step 7");
|
/*
|
||||||
|
* A delay in the child process to prevent it returns
|
||||||
|
* before the main process sess it ever started.
|
||||||
|
*/
|
||||||
|
msleep(150);
|
||||||
|
|
||||||
|
Syslog('r', "launch() step 3");
|
||||||
/* From Paul Vixies cron: */
|
/* From Paul Vixies cron: */
|
||||||
rc = setsid(); /* It doesn't seem to help */
|
rc = setsid(); /* It doesn't seem to help */
|
||||||
if (rc == -1)
|
if (rc == -1)
|
||||||
Syslog('?', "$Launch: setsid()");
|
Syslog('?', "$Launch: setsid()");
|
||||||
Syslog('r', "launch() step 8");
|
|
||||||
|
|
||||||
close(0);
|
close(0);
|
||||||
if (open("/dev/null", O_RDONLY) != 0) {
|
if (open("/dev/null", O_RDONLY) != 0) {
|
||||||
@ -500,7 +536,7 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype)
|
|||||||
_exit(MBERR_EXEC_FAILED);
|
_exit(MBERR_EXEC_FAILED);
|
||||||
}
|
}
|
||||||
errno = 0;
|
errno = 0;
|
||||||
Syslog('r', "launch() step 9");
|
Syslog('r', "launch() step 4");
|
||||||
rc = execv(vector[0],vector);
|
rc = execv(vector[0],vector);
|
||||||
Syslog('?', "$Launch: execv \"%s\" failed, returned %d", cmd, rc);
|
Syslog('?', "$Launch: execv \"%s\" failed, returned %d", cmd, rc);
|
||||||
_exit(MBERR_EXEC_FAILED);
|
_exit(MBERR_EXEC_FAILED);
|
||||||
@ -509,7 +545,7 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Syslog('r', "launch() step 10");
|
Syslog('r', "launch() step 5");
|
||||||
/*
|
/*
|
||||||
* Add it to the tasklist.
|
* Add it to the tasklist.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user