static void processEvents(LLDBPlugin* plugin, PDReader* reader, PDWriter* writer) { uint32_t event; while ((event = PDRead_get_event(reader))) { //printf("LLDBPlugin: %d Got event %s\n", event, eventTypes[event]); switch (event) { case PDEventType_GetExceptionLocation : setExceptionLocation(plugin, writer); break; case PDEventType_GetCallstack : setCallstack(plugin, writer); break; case PDEventType_SetExecutable : setExecutable(plugin, reader); break; case PDEventType_SelectThread : selectThread(plugin, reader, writer); break; case PDEventType_SelectFrame : selectFrame(plugin, reader, writer); break; case PDEventType_GetLocals : setLocals(plugin, writer); break; case PDEventType_GetThreads : setThreads(plugin, writer); break; case PDEventType_GetSourceFiles : setSourceFiles(plugin, writer); break; case PDEventType_SetBreakpoint : setBreakpoint(plugin, reader, writer); break; case PDEventType_Action : eventAction(plugin, reader); break; } } setTty(plugin, writer); }
static int pre_init_modemu(void) { switch (cmdarg.ttymode) { #ifdef HAVE_GRANTPT char * ptyslave; case CA_SHOWDEV: tty.rfd = tty.wfd = getPtyMaster(&ptyslave); printf("%s\n", ptyslave); return 0; case CA_COMMX: tty.rfd = tty.wfd = getPtyMaster(&ptyslave); commxForkExec(cmdarg.commx, ptyslave); break; #else char c10, c01; case CA_SHOWDEV: tty.rfd = tty.wfd = getPtyMaster(&c10, &c01); printf("%c%c\n", c10, c01); return 0; case CA_COMMX: tty.rfd = tty.wfd = getPtyMaster(&c10, &c01); commxForkExec(cmdarg.commx, c10, c01); break; #endif case CA_STDINOUT: tty.rfd = 0; tty.wfd = 1; setTty(); break; case CA_DEVGIVEN: tty.rfd = tty.wfd = openPtyMaster(cmdarg.dev); break; } return 1; }
static void connectClient(const char *dev) { fd_set master; fd_set read_fds; FD_ZERO(&master); FD_ZERO(&read_fds); signal(SIGHUP, exit_handler); signal(SIGINT, exit_handler); signal(SIGQUIT, exit_handler); signal(SIGPIPE, exit_handler); signal(SIGTSTP, exit_handler); signal(SIGTERM, exit_handler); int stdi; struct ttyRaw* tty_in; stdi = STDIN_FILENO; if (!isatty(stdi)) { return; } tty_in = setTty(stdi, 0); int stdo; struct ttyRaw* tty_out; stdo = STDOUT_FILENO; if (!isatty(stdo)) { closeTty(tty_in); return; } tty_out = setTty(stdo, 0); int clientfd; clientfd = createClientSocket(dev); if (clientfd < 0) { closeTty(tty_out); closeTty(tty_in); return; } FD_SET(tty_in->fd,&master); FD_SET(clientfd, &master); int fdmax = 0; fdmax = (clientfd > tty_in->fd) ? clientfd : tty_in->fd; for(;;) { if (sigexit) { break; } read_fds = master; if (select(fdmax + 1, &read_fds, NULL, NULL, NULL) == -1) { perror("mTerm_client: select error"); break; } if (FD_ISSET(stdi, &read_fds)) { if (!readFromStdin(clientfd, tty_in->fd)) { break; } } if (FD_ISSET(clientfd, &read_fds)) { if (!writeToStdout(clientfd,tty_out->fd)) { break; } } } closeTty(tty_out); closeTty(tty_in); close(clientfd); }
static void connectServer(const char *stty, const char *dev) { int fdmax, newfd; fd_set master, read_fds; FD_ZERO(&master); FD_ZERO(&read_fds); int serverfd; serverfd = createServerSocket(dev); if (serverfd < 0) { syslog(LOG_ERR, "mTerm_server: Failed to create server socket\n"); return; } struct ttyRaw* tty_sol; tty_sol = setTty(openTty(stty), 1); if (!tty_sol) { syslog(LOG_ERR, "mTerm_server: Failed to set tty to raw mode\n"); close(serverfd); return; } struct bufStore* buf; buf = createBuffer(dev, FILE_SIZE_BYTES); if (!buf || (buf->buf_fd < 0)) { syslog(LOG_ERR, "mTerm_server: Failed to create the log file\n"); closeTty(tty_sol); close(serverfd); return; } FD_SET(serverfd, &master); FD_SET(tty_sol->fd,&master); fdmax = (serverfd > tty_sol->fd) ? serverfd : tty_sol->fd; for(;;) { read_fds = master; if (select(fdmax + 1, &read_fds, NULL, NULL, NULL) == -1) { syslog(LOG_ERR, "mTerm_server: Server socket: select error\n"); break; } if (FD_ISSET(serverfd, &read_fds)) { newfd = acceptClient(serverfd); if (newfd < 0) { syslog(LOG_ERR, "mTerm_server: Error on accepting client\n"); } else { FD_SET(newfd, &master); if (newfd > fdmax) { fdmax = newfd; } } } if (FD_ISSET(tty_sol->fd, &read_fds)) { if ( processSol(&master, serverfd, fdmax, tty_sol->fd, buf) < 0) { break; } } int i; for(i = 0; i <= fdmax; i++) { if (FD_ISSET(i, &read_fds)) { if ((i == serverfd) || (i == tty_sol->fd)) { continue; } else { processClient(&master, i, tty_sol->fd, buf); } } } } closeTty(tty_sol); close(serverfd); closeBuffer(buf); }