static void parse(client *c) { switch(c->state) { case CONNECTING: login_send_banner(c); login_ask_username(c); c->state = USERNAME; break; case USERNAME: handle_username(c); login_ask_password(c); c->state = PASSWORD; break; case PASSWORD: /* TODO: check the username and password */ login_client(c); c->state = CONNECTED; client_prompt(c); break; case CONNECTED: /* TODO: parse the command prompt */ //send_prompt(c); parse_command(c); client_prompt(c); break; } }
int connect_accept(client_data *fd_array, int *num_clients, fd_set *readfds, char *msg, waitList *waitlist) { /* Fonction qui permet à un client d'accepter une connextion d'un utilisateur distant. */ char client_name[MAX_SIZE_USERNAME]; int client_sockfd; int i, bchar; char *posSpace = NULL; if(strlen(msg) < MIN_SIZE_USERNAME+8 || strlen(msg) > MAX_SIZE_USERNAME+8) { // "/accept " = 8 printf(BLUE"[PROGRAM] Error command : Username too short or too long.\n[PROGRAM] Please use \"/accept username\" as described previously."RESET"\n\n"); return -1; } if((posSpace = strchr(msg, ' ')) == NULL) { printf(BLUE"[PROGRAM] Error command. Please use \"/accept username\" as described previously."RESET"\n\n"); return -1; } if(strcpy(client_name, posSpace+1) == NULL) { printf(BLUE"[PROGRAM] Error command. Please use \"/accept username\" as described previously."RESET"\n\n"); return -1; } client_name[strlen(client_name)-1] = '\0'; for(i=0 ; i < strlen(client_name) ; i++) { bchar = (isalnum((unsigned char) client_name[i])) ? 0 : 1; if(bchar) {break;} } if (bchar) { printf(BLUE"[PROGRAM] Error command : Username must only be composed of alphanumeric characters.\n[PROGRAM] Please use \"/accept username\" as described previously.\n"RESET"\n\n"); return -1; } if((client_sockfd = search_client_waiting_fd_by_name(client_name, fd_array, num_clients, *waitlist)) == -1) { printf(BLUE"[PROGRAM] This user is not in your waiting list."RESET"\n\n"); return -1; } /* Fin de l'initialisation / gestion d'erreurs : on alloue de la mémoire */ message *msg_send = (message *) malloc(sizeof(message)); //On lui demande de se logger if (login_client(msg_send, &client_sockfd, fd_array, num_clients, readfds, waitlist) != -1) { //On confirme la connection du client session_accept(msg_send); //on crée le message de session-accept-1 send_msg(msg_send, &client_sockfd, readfds, fd_array, num_clients); free((*msg_send).msg_content); free(msg_send); } return 0; }