static int fdpass_waitret(struct fdpass *f, int *retfd) { int cmd, unused; if (!fdpass_recv(fdpass_peer, &cmd, &unused, &unused, retfd)) return 0; if (cmd != FDPASS_RETURN) { if (log_level >= 1) { fdpass_log(f); log_puts(": expected RETURN message\n"); } fdpass_close(f); return 0; } return 1; }
void fdpass_in_helper(void *arg) { int cmd, num, mode, fd; struct fdpass *f = arg; struct dev *d; struct port *p; if (!fdpass_recv(f, &cmd, &num, &mode, &fd)) return; switch (cmd) { case FDPASS_OPEN_SND: d = dev_bynum(num); if (d == NULL || !(mode & (SIO_PLAY | SIO_REC))) { if (log_level >= 1) { fdpass_log(f); log_puts(": bad audio device or mode\n"); } fdpass_close(f); return; } fd = sio_sun_getfd(d->path, mode, 1); break; case FDPASS_OPEN_MIDI: p = port_bynum(num); if (p == NULL || !(mode & (MIO_IN | MIO_OUT))) { if (log_level >= 1) { fdpass_log(f); log_puts(": bad midi port or mode\n"); } fdpass_close(f); return; } fd = mio_rmidi_getfd(p->path, mode, 1); break; default: fdpass_close(f); return; } fdpass_send(f, FDPASS_RETURN, 0, 0, fd); }
static int read_fd(int sock_fd) { MyString err; int bytes; int flag; bytes = full_read(0, &flag, sizeof(flag)); if (bytes != sizeof(flag)) { if (bytes == -1) { err.sprintf("read error getting flag: %s", strerror(errno)); } else { err.sprintf("short read of flag: %d of %lu bytes", bytes, sizeof(flag)); } full_write(sock_fd, err.Value(), err.Length() + 1); exit(1); } int fd; if (flag) { fd = fdpass_recv(sock_fd); if (fd == -1) { err.sprintf("fdpass_recv failed\n"); full_write(sock_fd, err.Value(), err.Length() + 1); exit(1); } } else { fd = open("/dev/null", O_RDONLY); if (fd == -1) { err.sprintf("error opening /dev/null: %s", strerror(errno)); full_write(sock_fd, err.Value(), err.Length() + 1); exit(1); } } return fd; }