doorbell

diff doorbelld/src/srv.c @ 4:08ea0abdbb8a

argument parsing
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 14 Mar 2016 04:20:59 +0200
parents d3f2a2b19504
children f21ae31ef0e7
line diff
     1.1 --- a/doorbelld/src/srv.c	Sun Mar 13 07:56:26 2016 +0200
     1.2 +++ b/doorbelld/src/srv.c	Mon Mar 14 04:20:59 2016 +0200
     1.3 @@ -10,6 +10,8 @@
     1.4  #include "srv.h"
     1.5  #include "dynarr.h"
     1.6  
     1.7 +/* TODO convert this whole thing to multicast */
     1.8 +
     1.9  static int lis_sock = -1, max_socket = -1;
    1.10  static int *csock;
    1.11  
    1.12 @@ -45,6 +47,7 @@
    1.13  		lis_sock = -1;
    1.14  		return -1;
    1.15  	}
    1.16 +	listen(lis_sock, 8);
    1.17  
    1.18  	return 0;
    1.19  }
    1.20 @@ -84,16 +87,19 @@
    1.21  	if(s == lis_sock) {
    1.22  		/* incoming connection */
    1.23  		struct sockaddr_in addr;
    1.24 -		int addr_size;
    1.25 -
    1.26 -		if((s = accept(lis_sock, (struct sockaddr*)&addr, (int*)&addr_size)) == -1) {
    1.27 -			fprintf(stderr, "%s: failed to accept incoming connection\n", __func__);
    1.28 +		socklen_t addr_size = sizeof addr;
    1.29 +		if((s = accept(lis_sock, (struct sockaddr*)&addr, &addr_size)) == -1) {
    1.30 +			fprintf(stderr, "%s: failed to accept incoming connection: %s\n", __func__, strerror(errno));
    1.31  			return -1;
    1.32  		}
    1.33  		printf("%s: incoming connection from %s:%d\n", __func__,
    1.34  				inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
    1.35  		csock = dynarr_push(csock, &s);
    1.36  		assert(csock);
    1.37 +		if(s > max_socket) {
    1.38 +			max_socket = s;
    1.39 +		}
    1.40 +		fcntl(s, F_SETFD, fcntl(s, F_GETFD) | O_NONBLOCK);
    1.41  		return 0;
    1.42  	}
    1.43  
    1.44 @@ -101,23 +107,44 @@
    1.45  	while((sz = read(s, buf, sizeof buf - 1)) > 0) {
    1.46  		printf("%s: got data: %s\n", __func__, buf);
    1.47  	}
    1.48 -	if(sz < 0 && errno != EAGAIN) {
    1.49 +	if(sz <= 0 && errno != EAGAIN) {
    1.50  		/* client closed connection probably */
    1.51  		int i, num_clients = dynarr_size(csock);
    1.52  		printf("%s: removing client\n", __func__);
    1.53  		close(s);
    1.54 +		max_socket = lis_sock;
    1.55  		for(i=0; i<num_clients; i++) {
    1.56  			if(csock[i] == s) {
    1.57  				csock[i] = csock[num_clients - 1];
    1.58 -				csock = dynarr_pop(csock);
    1.59 -				break;
    1.60 +			}
    1.61 +			if(csock[i] > max_socket) {
    1.62 +				max_socket = csock[i];
    1.63  			}
    1.64  		}
    1.65 -		assert(i < num_clients);
    1.66 +
    1.67 +		csock = dynarr_pop(csock);
    1.68 +		--num_clients;
    1.69  	}
    1.70  	return 0;
    1.71  }
    1.72  
    1.73 +struct video_block {
    1.74 +	int frame;
    1.75 +	int x, y;
    1.76 +	int width, height;
    1.77 +	char pixels[1];
    1.78 +};
    1.79 +#define VBLOCK_HEADER_SIZE	(offsetof(struct video_block, pixels))
    1.80 +
    1.81  void srv_send_frame(unsigned char *frame, int xsz, int ysz)
    1.82  {
    1.83 +	static unsigned char *buffer;
    1.84 +	struct video_block *vblock;
    1.85 +
    1.86 +	/* for now just send a big block */
    1.87 +	if(!buffer && !(buffer = malloc(xsz * ysz * 2) + VBLOCK_HEADER_SIZE)) {
    1.88 +		fprintf(stderr, "failed to allocate frame send buffer\n");
    1.89 +		return;
    1.90 +	}
    1.91 +	vblock = buffer;
    1.92  }