reactos/modules/rosapps/applications/net/ncftp/sio/srltest.c

118 lines
2.6 KiB
C

/* srltest.c */
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#ifdef CAN_USE_SYS_SELECT_H
# include <sys/select.h>
#endif
#include "sio.h"
static void
ServeOneClient(int sockfd, struct sockaddr_in *cliAddr)
{
char buf[80], cliAddrStr[64];
char bbuf[320];
int nread, nwrote, i;
SReadlineInfo srl;
printf("subserver[%d]: started, connected to %s.\n", (int) getpid(),
AddrToAddrStr(cliAddrStr, sizeof(cliAddrStr), cliAddr, 1, "<%h:%p>")
);
if (InitSReadlineInfo(&srl, sockfd, bbuf, sizeof(bbuf), 5) < 0) {
fprintf(stderr, "subserver[%d]: InitSReadlineInfo error: %s\n",
(int) getpid(), strerror(errno));
exit(1);
}
for (;;) {
nread = SReadline(&srl, buf, sizeof(buf));
if (nread == 0) {
break;
} else if (nread == kTimeoutErr) {
printf("subserver[%d]: idle\n", (int) getpid());
continue;
} else if (nread < 0) {
fprintf(stderr, "subserver[%d]: read error: %s\n",
(int) getpid(), strerror(errno));
break;
}
for (i=0; i<nread; i++)
if (islower(buf[i]))
buf[i] = toupper(buf[i]);
nwrote = SWrite(sockfd, buf, nread, 15);
if (nwrote < 0) {
fprintf(stderr, "subserver[%d]: write error: %s\n",
(int) getpid(), strerror(errno));
break;
}
}
(void) SClose(sockfd, 10);
printf("subserver[%d]: done.\n", (int) getpid());
exit(0);
} /* ServeOneClient */
static void
Server(int port)
{
int sockfd, newsockfd;
struct sockaddr_in cliAddr;
int pid;
sockfd = SNewStreamServer(port, 3, kReUseAddrYes, 3);
if (sockfd < 0) {
perror("Server setup failed");
exit(1);
}
printf("server[%d]: started.\n", (int) getpid());
for(;;) {
while (waitpid(-1, NULL, WNOHANG) > 0) ;
newsockfd = SAccept(sockfd, &cliAddr, 5);
if (newsockfd < 0) {
if (newsockfd == kTimeoutErr)
printf("server[%d]: idle\n", (int) getpid());
else
fprintf(stderr, "server[%d]: accept error: %s\n",
(int) getpid(), strerror(errno));
} else if ((pid = fork()) < 0) {
fprintf(stderr, "server[%d]: fork error: %s\n",
(int) getpid(), strerror(errno));
exit(1);
} else if (pid == 0) {
ServeOneClient(newsockfd, &cliAddr);
exit(0);
} else {
/* Parent doesn't need it now. */
(void) close(newsockfd);
}
}
} /* Server */
void
main(int argc, char **argv)
{
int port;
if (argc < 2) {
fprintf(stderr, "Usage: %s <port>\n", argv[0]);
exit(2);
}
port = atoi(argv[1]);
Server(port);
exit(0);
} /* main */