예제 #1
0
파일: device.c 프로젝트: fcondolo/rocket
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;
}
예제 #2
0
파일: csock.c 프로젝트: JackieXie168/sdcc
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;
}
예제 #3
0
bool RemoteConnection_pollRead()
{
	if (!RemoteConnection_connected())
		return false;

	return !!socket_poll(s_socket);
}
예제 #4
0
파일: main.c 프로젝트: davidgiven/sdcc
/* 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;
}
예제 #5
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));
}
예제 #6
0
static int server_loop(void)
{
	script_init(script);
	mrdisc_init(interval);

	while (running) {
		if (reloading) {
			reload();
			reloading = 0;
		}

		socket_poll(NULL);
	}

	return 0;
}
예제 #7
0
파일: service.c 프로젝트: zhoukk/service
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;
}
예제 #8
0
파일: linux.c 프로젝트: ifduyue/dhttpd
inline int socket_poll_one(socket_t **s, struct timespec *timeout)
{
    return socket_poll(s, 1, timeout);
}