fixed input system (callback added), more ivac tests
authorhackbard <hackbard>
Wed, 5 May 2004 21:48:15 +0000 (21:48 +0000)
committerhackbard <hackbard>
Wed, 5 May 2004 21:48:15 +0000 (21:48 +0000)
src/input.c
src/input.h
src/ivac.c
src/ivac.h

index 47f808b..a2886ee 100644 (file)
@@ -8,30 +8,62 @@
 
 int input_init(t_input *input) {
 
+  struct termios tios;
+
   puts("[input] initializing input system ...");
 
   if((input->content=(char *)malloc(MAX_CONTENT))==NULL) {
     perror("[input] malloc call");
-    return K_ERROR;
+    return I_ERROR;
   }
+  input->c_count=0;
+
+  tcgetattr(0,&tios);
+  /* switch off canonical mode */
+  tios.c_lflag&=(~ICANON);
+  tios.c_lflag&=(~ECHO);
+  tcsetattr(0,TCSANOW,&tios);
 
-  return K_SUCCESS;
+  return I_SUCCESS;
 }
 
 int input_shutdown(t_input *input) {
 
+  struct termios tios;
+
   free(input->content);
+
+  tcgetattr(0,&tios);
+  tios.c_lflag|=ICANON;
+  tios.c_lflag|=ECHO;
+  tcsetattr(0,TCSANOW,&tios);
+
   puts("[input] shutdown");
 
-  return K_SUCCESS;
+  return I_SUCCESS;
 }
 
-int input_get_char(t_input *input) {
+int input_get_char(t_input *input,int (*callback)(t_input *input,void *ptr),
+                   void *ptr) {
+
+  char data[1];
+
+  if(read(0,data,1)==-1) {
+    perror("[input] read call");
+    return I_ERROR;
+  }
+
+  if(input->c_count==MAX_CONTENT) {
+    puts("[input] max input length reached");
+    return I_ERROR;
+  }
+
+  input->content[input->c_count]=data[0];
+  input->c_count++;
 
-  char data[64];
+  if(data[0]=='\n') input->c_count=0;
 
-  puts("a hopefully nice display for user interaction will popup soon ;)");
-  read(0,data,64);
+  callback(input,ptr);
 
-  return K_SUCCESS;
+  return I_SUCCESS;
 }
index 7f5796b..e31ebe2 100644 (file)
@@ -8,10 +8,11 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <errno.h>
+#include <termios.h>
 
 /* defines */
-#define K_SUCCESS 1
-#define K_ERROR -1
+#define I_SUCCESS 1
+#define I_ERROR -1
 
 #define MENUE (1<<0)
 #define CONNECTIONS (1<<1)
 /* input specific variables */
 typedef struct s_input {
   char *content;
+  int c_count;
   unsigned char mode;
 } t_input;
 
+/* function prototypes */
+int input_init(t_input *input);
+int input_shutdown(t_input *input);
+int input_get_char(t_input *input,int (*callback)(t_input *input,void *ptr),
+                   void *ptr);
+
 #endif
index c567f28..f4995a7 100644 (file)
@@ -46,7 +46,10 @@ int main(int argc,char **argv) {
   input_init(&(ivac.input));
 
   /* network init */
-  network_init(&(ivac.net));
+  if(network_init(&(ivac.net))==N_ERROR) {
+    printf("[ivac] use 'fuser -n tcp %d' to kill that process",ivac.net.l_port);
+    return ERROR;
+  }
 
   /* add listening port + stdin to (read) event system */
   event_math(ivac.net.l_fd,&(ivac.event),READ,ADD);
@@ -55,6 +58,10 @@ 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);
 
+  network_shutdown(&(ivac.net));
+
+  input_shutdown(&(ivac.input));
+
   return SUCCESS;
 }
 
@@ -79,7 +86,8 @@ int ivac_event_cb(t_event *event,void *ptr) {
         receive_info(channel,&(ivac->net));
 
   /* user interaction */
-  if(FD_ISSET(0,&(event->rfds))) input_get_char(ivac);
+  if(FD_ISSET(0,&(event->rfds)))
+    input_get_char(&(ivac->input),ivac_display,ivac);
     
   return SUCCESS;
 }
@@ -90,3 +98,14 @@ int ivac_regular_cb(t_event *event,void *ptr) {
 
   return SUCCESS;
 }
+
+int ivac_display(t_input *input,void *ptr) {
+
+  t_ivac *ivac;
+
+  ivac=(t_ivac *)ptr;
+
+  if(input->content[input->c_count-1]=='q') ivac->event.status=DISABLED;
+
+   return SUCCESS;
+}
index 76844f5..9cbced9 100644 (file)
@@ -33,5 +33,6 @@ typedef struct s_ivac {
 /* function prototypes */
 int ivac_event_cb(t_event *event,void *ptr);
 int ivac_regular_cb(t_event *event,void *ptr);
+int ivac_display(t_input *input,void *ptr);
 
 #endif