static void rdpsnddbg_process(STREAM s) { unsigned int pkglen; static char *rest = NULL; char *buf; pkglen = s->end - s->p; /* str_handle_lines requires null terminated strings */ buf = (char *) xmalloc(pkglen + 1); STRNCPY(buf, (char *) s->p, pkglen + 1); str_handle_lines(buf, &rest, rdpsnddbg_line_handler, NULL); xfree(buf); }
/* Execute the program specified by argv. For each line in stdout/stderr output, call linehandler. Returns false on failure. */ RD_BOOL subprocess(char *const argv[], str_handle_lines_t linehandler, void *data) { pid_t child; int fd[2]; int n = 1; char output[256]; char *rest = NULL; if (pipe(fd) < 0) { perror("pipe"); return False; } if ((child = fork()) < 0) { perror("fork"); return False; } /* Child */ if (child == 0) { /* Close read end */ close(fd[0]); /* Redirect stdout and stderr to pipe */ dup2(fd[1], 1); dup2(fd[1], 2); /* Execute */ execvp(argv[0], argv); perror("Error executing child"); _exit(128); } /* Parent. Close write end. */ close(fd[1]); while (n > 0) { n = read(fd[0], output, 255); output[n] = '\0'; str_handle_lines(output, &rest, linehandler, data); } xfree(rest); return True; }
/* Process new data from the virtual channel */ static void lspci_process(STREAM s) { unsigned int pkglen; static char *rest = NULL; char *buf; pkglen = s->end - s->p; /* str_handle_lines requires null terminated strings */ buf = xmalloc(pkglen + 1); STRNCPY(buf, (char *) s->p, pkglen + 1); #if 0 printf("lspci recv:\n"); hexdump(s->p, pkglen); #endif str_handle_lines(buf, &rest, lspci_process_line, NULL); xfree(buf); }