int main(int argc, char **argv) { int serfd; if (argc != 4) { fprintf(stderr, "Usage: %s <port> <device> <rate> - act as a serial forwarder on <port>\n" "(listens to serial port <device> at baud rate <rate>)\n" , argv[0]); exit(2); } if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) fprintf(stderr, "Warning: failed to ignore SIGPIPE.\n"); open_serial(argv[2], platform_baud_rate(argv[3])); serfd = serial_source_fd(src); open_server_socket(atoi(argv[1])); for (;;) { fd_set rfds; int maxfd = -1; struct timeval zero; int serial_empty; int ret; zero.tv_sec = zero.tv_usec = 0; FD_ZERO(&rfds); fd_wait(&rfds, &maxfd, serfd); fd_wait(&rfds, &maxfd, server_socket); wait_clients(&rfds, &maxfd); serial_empty = serial_source_empty(src); if (serial_empty) ret = select(maxfd + 1, &rfds, NULL, NULL, NULL); else { ret = select(maxfd + 1, &rfds, NULL, NULL, &zero); check_serial(); } if (ret >= 0) { if (FD_ISSET(serfd, &rfds)) check_serial(); if (FD_ISSET(server_socket, &rfds)) check_new_client(); check_clients(&rfds); } } }
int buf_recv(int sock, void *buf, size_t size) { ssize_t done; unsigned char *ptr; PJDLOG_ASSERT(sock >= 0); PJDLOG_ASSERT(buf != NULL); ptr = buf; while (size > 0) { fd_wait(sock, true); done = recv(sock, ptr, size, 0); if (done == -1) { if (errno == EINTR) continue; return (-1); } else if (done == 0) { errno = ENOTCONN; return (-1); } size -= done; ptr += done; } return (0); }
static int msg_recv(int sock, struct msghdr *msg) { int flags; PJDLOG_ASSERT(sock >= 0); #ifdef MSG_CMSG_CLOEXEC flags = MSG_CMSG_CLOEXEC; #else flags = 0; #endif for (;;) { fd_wait(sock, true); if (recvmsg(sock, msg, flags) == -1) { if (errno == EINTR) continue; return (-1); } break; } return (0); }
void wait_clients(fd_set *fds, int *maxfd) { struct client_list *c; for (c = clients; c; c = c->next) fd_wait(fds, maxfd, c->fd); }
int main(int argc, char **argv) { int serfd; if (argc != 4) { fprintf(stderr, "Usage: %s <device> <rate> <file> - act as a serial forwarder on <port>\n" "(listens to serial port <device> at baud rate <rate>)\n", argv[0]); exit(2); } if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) fprintf(stderr, "Warning: failed to ignore SIGPIPE.\n"); if (signal(SIGINT, sigproc) == SIG_ERR) fprintf(stderr, "Warning: failed to set the SIGINT interruption.\n"); srcId = -1; open_serial(argv[1], platform_baud_rate(argv[2])); serfd = serial_source_fd(src); open_file_fd(argv[3]); dup2(filefd, 1); for (;;) { fd_set rfds; int maxfd = -1; struct timeval zero; int serial_empty; int ret; zero.tv_sec = zero.tv_usec = 0; FD_ZERO(&rfds); fd_wait(&rfds, &maxfd, serfd); serial_empty = serial_source_empty(src); check_serial(); if (ret >= 0) { if (FD_ISSET(serfd, &rfds)) check_serial(); } } }
static int msg_send(int sock, const struct msghdr *msg) { PJDLOG_ASSERT(sock >= 0); for (;;) { fd_wait(sock, false); if (sendmsg(sock, msg, 0) == -1) { if (errno == EINTR) continue; return (-1); } break; } return (0); }
/** Receive a call setting preset files of the program to execute. * * @param rid * @param request */ static void ldr_set_files(ipc_callid_t rid, ipc_call_t *request) { size_t count = IPC_GET_ARG1(*request); async_exch_t *vfs_exch = vfs_exchange_begin(); for (filc = 0; filc < count; filc++) { ipc_callid_t callid; int fd; if (!async_state_change_receive(&callid, NULL, NULL, NULL)) { async_answer_0(callid, EINVAL); break; } async_state_change_finalize(callid, vfs_exch); fd = fd_wait(); assert(fd == (int) filc); } vfs_exchange_end(vfs_exch); async_answer_0(rid, EOK); }