Ejemplo n.º 1
0
int _pSLstring_list_push (_pSLString_List_Type *p, int delete_list)
{
   SLang_Array_Type *at;

   if ((p == NULL)
       || (p->buf == NULL))
     {
	int ret = SLang_push_null ();
	if (delete_list)
	  _pSLstring_list_delete (p);
	return ret;
     }
   
   if (NULL == (at = string_list_to_array (p, delete_list)))
     return -1;

   return SLang_push_array (at, 1);
}
Ejemplo n.º 2
0
/* run arglist[0] with arglist and redirect std{in,out,err} */
int run_rw(int in, int out, int err, struct string_list *arglist)
{
	pid_t pid, wpid;
	int status, retcode;
	char *fn;

	if (string_list_empty(arglist)) {
		fprintf(stderr, "arglist is empty\n");
		return -1;
	}
	fn = arglist->tqh_first->s;

	wpid = fork();
	if (wpid < 0) {
		fprintf(stderr, "fork() err: %m\n");
		return -1;
	} else if (wpid == 0) {
		char **argv;
		int i;

		string_list_to_array(arglist, &argv);
		for (i = 0; argv[i]; i++)
			printf("%s ", argv[i]);
		printf("\n");
		fflush(stdout);

		/* allow C-c for child */
		signal(SIGINT, SIG_DFL);
		close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO);
		dup2(in, STDIN_FILENO);
		dup2(out, STDOUT_FILENO);
		dup2(err, STDERR_FILENO);
		close(in); close(out); close(err);
		/* TODO: last syncronization before start */
		execvp(fn, (char *const *)argv);
		fprintf(stderr, "execve(%s) err: %m\n", fn);
		fflush(stderr);
		exit(-1);
	}

	while ((pid = waitpid(wpid, &status, 0)) == -1)
		if (errno != EINTR)
			break;
	if (pid < 0) {
		fprintf(stderr, "waitpid() err: %m\n");
		return -1;
	}

	if (WIFEXITED(status)) {
		if ((retcode = WEXITSTATUS(status))) {
			fprintf(stderr, "%s failed, exitcode=%d\n",
				fn, retcode);
			return -1;
		}
	} else if (WIFSIGNALED(status)) {
		fprintf(stderr, "%s got signal %d\n",
			fn, WTERMSIG(status));
		return -1;
	} else {
		fprintf(stderr, "%s exited with status %d\n", fn, status);
		return -1;
	}
	return 0;
}