Exemplo n.º 1
0
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);
	}
    }
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
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);
}
Exemplo n.º 4
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);
}
Exemplo n.º 5
0
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();
        }
    }
}
Exemplo n.º 6
0
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);
}
Exemplo n.º 7
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);
}