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; }
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; }