int sync_update(struct sync_device *d, int row, struct sync_cb *cb, void *cb_param) { if (d->sock == INVALID_SOCKET) return -1; /* look for new commands */ while (socket_poll(d->sock)) { unsigned char cmd = 0, flag; uint32_t new_row; if (xrecv(d->sock, (char *)&cmd, 1, 0)) goto sockerr; switch (cmd) { case SET_KEY: if (handle_set_key_cmd(d->sock, d)) goto sockerr; break; case DELETE_KEY: if (handle_del_key_cmd(d->sock, d)) goto sockerr; break; case SET_ROW: if (xrecv(d->sock, (char *)&new_row, sizeof(new_row), 0)) goto sockerr; if (cb && cb->set_row) cb->set_row(cb_param, ntohl(new_row)); break; case PAUSE: if (xrecv(d->sock, (char *)&flag, 1, 0)) goto sockerr; if (cb && cb->pause) cb->pause(cb_param, flag); break; case SAVE_TRACKS: sync_save_tracks(d); break; default: fprintf(stderr, "unknown cmd: %02x\n", cmd); goto sockerr; } } if (cb && cb->is_playing && cb->is_playing(cb_param)) { if (d->row != row && d->sock != INVALID_SOCKET) { unsigned char cmd = SET_ROW; uint32_t nrow = htonl(row); if (xsend(d->sock, (char*)&cmd, 1, 0) || xsend(d->sock, (char*)&nrow, sizeof(nrow), 0)) goto sockerr; d->row = row; } } return 0; sockerr: closesocket(d->sock); d->sock = INVALID_SOCKET; return -1; }
int socket_main(int hsocket) { struct sockaddr_in sock; int asocket; /* Active socket */ socklen_t sock_len; char buffer[200]; int got; sock_len = sizeof(struct sockaddr_in); asocket = accept( hsocket, (struct sockaddr *)&sock, &sock_len ); if (asocket == -1) { return -1; } socket_write( asocket, "Hi there\n", 9 ); while (1) { while (socket_poll(asocket)==0) {} if ((got=socket_read(asocket, buffer, 200))>0) { socket_write( asocket, buffer, got ); } else break; } close(asocket); return 0; }
bool RemoteConnection_pollRead() { if (!RemoteConnection_connected()) return false; return !!socket_poll(s_socket); }
/* Handle a RST 38 (system call) */ int handle_sys(int scall, int parameter) { char buffer[2]; switch (scall) { case 0: { /* Read in from telnet */ if (flags&DSOCKETS) { return socket_get(tsocket); } return 0; break; } case 1: { /* Write to telnet */ if (flags&DSOCKETS) { buffer[0]=(parameter&0x0ff); return socket_write( tsocket, buffer, 1); } return -1; } case 2: { /* Return !0 if data is available */ if (flags&DSOCKETS) { return socket_poll( tsocket ); } return -1; } } return 0; }
/*ARGSUSED*/ static int socket_vop_poll(struct vnode *vp, short events, int anyyet, short *reventsp, struct pollhead **phpp, caller_context_t *ct) { struct sonode *so = VTOSO(vp); ASSERT(vp->v_type == VSOCK); return (socket_poll(so, events, anyyet, reventsp, phpp)); }
static int server_loop(void) { script_init(script); mrdisc_init(interval); while (running) { if (reloading) { reload(); reloading = 0; } socket_poll(NULL); } return 0; }
static int service_socket_poll(void) { struct socket_message sm; if (!socket_poll(&sm)) return 0; struct message m; int size = sizeof sm; m.source = 0; m.session = 0; m.data = service_alloc(0, size); m.size = size; m.proto = SERVICE_PROTO_SOCKET; memcpy(m.data, &sm, size); uint32_t handle = (uint32_t)(uintptr_t)sm.ud; if (-1 == service_send(handle, &m)) service_alloc(m.data, 0); return 1; }
inline int socket_poll_one(socket_t **s, struct timespec *timeout) { return socket_poll(s, 1, timeout); }