client compiled :)
This commit is contained in:
		
							parent
							
								
									236e274656
								
							
						
					
					
						commit
						0ef949ce91
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -3,4 +3,5 @@ | |||||||
| *.o | *.o | ||||||
| 
 | 
 | ||||||
| guinnessd | guinnessd | ||||||
|  | guinness | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								Makefile
									
									
									
									
									
								
							| @ -12,6 +12,8 @@ COPT =	-Wall -g | |||||||
| D_OBJS = xmem.o broadcast.o printlog.o lists.o tools.o drinks.o		\
 | D_OBJS = xmem.o broadcast.o printlog.o lists.o tools.o drinks.o		\
 | ||||||
| 	commands.o clients.o | 	commands.o clients.o | ||||||
| 
 | 
 | ||||||
|  | C_OBJS = xmem.o tools.o | ||||||
|  | 
 | ||||||
| D_LIBS  = -lpthread -lcrypt | D_LIBS  = -lpthread -lcrypt | ||||||
| 
 | 
 | ||||||
| # ---------------------------------------------------------
 | # ---------------------------------------------------------
 | ||||||
| @ -25,6 +27,14 @@ guinnessd:	guinnessd.o Makefile $(D_OBJS) | |||||||
| guinnessd.o:	guinnessd.c Makefile $(H_DEP) | guinnessd.o:	guinnessd.c Makefile $(H_DEP) | ||||||
| 	gcc $(COPT) -c $<   | 	gcc $(COPT) -c $<   | ||||||
| 
 | 
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | guinness:	guinness.o Makefile $(D_OBJS) | ||||||
|  | 	gcc -g $<   $(C_OBJS)  $(D_LIBS)     -o $@ | ||||||
|  | 
 | ||||||
|  | guinness.o:	guinness.c Makefile $(H_DEP) | ||||||
|  | 	gcc $(COPT) -c $<   | ||||||
|  | 
 | ||||||
| # ---------------------------------------------------------
 | # ---------------------------------------------------------
 | ||||||
| #
 | #
 | ||||||
| #	modules needed by the daemon
 | #	modules needed by the daemon
 | ||||||
| @ -49,6 +59,4 @@ clients.o:	clients.c Makefile $(H_DEP) | |||||||
| 
 | 
 | ||||||
| # ---------------------------------------------------------
 | # ---------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| clients.o:	clients.c Makefile $(H_DEP) |  | ||||||
| 	gcc $(COPT) -c $< |  | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										529
									
								
								guinness.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										529
									
								
								guinness.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,529 @@ | |||||||
|  | /*
 | ||||||
|  |  * guinness | ||||||
|  |  * architecture clients/serveur guinness. | ||||||
|  |  * Thomas Nemeth -- le 15 juin 2001 | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <getopt.h> | ||||||
|  | #include <signal.h> | ||||||
|  | #include <pthread.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <strings.h> | ||||||
|  | #include "defines.h" | ||||||
|  | #include "xmem.h" | ||||||
|  | #include "guinness.h" | ||||||
|  | #include "tools.h" | ||||||
|  | #include "config.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef SunOS | ||||||
|  | char *crypt(const char *key, const char *salt); | ||||||
|  | #else | ||||||
|  | extern char *crypt __P ((__const char *__key, __const char *__salt)); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* VARIABLES GLOBALES */ | ||||||
|  | char **commandes    = NULL; | ||||||
|  | char  *utilisateur  = NULL; | ||||||
|  | char  *boisson      = NULL; | ||||||
|  | char  *serveur      = NULL; | ||||||
|  | char  *prompt       = NULL; | ||||||
|  | char  *logout       = NULL; | ||||||
|  | char   cmdchr       = 0; | ||||||
|  | int    port         = 0; | ||||||
|  | int    nb_cmd       = 0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Lecture du fichier de config : récupération des valeurs | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | char *get_string_from_token (char *line) { | ||||||
|  |     char *result = line; | ||||||
|  |     char *tmp; | ||||||
|  |     int   keyval = 0; | ||||||
|  | 
 | ||||||
|  |     while ( (keyval != 1) && (result [0] != 0) ) { | ||||||
|  |         if (result [0] == '=') keyval = 1; | ||||||
|  |         if (keyval == 0) result++; | ||||||
|  |     } | ||||||
|  |     tmp = result++; | ||||||
|  |     while (tmp [0] != 0) { | ||||||
|  |         if (tmp [0] == '\n') tmp [0] = 0; | ||||||
|  |         tmp++; | ||||||
|  |     } | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Lecture du fichier de config | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | void load_config () { | ||||||
|  |     FILE *file; | ||||||
|  |     char *configfile; | ||||||
|  |     char  tmpstr[MAXSTRLEN + 1]; | ||||||
|  |     char *Home; | ||||||
|  |     char *value; | ||||||
|  | 
 | ||||||
|  |     Home = getenv ("HOME"); | ||||||
|  |     configfile = xmalloc ((strlen (Home) +  | ||||||
|  |                            strlen (CONFIG_FILE) + 2) * sizeof (char)); | ||||||
|  |     snprintf (configfile, MAXSTRLEN, "%s/%s", Home, CONFIG_FILE); | ||||||
|  | 
 | ||||||
|  |     /* Ouverture du fichier */ | ||||||
|  |     if ( (file = fopen (configfile, "r") ) != NULL) { | ||||||
|  |         /* Lecture du fichier */ | ||||||
|  |         while (! feof (file) ) { | ||||||
|  |             memset (tmpstr, 0, MAXSTRLEN + 1); | ||||||
|  |             fgets (tmpstr, (int) MAXSTRLEN, file); | ||||||
|  |             value = get_string_from_token (tmpstr); | ||||||
|  |             if ( (strncmp (tmpstr, "user=", 5) == 0) && (utilisateur == NULL) ) | ||||||
|  |                 utilisateur = xstrdup (value); | ||||||
|  |             if ( (strncmp (tmpstr, "server=", 7) == 0) && (serveur == NULL) ) | ||||||
|  |                 serveur = xstrdup (value); | ||||||
|  |             if ( (strncmp (tmpstr, "port=", 5) == 0) && (port == 0) ) | ||||||
|  |                 port = atoi (value); | ||||||
|  |             if ( (strncmp (tmpstr, "prompt=", 7) == 0) && (prompt == NULL) ) | ||||||
|  |                 prompt = xstrdup (value); | ||||||
|  |             if ( (strncmp (tmpstr, "pref=", 5) == 0) && (boisson == NULL) ) | ||||||
|  |                 boisson = xstrdup (value); | ||||||
|  |             if ( (strncmp (tmpstr, "cmdchr=", 7) == 0) && (cmdchr == 0) ) | ||||||
|  |                 cmdchr = value[0]; | ||||||
|  |             if ( (strncmp (tmpstr, "logout=", 7) == 0) && (logout == NULL) ) | ||||||
|  |                 logout = xstrdup (value); | ||||||
|  |         } | ||||||
|  |         fclose (file); | ||||||
|  | #ifdef DEBUG | ||||||
|  |     } else { | ||||||
|  |         fprintf (stderr, "Pas de fichier de config (%s).\n", configfile); | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  |     free (configfile); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Fonction de nettoyage | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | void libere () { | ||||||
|  |     if (utilisateur) free (utilisateur); | ||||||
|  |     if (serveur)     free (serveur); | ||||||
|  |     if (boisson)     free (boisson); | ||||||
|  |     if (logout)      free (logout); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Aide | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | void Usage (int help) { | ||||||
|  |     printf ("guinness by Thomas Nemeth - v %s (compilation %s : %s)\n", | ||||||
|  |             VERSION, OS_TYPE, COMPIL_DATE); | ||||||
|  |     if (help) | ||||||
|  |         printf ("Usage : guinness [-h] [-v] [-m machine] " | ||||||
|  |                 "[-p port] [-u utilisateur] [-b boisson] [-q msgdx]\n" | ||||||
|  |                 "   -h             : aide sur les paramètres\n" | ||||||
|  |                 "   -v             : affiche la version\n" | ||||||
|  |                 "   -m machine     : spéficie le nom du serveur\n" | ||||||
|  |                 "   -p port        : spécifie le numéro du port\n" | ||||||
|  |                 "   -u utilisateur : nom d'utilisateur\n" | ||||||
|  |                 "   -b boisson     : boisson préférée\n" | ||||||
|  |                 "   -q msgdx       : message d'au-revoir à la déconnexion\n" | ||||||
|  |                 " Online (précédé du caractère de commande \"/\") :\n" | ||||||
|  |                 "   help           : affiche l'aide sur les commandes\n" | ||||||
|  |                 "   quit           : quitte\n\n"); | ||||||
|  |     libere (); | ||||||
|  |     exit (1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Traitement des arguments | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | void traite_argv (int argc, char *argv[]) { | ||||||
|  |     int option; | ||||||
|  | 
 | ||||||
|  |     /* Vérification des paramètres */ | ||||||
|  |     while ((option = getopt (argc, argv, "hvm:p:u:b:q:")) != -1) { | ||||||
|  |         switch (option) { | ||||||
|  |             case 'h' : | ||||||
|  |                 Usage (TRUE); | ||||||
|  |                 break; | ||||||
|  |             case 'v' : | ||||||
|  |                 Usage (FALSE); | ||||||
|  |                 break; | ||||||
|  |             case 'm' : | ||||||
|  |                 SET_STRING (serveur, optarg); | ||||||
|  |                 break; | ||||||
|  |             case 'p' : | ||||||
|  |                 port = atoi (optarg); | ||||||
|  |                 break; | ||||||
|  |             case 'u' : | ||||||
|  |                 SET_STRING (utilisateur, optarg); | ||||||
|  |                 break; | ||||||
|  |             case 'b' : | ||||||
|  |                 SET_STRING (boisson, optarg); | ||||||
|  |                 break; | ||||||
|  |             case 'q' : | ||||||
|  |                 SET_STRING (logout, optarg); | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 Usage (TRUE); | ||||||
|  |                 break; | ||||||
|  |         } | ||||||
|  |     }  | ||||||
|  |     if (optind < argc) { | ||||||
|  |         if (argc - optind == 1) | ||||||
|  |             fprintf (stderr, "%s: option inconnue --", argv[0]); | ||||||
|  |         else | ||||||
|  |             fprintf (stderr, "%s: options inconnues --", argv[0]); | ||||||
|  |         for ( ; optind < argc ; optind++) | ||||||
|  |             fprintf (stderr, " %s", argv[optind]); | ||||||
|  |         fprintf (stderr, "\n"); | ||||||
|  |         Usage (TRUE); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Envoi de commande | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | int send_cmd (int socket_client) { | ||||||
|  |     char  clavier[MAXSTRLEN + 1]; | ||||||
|  |     char *commande; | ||||||
|  |     char *admin_crypt; | ||||||
|  |     int   i, found = FALSE, cont = TRUE; | ||||||
|  | 
 | ||||||
|  |     /* Lecture d'une commande au clavier */ | ||||||
|  |     memset (clavier, 0, MAXSTRLEN); | ||||||
|  |     if ( (fgets (clavier, (int) MAXSTRLEN, stdin) == NULL) && | ||||||
|  |          feof (stdin) ) { | ||||||
|  |         snprintf (clavier, MAXSTRLEN, "%cquit", cmdchr); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* Détermination du type (commande explicite / message) */ | ||||||
|  |     if (clavier[0] == cmdchr) | ||||||
|  |         commande = xstrdup (clavier + 1); | ||||||
|  |     else { | ||||||
|  |         commande = xmalloc ((strlen (clavier) + 6) * sizeof (char)); | ||||||
|  |         snprintf (commande, strlen (clavier) + 6, "msg %s", clavier); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* Suppression des retours à la ligne pour comparaison */ | ||||||
|  |     for (i = 0 ; i < strlen (commande) ; i++) | ||||||
|  |         if (commande[i] == '\n') commande[i] = '\0'; | ||||||
|  | 
 | ||||||
|  |     /* Recherche de la bonne commande */ | ||||||
|  |     if (strlen (commande) > 0) | ||||||
|  |         for (i = 0 ; i < nb_cmd ; i++) { | ||||||
|  |             int cmp = -1; | ||||||
|  | 
 | ||||||
|  |             if (commandes[i][0] == '*') /* Commandes d'administration */ | ||||||
|  |                 cmp = strncmp (commandes[i]+1, commande, | ||||||
|  |                                strlen (commandes[i])-1); | ||||||
|  |             else if (commandes[i][0] == '+') /* Commandes à intervalle */ | ||||||
|  |                 cmp = ( (strchr (commandes[i]+1, commande[0]) != NULL) && | ||||||
|  |                         ( (strlen (commande) == 1) || | ||||||
|  |                           (commande[1] == ' ') ) ) ? 0 : -1; | ||||||
|  |             else { /* Commande simple : vérification pour la commande entière
 | ||||||
|  |                     * ou le premier caractère. | ||||||
|  |                     */ | ||||||
|  |                 cmp = ( | ||||||
|  |                     /* comparaison exacte entre les deux commandes
 | ||||||
|  |                     */ | ||||||
|  |                     (strncmp (commandes[i], commande, | ||||||
|  |                               strlen (commandes[i]) ) == 0) || | ||||||
|  |                     /* comparaison entre les 2 premières lettres en
 | ||||||
|  |                      * cas de présence de paramètres | ||||||
|  |                      */ | ||||||
|  |                     ( (commandes[i][0] == commande[0]) && | ||||||
|  |                       (commande[1] == ' ') ) || | ||||||
|  |                     /* Comparaison entre les deux premières lettres en cas
 | ||||||
|  |                      * de présence d'une unique lettre dans la commande | ||||||
|  |                      */ | ||||||
|  |                     ( (commandes[i][0] == commande[0]) && | ||||||
|  |                       (strlen (commande) == 1) ) ) ? 0 : -1; | ||||||
|  |                 /* Commande trouvée : si un seul caractère, remplacement par
 | ||||||
|  |                  * la commande complète. | ||||||
|  |                  */ | ||||||
|  |                 if ( (cmp == 0) && | ||||||
|  |                      (strncmp (commandes[i], commande, | ||||||
|  |                                strlen (commandes[i]) ) != 0) ) { | ||||||
|  |                     char *tmpstr; | ||||||
|  |                     tmpstr = xmalloc ( (strlen (commande) +  | ||||||
|  |                                         strlen (commandes[i]) ) * | ||||||
|  |                                         sizeof (char) ); | ||||||
|  |                     strcpy (tmpstr, commandes[i]); | ||||||
|  |                     strcat (tmpstr, commande+1); | ||||||
|  | #ifdef DEBUG | ||||||
|  |                     printf ("Nouvelle commande = %s | %d\n", | ||||||
|  |                             tmpstr, strlen (tmpstr) ); | ||||||
|  | #endif | ||||||
|  |                     if (strlen (tmpstr) > MAXSTRLEN) { | ||||||
|  |                         fprintf (stderr, "Commande trop longue !\n"); | ||||||
|  |                         printf (prompt); | ||||||
|  |                         return TRUE; /* continue */ | ||||||
|  |                     } | ||||||
|  |                     free (commande); | ||||||
|  |                     commande = xstrdup (tmpstr); | ||||||
|  |                     free (tmpstr); | ||||||
|  |                 } | ||||||
|  | #ifdef DEBUG | ||||||
|  |                 printf ("l = %c / c = %c ==> %d\n", | ||||||
|  |                         commandes[i][0], commande[0], cmp); | ||||||
|  | #endif | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (cmp == 0) { | ||||||
|  | #ifdef DEBUG | ||||||
|  |                 int j; | ||||||
|  |                 printf ("Commande reconnue : %s\n[%s (%d)] :", | ||||||
|  |                         commandes[i], commande, strlen (commande) ); | ||||||
|  |                 for (j = 0 ; j < strlen (commande) ; j++) | ||||||
|  |                     printf (" %d", commande[j]); | ||||||
|  |                 printf ("\n"); | ||||||
|  | #endif | ||||||
|  |                 found = TRUE; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     if (! found) { | ||||||
|  | #ifdef DEBUG | ||||||
|  |         fprintf (stderr, "Commande inconnue : [%s (%d)]", | ||||||
|  |                  commande, strlen (commande) ); | ||||||
|  |         for (i = 0 ; i < strlen (commande) ; i++) | ||||||
|  |             fprintf (stderr, " %d", commande[i]); | ||||||
|  |         fprintf (stderr, ".\n\n"); | ||||||
|  | #else | ||||||
|  |         fprintf (stderr, "Commande inconnue : [%s]\n", commande); | ||||||
|  | #endif | ||||||
|  |         printf (prompt); | ||||||
|  |         return TRUE; /* continue */ | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* Mode administrateur  */ | ||||||
|  |     if ( (strncmp (commande, "admin ", 6) == 0) && (strlen (commande) > 6) ) { | ||||||
|  |         int taille; | ||||||
|  |         admin_crypt = xstrdup (crypt (commande + 6, "Gs")); | ||||||
|  |         free (commande); | ||||||
|  |         taille = strlen ("admin ") + strlen (admin_crypt) + 1; | ||||||
|  |         commande = xmalloc (taille); | ||||||
|  |         snprintf (commande, taille, "admin %s", admin_crypt + 2); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     cont = send_infos (socket_client, commande); | ||||||
|  | 
 | ||||||
|  |     free (commande); | ||||||
|  | 
 | ||||||
|  |     return cont; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void set_cmds (char *cmds) { | ||||||
|  |     char *tok, *save; | ||||||
|  |     int   i = 0; | ||||||
|  | #ifdef DEBUG | ||||||
|  |     int   j; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     nb_cmd = 0; | ||||||
|  |     save = xstrdup (cmds); | ||||||
|  | #ifdef DEBUG | ||||||
|  |     printf ("Commandes disponibles : \n"); | ||||||
|  | /*     printf ("%s\n", cmds); */ | ||||||
|  | #endif | ||||||
|  |     tok = strtok (save, "\n"); | ||||||
|  |     while (tok != NULL) { | ||||||
|  |         nb_cmd++; | ||||||
|  |         tok = strtok (NULL, "\n"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     commandes = xmalloc ((nb_cmd) * sizeof (char*)); | ||||||
|  | 
 | ||||||
|  |     tok = strtok (cmds, "\n"); | ||||||
|  |     while (tok != NULL) { | ||||||
|  |         commandes[i] = xstrdup (tok); | ||||||
|  | #ifdef DEBUG | ||||||
|  |         if (tok[0] == '+') { | ||||||
|  |             for (j = 1 ; j < strlen (commandes[i]) ; j++) | ||||||
|  |                 printf ("%c%c ", cmdchr, commandes[i][j]); | ||||||
|  |         } else if (tok[0] != '*') { | ||||||
|  |             printf ("%c%s ", cmdchr, commandes[i]); | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|  |         i++; | ||||||
|  |         tok = strtok (NULL, "\n"); | ||||||
|  |     } | ||||||
|  |     printf ("\n"); | ||||||
|  | 
 | ||||||
|  |     free (save); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Fonction d'initialisation de la communication | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | int initiate (int socket_client) { | ||||||
|  |     char cmds[MAXSTRLEN]; | ||||||
|  |     char datas[MAXSTRLEN]; | ||||||
|  |     char nick_ok[MAXSTRLEN]; | ||||||
|  |     int  cont = TRUE; | ||||||
|  | 
 | ||||||
|  |     memset (datas, 0, MAXSTRLEN); | ||||||
|  | 
 | ||||||
|  |     /* Réception de la liste des commandes */ | ||||||
|  |     cont = read_infos (socket_client, cmds); | ||||||
|  | 
 | ||||||
|  |     if (cont) { | ||||||
|  |         set_cmds (cmds); | ||||||
|  | 
 | ||||||
|  |         snprintf (datas, MAXSTRLEN - 1, "%s\n%s\n%s", | ||||||
|  |                   utilisateur, boisson, logout); | ||||||
|  | 
 | ||||||
|  |         /* Envoi des données utilisateur */ | ||||||
|  |         cont = send_infos (socket_client, datas); | ||||||
|  | 
 | ||||||
|  |         read_infos (socket_client, nick_ok); | ||||||
|  |         if (nick_ok[0] == '@') { | ||||||
|  |             printf ("%s", nick_ok + 1); | ||||||
|  |             return FALSE; | ||||||
|  |         } | ||||||
|  |         printf ("%s", nick_ok); | ||||||
|  | 
 | ||||||
|  |         /* Traitement des commandes et des infos */ | ||||||
|  |         printf (prompt); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return cont; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Boucle de commande et de réception | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | void data_rw (int socket_client) { | ||||||
|  |     int    cont = TRUE; | ||||||
|  |     char   infos[MAXSTRLEN]; | ||||||
|  |     fd_set lire; | ||||||
|  | 
 | ||||||
|  |     cont = initiate (socket_client); | ||||||
|  | 
 | ||||||
|  |     while (cont == TRUE) { | ||||||
|  |         fflush (stdout); | ||||||
|  | 
 | ||||||
|  |         /* Construction de l'ensemble à scruter en lecture : */ | ||||||
|  |         FD_ZERO (&lire); | ||||||
|  |         FD_SET (STDIN_FILENO, &lire); | ||||||
|  |         FD_SET (socket_client, &lire); | ||||||
|  | 
 | ||||||
|  |         /*  Attente d'un message sur la liste : */ | ||||||
|  |         select (socket_client + 1, &lire, NULL, NULL, NULL); | ||||||
|  | 
 | ||||||
|  |         if (FD_ISSET (STDIN_FILENO, &lire) ) { | ||||||
|  |             cont = send_cmd (socket_client); | ||||||
|  |         } else { | ||||||
|  |             int is; | ||||||
|  | 
 | ||||||
|  |             cont = read_infos (socket_client, infos); | ||||||
|  | 
 | ||||||
|  |             is = 0; | ||||||
|  |             do { | ||||||
|  |                 printf ("%s\n", infos + is); | ||||||
|  |                 while (is < MAXSTRLEN && infos[is]) is ++; | ||||||
|  |                 /* on suppose qu'un seul '\0' sépare deux messages */ | ||||||
|  |                 is ++; | ||||||
|  |             } while (is < MAXSTRLEN && infos[is]); | ||||||
|  | 
 | ||||||
|  |             /* Hack pour faire afficher le message par xmessage
 | ||||||
|  |              * Pas très joli lors des déconnexions. | ||||||
|  |              */ | ||||||
|  | /*             if (getenv ("DISPLAY")) { */ | ||||||
|  | /*                 if (! fork ()) */ | ||||||
|  | /*                     execlp ("xmessage", "xmessage", infos, NULL); */ | ||||||
|  | /*             } */ | ||||||
|  |             fflush (stdout); | ||||||
|  |             printf (prompt); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     printf ("%s\n", logout); | ||||||
|  |     close (socket_client); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Gestionnaire de signal SIGPIPE | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | void handler_sigpipe (int sig) { | ||||||
|  |     printf ("Signal SIGPIPE reçu...\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Fonction principale | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | int main (int argc, char *argv[]) { | ||||||
|  |     int   socket_client; | ||||||
|  |     char *environ_user; | ||||||
|  | 
 | ||||||
|  |     signal (SIGPIPE, handler_sigpipe); | ||||||
|  | 
 | ||||||
|  |     /* Vérification des paramètres */ | ||||||
|  |     traite_argv (argc, argv); | ||||||
|  | 
 | ||||||
|  |     /* Lecture du fichier de config */ | ||||||
|  |     load_config (); | ||||||
|  | 
 | ||||||
|  |     /* Valeurs par défaut */ | ||||||
|  |     if (! utilisateur) { | ||||||
|  |         environ_user = getenv ("USER"); | ||||||
|  |         if (environ_user && *environ_user)  | ||||||
|  |             utilisateur = xstrdup (environ_user); | ||||||
|  |         else | ||||||
|  |             utilisateur = xstrdup ("toto"); | ||||||
|  |     } | ||||||
|  |     if (IS_NOT_GOOD (serveur)) SET_STRING (serveur, DEFAULT_SERVER); | ||||||
|  |     if (IS_NOT_GOOD (prompt))  SET_STRING (prompt,  DEFAULT_PROMPT); | ||||||
|  |     if (IS_NOT_GOOD (boisson)) SET_STRING (boisson, DEFAULT_DRINK); | ||||||
|  |     if (IS_NOT_GOOD (logout))  SET_STRING (logout,  DEFAULT_LOGOUT); | ||||||
|  |     if (cmdchr == 0) cmdchr  = '/'; | ||||||
|  |     if (port == 0)   port    = DEFAULT_SERVER_PORT; | ||||||
|  | 
 | ||||||
|  |     printf ("Serveur     : [%s]\t", serveur); | ||||||
|  |     printf ("Port    : [%d]\n",     port); | ||||||
|  |     printf ("Utilisateur : [%s]\t", utilisateur); | ||||||
|  |     printf ("\tBoisson : [%s]\t",   boisson); | ||||||
|  |     printf ("Logout : [%s]\n",      logout); | ||||||
|  |     printf ("Préfixe     : [%c]\n", cmdchr); | ||||||
|  | 
 | ||||||
|  |     /* Connexion au serveur */ | ||||||
|  |     if ( (socket_client = connect_server (serveur, port) ) == -1) { | ||||||
|  |         fprintf (stderr, "Connexion refusee...\n"); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |     printf ("-+- Connexion acceptee. -+-\n"); | ||||||
|  | 
 | ||||||
|  |     data_rw (socket_client); | ||||||
|  | 
 | ||||||
|  |     libere (); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								guinness.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								guinness.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | /*
 | ||||||
|  |  * guinness | ||||||
|  |  * architecture clients/serveur guinness. | ||||||
|  |  * Thomas Nemeth -- le 15 juin 2001 | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef GUINNESS_CLIENT | ||||||
|  | #define GUINNESS_CLIENT | ||||||
|  | 
 | ||||||
|  | #define CONFIG_FILE    ".guinnessrc" | ||||||
|  | 
 | ||||||
|  | #define DEFAULT_SERVER "127.0.0.1" | ||||||
|  | #define DEFAULT_PROMPT "> " | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 tonton Th
						tonton Th