fixed -h and wrong argv returns
[my-code/ivac.git] / src / ivac.c
index 0a29f21..e3e2060 100644 (file)
  */
 
 // #define USE_NCURSES
+/* dont care about ncurses .. go for gtk(2)! */
+#define USE_GTK
 
 #include "ivac.h"
 
+int usage(void) {
+
+  puts("");
+  puts("usage: ivac <options>");
+  puts("");
+  puts("options:");
+  puts("-h \t\t show this help");
+  puts("-n <name> \t specify your name");
+  puts("-p <port> \t specify port to listen for incoming connections");
+  puts("");
+
+  return SUCCESS;
+}
+
 int main(int argc,char **argv) {
 
   /* TESTING BY NOW */
@@ -32,13 +48,31 @@ int main(int argc,char **argv) {
   t_ivac ivac;
   int i;
 
-  if(argc!=2) {
-    printf("\nusage: %s <username>\n\n",argv[0]);
-    return ERROR;
+  /* default values */
+  strcpy(ivac.username,"ivac");
+  ivac.net.l_port=IVAC_LISTEN_PORT;
+  /* parse argv and change default values */
+  for(i=1;i<argc;i++) {
+    if(argv[i][0]=='-') {
+      switch(argv[i][1]) {
+        case 'h':
+          usage();
+          return SUCCESS;
+        case 'n':
+          strncpy(ivac.username,argv[++i],CHAR_USERNAME);
+          break;
+        case 'p':
+          ivac.net.l_port=atoi(argv[++i]);
+          break;
+        default:
+          usage();
+          return ERROR;
+      }
+    }
+    else usage();
   }
 
-  /* set username */
-  strncpy(ivac.username,argv[1],CHAR_USERNAME);
   /* clear challenger struct */
   for(i=0;i<MAX_CONNECTIONS;i++)
     memset(&(ivac.challenger[i]),0,sizeof(t_challenger));
@@ -60,8 +94,6 @@ int main(int argc,char **argv) {
   ivac.input.mode=CONTENT_BUFFER;
   input_init(&(ivac.input));
 
-  /* set listen port (futur: read from config or entered later) */
-  network_set_listen_port(&(ivac.net),IVAC_LISTEN_PORT);
   /* network init */
   if(network_init(&(ivac.net))==N_ERROR) {
     printf("[ivac] use 'fuser -n tcp %d' to determine the process to kill!\n",
@@ -74,8 +106,10 @@ int main(int argc,char **argv) {
   event_math(ivac.net.l_fd,&(ivac.event),READ,ADD);
   event_math(0,&(ivac.event),READ,ADD);
 
+#ifdef USE_NCURSES
   /* display init */
-  // display_init(&(ivac.display));
+  display_init(&(ivac.display));
+#endif
 
   /* display */
   ivac_display(&(ivac.display));
@@ -83,8 +117,6 @@ int main(int argc,char **argv) {
   /* start event system - callbacks used: ivac_event_cb + ivac_regular_cb */
   event_start(&(ivac.event),(void *)&ivac,ivac_event_cb,ivac_regular_cb);
 
-  // ivac_shutdown(&ivac);
-
   return SUCCESS;
 }
 
@@ -93,7 +125,9 @@ int ivac_shutdown(t_ivac *ivac) {
   network_shutdown(&(ivac->net));
   input_shutdown(&(ivac->input));
   event_stop(&(ivac->event));
-  // display_shutdown(&(ivac->display));
+#ifdef USE_NCURSES
+  display_shutdown(&(ivac->display));
+#endif
 
   return SUCCESS;
 }
@@ -131,7 +165,7 @@ int ivac_send_info(int channel,t_ivac *ivac) {
 
 int ivac_send_quit(int channel,t_ivac *ivac) {
 
-  char data[6];
+  char data[7]; /* one more for \0 */
 
   data[0]=IVAC_SEND_QUIT;
   data[1]=4;
@@ -148,6 +182,7 @@ int ivac_send_quit(int channel,t_ivac *ivac) {
 int ivac_receive_info(int channel,t_ivac *ivac) {
 
   char data[SEND_N_MAX];
+  char c_str[IVAC_CONSOLE_STRING_LEN];
   int count,length;
 
   count=0;
@@ -176,19 +211,25 @@ int ivac_receive_info(int channel,t_ivac *ivac) {
         break;
       case IVAC_SEND_QUIT:
         if(!(strncmp(data+count+2,"quit",data[1])))
+          sprintf(c_str,"channel %02d: connection closed by remote host",
+                  channel);
           event_math(ivac->net.connection[channel].fd,&(ivac->event),
                      READ,REMOVE);
           network_close(&(ivac->net),channel);
           memset(&(ivac->challenger[channel]),0,sizeof(t_challenger));
+          ivac_add_to_monitor(ivac,c_str);
           count+=6;
+          break;
       default:
-        puts("[ivac] ivac_receive_info, unknown character");
+        sprintf(c_str,"ivac_receive_info, unknown character: 0x%02x\n",
+               data[count]);
+        ivac_add_to_monitor(ivac,c_str);
         return ERROR;
         break;
     }
   }
 
-  return SUCCESS;
+  return length;
 }
 
 int ivac_event_cb(t_event *event,void *ptr) {
@@ -221,9 +262,15 @@ int ivac_event_cb(t_event *event,void *ptr) {
   for(channel=0;channel<MAX_CONNECTIONS;channel++) {
     if(ivac->net.connection[channel].status&C_ESTABL) {
       /* remote is sending info */
-      if(FD_ISSET(ivac->net.connection[channel].fd,&(event->rfds)))
-        ivac_receive_info(channel,ivac);
-        // ivac_display_content(ivac);
+      if(FD_ISSET(ivac->net.connection[channel].fd,&(event->rfds))) {
+        if(ivac_receive_info(channel,ivac)==0) {
+          event_math(ivac->net.connection[channel].fd,event,READ,REMOVE);
+          network_close(&(ivac->net),channel);
+          sprintf(c_str,"channel %02d: broken pipe - disconnected",channel);
+          ivac_add_to_monitor(ivac,c_str);
+        }
+        ivac_display_content(ivac);
+      }
     }
   } 
 
@@ -286,6 +333,12 @@ int ivac_parse_command(t_input *input,void *ptr) {
     if(!(strncmp(arg[0],"quit",4))) {
       valid=1;
       sprintf(c_str,"ivac shutdown ...");
+      for(i=0;i<MAX_CONNECTIONS;i++) {
+        if(ivac->net.connection[i].status&C_ESTABL) {
+          ivac_send_quit(i,ivac);
+          network_close(&(ivac->net),i);
+        }
+      }
       ivac_shutdown(ivac);
     }
     if(!(strncmp(arg[0],"set",3))) {