Ejemplo n.º 1
0
static task_id_t spawn(int argc, char *argv[])
{
	const char **args;
	task_id_t id = 0;
	int rc;

	args = (const char **) calloc(argc + 1, sizeof(char *));
	if (!args) {
		fprintf(stderr, "No memory available\n");
		return 0;
	}
	
	int i;
	for (i = 0; i < argc; i++)
		args[i] = argv[i];
	
	args[argc] = NULL;
	
	rc = task_spawnv(&id, argv[0], args);
	
	free(args);
	
	if (rc != EOK) {
		fprintf(stderr, "%s: Error spawning %s (%s)\n", NAME, argv[0],
		    str_error(rc));
		return 0;
	}
	
	return id;
}
Ejemplo n.º 2
0
int main(int argc, char *argv[])
{
	argv++;
	argc--;
	if (argc < 4) {
		usage();
		return 1;
	}
	
	char *term = *argv;
	argv++;
	argc--;
	
	char *locfs = *argv;
	argv++;
	argc--;
	
	bool print_msg = false;
	bool wait = false;
	
	while ((argc > 0) && (str_cmp(*argv, "--") != 0)) {
		if (str_cmp(*argv, "--msg") == 0) {
			print_msg = true;
		} else if (str_cmp(*argv, "--wait") == 0) {
			wait = true;
		} else {
			usage();
			return 2;
		}
		
		argv++;
		argc--;
	}
	
	if (argc < 1) {
		usage();
		return 3;
	}
	
	/* Skip "--" */
	argv++;
	argc--;
	
	char *cmd = *argv;
	char **args = argv;
	
	if (wait) {
		/* Wait for the terminal service to be ready */
		service_id_t service_id;
		int rc = loc_service_get_id(term, &service_id, IPC_FLAG_BLOCKING);
		if (rc != EOK) {
			printf("%s: Error waiting on %s (%s)\n", APP_NAME, term,
			    str_error(rc));
			return rc;
		}
	}
	
	char term_node[LOC_NAME_MAXLEN];
	snprintf(term_node, LOC_NAME_MAXLEN, "%s/%s", locfs, term);
	
	reopen(&stdin, 0, term_node, O_RDONLY, "r");
	reopen(&stdout, 1, term_node, O_WRONLY, "w");
	reopen(&stderr, 2, term_node, O_WRONLY, "w");
	
	if (stdin == NULL)
		return 4;
	
	if (stdout == NULL)
		return 5;
	
	if (stderr == NULL)
		return 6;
	
	/*
	 * FIXME: fdopen() should actually detect that we are opening a console
	 * and it should set line-buffering mode automatically.
	 */
	setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
	
	version_print(term);
	if (print_msg)
		welcome_msg_print();
	
	task_id_t id;
	task_wait_t twait;
	
	int rc = task_spawnv(&id, &twait, cmd, (const char * const *) args);
	if (rc != EOK) {
		printf("%s: Error spawning %s (%s)\n", APP_NAME, cmd,
		    str_error(rc));
		return rc;
	}
	
	task_exit_t texit;
	int retval;
	rc = task_wait(&twait, &texit, &retval);
	if (rc != EOK) {
		printf("%s: Error waiting for %s (%s)\n", APP_NAME, cmd,
		    str_error(rc));
		return rc;
	}
	
	return 0;
}