projects
/
gapil.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revisione della sezione su shutdown, iniziato lavoro sulla versione
[gapil.git]
/
sources
/
TCP_echod.c
diff --git
a/sources/TCP_echod.c
b/sources/TCP_echod.c
index 606f85281c81117797816563483880e32814f43f..fd51f982797a745c6d5d2f1e8fc1cf3c5949b45d 100644
(file)
--- a/
sources/TCP_echod.c
+++ b/
sources/TCP_echod.c
@@
-1,6
+1,6
@@
-/*
ElemEchoTCPServer
.c
+/*
TCP_echod
.c
*
*
- * Copyright (C) 2001 Simone Piccardi
+ * Copyright (C) 2001
-2003
Simone Piccardi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@
-26,7
+26,7
@@
*
* Usage: echod -h give all info
*
*
* Usage: echod -h give all info
*
- * $Id: TCP_echod.c,v 1.1
2003/05/02 09:50:55
piccardi Exp $
+ * $Id: TCP_echod.c,v 1.1
2 2003/08/03 18:12:47
piccardi Exp $
*
****************************************************************/
/*
*
****************************************************************/
/*
@@
-40,12
+40,14
@@
#include <time.h>
#include <syslog.h> /* syslog system functions */
#include <signal.h> /* signal functions */
#include <time.h>
#include <syslog.h> /* syslog system functions */
#include <signal.h> /* signal functions */
+#include <errno.h> /* error code */
+#include <string.h> /* error strings */
#include "Gapil.h"
#define BACKLOG 10
#define MAXLINE 256
#include "Gapil.h"
#define BACKLOG 10
#define MAXLINE 256
-int demonize = 1; /* daemon use option */
-int debugging = 0; /* debug info printing option */
+int demonize = 1; /* daemon use option
: default is daemon
*/
+int debugging = 0; /* debug info printing option
: default is no debug
*/
/* Subroutines declaration */
void usage(void);
void ServEcho(int sockfd);
/* Subroutines declaration */
void usage(void);
void ServEcho(int sockfd);
@@
-57,15
+59,19
@@
int main(int argc, char *argv[])
* Variables definition
*/
int list_fd, conn_fd;
* Variables definition
*/
int list_fd, conn_fd;
+ int waiting = 0;
+ int compat = 0;
pid_t pid;
pid_t pid;
- struct sockaddr_in serv_add;
+ struct sockaddr_in serv_add, cli_add;
+ socklen_t len;
+ char debug[MAXLINE], ipaddr[20];
/*
* Input section: decode parameters passed in the calling
* Use getopt function
*/
int i;
opterr = 0; /* don't want writing to stderr */
/*
* Input section: decode parameters passed in the calling
* Use getopt function
*/
int i;
opterr = 0; /* don't want writing to stderr */
- while ( (i = getopt(argc, argv, "hdi")) != -1) {
+ while ( (i = getopt(argc, argv, "hdi
cw:
")) != -1) {
switch (i) {
/*
* Handling options
switch (i) {
/*
* Handling options
@@
-78,9
+84,15
@@
int main(int argc, char *argv[])
case 'i':
demonize = 0;
break;
case 'i':
demonize = 0;
break;
+ case 'c':
+ compat = 1;
+ break;
case 'd':
debugging = 1;
break;
case 'd':
debugging = 1;
break;
+ case 'w':
+ waiting = strtol(optarg, NULL, 10);
+ break;
case '?': /* unrecognized options */
printf("Unrecognized options -%c\n",optopt);
usage();
case '?': /* unrecognized options */
printf("Unrecognized options -%c\n",optopt);
usage();
@@
-95,8
+107,12
@@
int main(int argc, char *argv[])
* Main code beginning
*
* ***********************************************************/
* Main code beginning
*
* ***********************************************************/
- /* install SIGCHLD handler */
- Signal(SIGCHLD, HandSigCHLD); /* establish handler */
+ /* Main code begin here */
+ if (compat) { /* install signal handler */
+ Signal(SIGCHLD, HandSigCHLD); /* non restarting handler */
+ } else {
+ SignalRestart(SIGCHLD, HandSigCHLD); /* restarting handler */
+ }
/* create socket */
if ( (list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Socket creation error");
/* create socket */
if ( (list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Socket creation error");
@@
-133,13
+149,25
@@
int main(int argc, char *argv[])
PrintErr("listen error");
exit(1);
}
PrintErr("listen error");
exit(1);
}
+ if (waiting) sleep(waiting);
/* handle echo to client */
while (1) {
/* accept connection */
/* handle echo to client */
while (1) {
/* accept connection */
- if ( (conn_fd = accept(list_fd, NULL, NULL)) < 0) {
+ while (((conn_fd = accept(list_fd, (struct sockaddr *)&cli_add, &len))
+ < 0) && (errno == EINTR));
+ if ( conn_fd < 0) {
PrintErr("accept error");
exit(1);
}
PrintErr("accept error");
exit(1);
}
+ if (debugging) {
+ inet_ntop(AF_INET, &cli_add.sin_addr, ipaddr, sizeof(ipaddr));
+ snprintf(debug, MAXLINE, "Accepted connection form %s\n", ipaddr);
+ if (demonize) {
+ syslog(LOG_DEBUG, debug);
+ } else {
+ printf("%s", debug);
+ }
+ }
/* fork to handle connection */
if ( (pid = fork()) < 0 ){
PrintErr("fork error");
/* fork to handle connection */
if ( (pid = fork()) < 0 ){
PrintErr("fork error");
@@
-148,6
+176,14
@@
int main(int argc, char *argv[])
if (pid == 0) { /* child */
close(list_fd); /* close listening socket */
ServEcho(conn_fd); /* handle echo */
if (pid == 0) { /* child */
close(list_fd); /* close listening socket */
ServEcho(conn_fd); /* handle echo */
+ if (debugging) {
+ snprintf(debug, MAXLINE, "Closed connection %s\n", ipaddr);
+ if (demonize) {
+ syslog(LOG_DEBUG, debug);
+ } else {
+ printf("%s", debug);
+ }
+ }
exit(0);
} else { /* parent */
close(conn_fd); /* close connected socket */
exit(0);
} else { /* parent */
close(conn_fd); /* close connected socket */
@@
-164,8
+200,10
@@
void usage(void) {
printf("Usage:\n");
printf(" echod [-h] \n");
printf(" -h print this help\n");
printf("Usage:\n");
printf(" echod [-h] \n");
printf(" -h print this help\n");
- printf(" -d
print
debug info\n");
+ printf(" -d
write
debug info\n");
printf(" -i use interactively\n");
printf(" -i use interactively\n");
+ printf(" -c disable BSD semantics\n");
+ printf(" -w N wait N sec. before calling accept\n");
exit(1);
}
/*
exit(1);
}
/*
@@
-175,14
+213,21
@@
void ServEcho(int sockfd) {
char buffer[MAXLINE];
int nread, nwrite;
char debug[MAXLINE+20];
char buffer[MAXLINE];
int nread, nwrite;
char debug[MAXLINE+20];
- int size;
/* main loop, reading 0 char means client close connection */
while ( (nread = read(sockfd, buffer, MAXLINE)) != 0) {
/* main loop, reading 0 char means client close connection */
while ( (nread = read(sockfd, buffer, MAXLINE)) != 0) {
+ if (nread < 0) {
+ PrintErr("Errore in lettura");
+ return;
+ }
nwrite = FullWrite(sockfd, buffer, nread);
nwrite = FullWrite(sockfd, buffer, nread);
+ if (nwrite) {
+ PrintErr("Errore in scrittura");
+ return;
+ }
if (debugging) {
buffer[nread] = 0;
snprintf(debug, MAXLINE+20, "Letti %d byte, %s", nread, buffer);
if (debugging) {
buffer[nread] = 0;
snprintf(debug, MAXLINE+20, "Letti %d byte, %s", nread, buffer);
- if (demonize) { /*
go daemon
*/
+ if (demonize) { /*
daemon mode
*/
syslog(LOG_DEBUG, debug);
} else {
printf("%s", debug);
syslog(LOG_DEBUG, debug);
} else {
printf("%s", debug);
@@
-195,8
+240,8
@@
void ServEcho(int sockfd) {
* routine to print error on stout or syslog
*/
void PrintErr(char * error) {
* routine to print error on stout or syslog
*/
void PrintErr(char * error) {
- if (demonize) {
/* go daemon
*/
- syslog(LOG_ERR,
error);
+ if (demonize) {
/* daemon mode
*/
+ syslog(LOG_ERR,
"%s: %m", error); /* log string and error message */
} else {
perror(error);
}
} else {
perror(error);
}