*
* Usage: echod -h give all info
*
- * $Id: TCP_echod.c,v 1.4 2003/06/18 21:19:24 piccardi Exp $
+ * $Id: TCP_echod.c,v 1.9 2003/07/27 23:41:04 piccardi Exp $
*
****************************************************************/
/*
#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
* Variables definition
*/
int list_fd, conn_fd;
- int waiting;
+ int waiting = 0;
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
/* handle echo to client */
while (1) {
/* accept connection */
- while (((conn_fd = accept(list_fd, NULL, NULL)) < 0)
- && (errno == EINTR));
+ while (((conn_fd = accept(list_fd, (struct sockaddr *)&cli_add, &len))
+ < 0) && (errno == EINTR));
if ( conn_fd < 0) {
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");
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(" -w N wait N sec. before calling accept\n");
exit(1);
}
/*
int size;
/* main loop, reading 0 char means client close connection */
while ( (nread = read(sockfd, buffer, MAXLINE)) != 0) {
+ if (nread < 0) {
+ snprintf(debug, MAXLINE+20, "Errore in lettura: %s \n",
+ strerror(errno));
+ if (demonize) { /* daemon mode */
+ syslog(LOG_DEBUG, debug);
+ } else {
+ printf("%s", debug);
+ }
+ }
nwrite = FullWrite(sockfd, buffer, nread);
+ if (nwrite) {
+ snprintf(debug, MAXLINE+20, "Errore in scrittura: %s \n",
+ strerror(errno));
+ if (demonize) { /* daemon mode */
+ syslog(LOG_DEBUG, debug);
+ } else {
+ printf("%s", debug);
+ }
+ }
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);
* 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);
}