aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--desiredata/src/u_pdreceive.c260
1 files changed, 89 insertions, 171 deletions
diff --git a/desiredata/src/u_pdreceive.c b/desiredata/src/u_pdreceive.c
index 8898e3a3..619d2f93 100644
--- a/desiredata/src/u_pdreceive.c
+++ b/desiredata/src/u_pdreceive.c
@@ -23,13 +23,12 @@ standard output. */
#define SOCKET_ERROR -1
#endif
-typedef struct _fdpoll
-{
- int fdp_fd;
- char *fdp_inbuf;
- int fdp_inhead;
- int fdp_intail;
- int fdp_udp;
+typedef struct _fdpoll {
+ int fd;
+ char *inbuf;
+ int inhead;
+ int intail;
+ int udp;
} t_fdpoll;
static int nfdpoll;
@@ -38,36 +37,29 @@ static int maxfd;
static int sockfd;
static int protocol;
-static void sockerror(char *s);
+static void sockerror(const char *s);
static void x_closesocket(int fd);
-static void dopoll(void);
+static void dopoll();
#define BUFSIZE 4096
-int main(int argc, char **argv)
-{
+int main(int argc, char **argv) {
int portno;
struct sockaddr_in server;
#ifdef MSW
short version = MAKEWORD(2, 0);
WSADATA nobby;
#endif
- if (argc < 2 || sscanf(argv[1], "%d", &portno) < 1 || portno <= 0)
- goto usage;
- if (argc >= 3)
- {
- if (!strcmp(argv[2], "tcp"))
- protocol = SOCK_STREAM;
- else if (!strcmp(argv[2], "udp"))
- protocol = SOCK_DGRAM;
+ if (argc < 2 || sscanf(argv[1],"%d",&portno)<1 || portno<=0) goto usage;
+ if (argc >= 3) {
+ if (!strcmp(argv[2],"tcp")) protocol = SOCK_STREAM;
+ else if (!strcmp(argv[2],"udp")) protocol = SOCK_DGRAM;
else goto usage;
- }
- else protocol = SOCK_STREAM;
+ } else protocol = SOCK_STREAM;
#ifdef MSW
if (WSAStartup(version, &nobby)) sockerror("WSAstartup");
#endif
sockfd = socket(AF_INET, protocol, 0);
- if (sockfd < 0)
- {
+ if (sockfd < 0) {
sockerror("socket()");
exit(1);
}
@@ -76,76 +68,56 @@ int main(int argc, char **argv)
server.sin_addr.s_addr = INADDR_ANY;
#ifdef IRIX
- /* this seems to work only in IRIX but is unnecessary in
- Linux. Not sure what MSW needs in place of this. */
- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, 0, 0) < 0)
- fprintf(stderr, "setsockopt failed\n");
+ /* this seems to work only in IRIX but is unnecessary in Linux. Not sure what MSW needs in place of this. */
+ if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, 0, 0) < 0) fprintf(stderr, "setsockopt failed\n");
#endif
- /* assign client port number */
+ /* assign client port number */
server.sin_port = htons((unsigned short)portno);
- /* name the socket */
- if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0)
- {
+ /* name the socket */
+ if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0) {
sockerror("bind");
x_closesocket(sockfd);
- return (0);
+ return 0;
}
- if (protocol == SOCK_STREAM)
- {
- if (listen(sockfd, 5) < 0)
- {
+ if (protocol == SOCK_STREAM) {
+ if (listen(sockfd, 5) < 0) {
sockerror("listen");
x_closesocket(sockfd);
- exit(1);
+ return 1;
}
}
- /* now loop forever selecting on sockets */
- while (1)
- dopoll();
-
+ /* now loop forever selecting on sockets */
+ while (1) dopoll();
usage:
fprintf(stderr, "usage: pdreceive <portnumber> [udp|tcp]\n");
fprintf(stderr, "(default is tcp)\n");
- exit(1);
+ return 1;
}
-static void addport(int fd)
-{
- t_fdpoll *fp;
- fdpoll = (t_fdpoll *)realloc(fdpoll,
- (nfdpoll+1) * sizeof(t_fdpoll));
- fp = fdpoll + nfdpoll;
- fp->fdp_fd = fd;
+static void addport(int fd) {
+ fdpoll = (t_fdpoll *)realloc(fdpoll, (nfdpoll+1)*sizeof(t_fdpoll));
+ t_fdpoll *fp = fdpoll + nfdpoll;
+ fp->fd = fd;
nfdpoll++;
if (fd >= maxfd) maxfd = fd + 1;
- fp->fdp_inhead = fp->fdp_intail = 0;
- if (!(fp->fdp_inbuf = (char *) malloc(BUFSIZE)))
- {
- fprintf(stderr, "out of memory");
- exit(1);
- }
+ fp->inhead = fp->intail = 0;
+ if (!(fp->inbuf = (char *) malloc(BUFSIZE))) {fprintf(stderr, "out of memory"); exit(1);}
printf("number_connected %d;\n", nfdpoll);
}
-static void rmport(t_fdpoll *x)
-{
- int i;
- t_fdpoll *fp;
- for (i = nfdpoll, fp = fdpoll; i--; fp++)
- {
- if (fp == x)
- {
- x_closesocket(fp->fdp_fd);
- free(fp->fdp_inbuf);
- while (i--)
- {
+static void rmport(t_fdpoll *x) {
+ t_fdpoll *fp = fdpoll;
+ for (int i=nfdpoll; i--; fp++) {
+ if (fp == x) {
+ x_closesocket(fp->fd);
+ free(fp->inbuf);
+ while (i--) {
fp[0] = fp[1];
fp++;
}
- fdpoll = (t_fdpoll *)realloc(fdpoll,
- (nfdpoll-1) * sizeof(t_fdpoll));
+ fdpoll = (t_fdpoll *)realloc(fdpoll, (nfdpoll-1)*sizeof(t_fdpoll));
nfdpoll--;
printf("number_connected %d;\n", nfdpoll);
return;
@@ -154,33 +126,24 @@ static void rmport(t_fdpoll *x)
fprintf(stderr, "warning: item removed from poll list but not found");
}
-static void doconnect(void)
-{
+static void doconnect() {
int fd = accept(sockfd, 0, 0);
- if (fd < 0)
- perror("accept");
+ if (fd < 0) perror("accept");
else addport(fd);
}
-static void udpread(void)
-{
+static void udpread() {
char buf[BUFSIZE];
int ret = recv(sockfd, buf, BUFSIZE, 0);
- if (ret < 0)
- {
+ if (ret<0) {
sockerror("recv (udp)");
x_closesocket(sockfd);
exit(1);
- }
- else if (ret > 0)
- {
+ } else if (ret>0) {
#ifdef MSW
- int j;
- for (j = 0; j < ret; j++)
- putchar(buf[j]);
+ for (int j=0; j<ret; j++) putchar(buf[j]);
#else
- if (write(1, buf, ret) < ret)
- {
+ if (write(1, buf, ret) < ret) {
perror("write");
exit(1);
}
@@ -188,131 +151,86 @@ static void udpread(void)
}
}
-static int tcpmakeoutput(t_fdpoll *x)
-{
+static int tcpmakeoutput(t_fdpoll *x) {
char messbuf[BUFSIZE+1], *bp = messbuf;
- int indx;
- int inhead = x->fdp_inhead;
- int intail = x->fdp_intail;
- char *inbuf = x->fdp_inbuf;
- if (intail == inhead)
- return (0);
- for (indx = intail; indx != inhead; indx = (indx+1)&(BUFSIZE-1))
- {
- /* search for a semicolon. */
+ int inhead = x->inhead;
+ int intail = x->intail;
+ char *inbuf = x->inbuf;
+ if (intail == inhead) return 0;
+ for (int indx = intail; indx != inhead; indx = (indx+1)&(BUFSIZE-1)) {
+ /* search for a semicolon. */
char c = *bp++ = inbuf[indx];
- if (c == ';')
- {
+ if (c == ';') {
intail = (indx+1)&(BUFSIZE-1);
- if (inbuf[intail] == '\n')
- intail = (intail+1)&(BUFSIZE-1);
+ if (inbuf[intail] == '\n') intail = (intail+1)&(BUFSIZE-1);
*bp++ = '\n';
#ifdef MSW
- {
- int j;
- for (j = 0; j < bp - messbuf; j++)
- putchar(messbuf[j]);
- }
+ for (int j=0; j<bp-messbuf; j++) putchar(messbuf[j]);
#else
- write(1, messbuf, bp - messbuf);
+ if (write(1, messbuf, bp-messbuf)<bp-messbuf) {perror("write"); exit(1);}
#endif
- x->fdp_inhead = inhead;
- x->fdp_intail = intail;
- return (1);
+ x->inhead = inhead;
+ x->intail = intail;
+ return 1;
}
}
- return (0);
+ return 0;
}
-static void tcpread(t_fdpoll *x)
-{
- int readto =
- (x->fdp_inhead >= x->fdp_intail ? BUFSIZE : x->fdp_intail-1);
+static void tcpread(t_fdpoll *x) {
+ int readto = x->inhead >= x->intail ? BUFSIZE : x->intail-1;
int ret;
-
- /* the input buffer might be full. If so, drop the whole thing */
- if (readto == x->fdp_inhead)
- {
+ /* the input buffer might be full. If so, drop the whole thing */
+ if (readto == x->inhead) {
fprintf(stderr, "pd: dropped message from gui\n");
- x->fdp_inhead = x->fdp_intail = 0;
+ x->inhead = x->intail = 0;
readto = BUFSIZE;
- }
- else
- {
- ret = recv(x->fdp_fd, x->fdp_inbuf + x->fdp_inhead,
- readto - x->fdp_inhead, 0);
- if (ret < 0)
- {
+ } else {
+ ret = recv(x->fd, x->inbuf + x->inhead, readto - x->inhead, 0);
+ if (ret < 0) {
sockerror("recv (tcp)");
rmport(x);
- }
- else if (ret == 0)
- rmport(x);
- else
- {
- x->fdp_inhead += ret;
- if (x->fdp_inhead >= BUFSIZE)
- x->fdp_inhead = 0;
- while (tcpmakeoutput(x))
- ;
+ } else if (ret == 0) rmport(x);
+ else {
+ x->inhead += ret;
+ if (x->inhead >= BUFSIZE) x->inhead = 0;
+ while (tcpmakeoutput(x)) {}
}
}
}
-static void dopoll(void)
-{
- int i;
+static void dopoll() {
t_fdpoll *fp;
fd_set readset, writeset, exceptset;
FD_ZERO(&writeset);
FD_ZERO(&readset);
FD_ZERO(&exceptset);
-
FD_SET(sockfd, &readset);
- if (protocol == SOCK_STREAM)
- {
- for (fp = fdpoll, i = nfdpoll; i--; fp++)
- FD_SET(fp->fdp_fd, &readset);
+ if (protocol == SOCK_STREAM) {
+ fp = fdpoll;
+ for (int i=nfdpoll; i--; fp++) FD_SET(fp->fd, &readset);
}
- if (select(maxfd+1, &readset, &writeset, &exceptset, 0) < 0)
- {
- perror("select");
- exit(1);
- }
- if (protocol == SOCK_STREAM)
- {
- for (i = 0; i < nfdpoll; i++)
- if (FD_ISSET(fdpoll[i].fdp_fd, &readset))
- tcpread(&fdpoll[i]);
- if (FD_ISSET(sockfd, &readset))
- doconnect();
- }
- else
- {
- if (FD_ISSET(sockfd, &readset))
- udpread();
+ if (select(maxfd+1, &readset, &writeset, &exceptset, 0) < 0) {perror("select"); exit(1);}
+ if (protocol == SOCK_STREAM) {
+ for (int i=0; i<nfdpoll; i++) if (FD_ISSET(fdpoll[i].fd, &readset)) tcpread(&fdpoll[i]);
+ if (FD_ISSET(sockfd, &readset)) doconnect();
+ } else {
+ if (FD_ISSET(sockfd, &readset)) udpread();
}
}
-
-static void sockerror(char *s)
-{
+static void sockerror(const char *s) {
#ifdef MSW
int err = WSAGetLastError();
if (err == 10054) return;
- else if (err == 10044)
- {
- fprintf(stderr,
- "Warning: you might not have TCP/IP \"networking\" turned on\n");
- }
+ else if (err == 10044) fprintf(stderr,"Warning: you might not have TCP/IP \"networking\" turned on\n");
#else
int err = errno;
#endif
fprintf(stderr, "%s: %s (%d)\n", s, strerror(err), err);
}
-static void x_closesocket(int fd)
-{
+static void x_closesocket(int fd) {
#ifdef MSW
closesocket(fd);
#else