int single_login(single_login_t *sl, single_login_func_t cb, char *ip, int port, char *user, char *pwd, void *param) { if (sl == NULL || ip == NULL || port <= 0 || port >= 65535) return -1; int loginid = -1; char ip_port[32] = ""; single_login_info_t *node; snprintf(ip_port, sizeof(ip_port), "%s:%d", ip, port); single_login_func_t login_func = (cb == NULL) ? default_login_func : cb; pthread_mutex_lock(&sl->mtx); /* lookup ip:port, if exist, return the loginid directly */ if (dlist_entry(sl->list, cmp_ipport, (void *)ip_port, (void **)&node) == 0) { loginid = node->loginid; node->user_num++; pthread_mutex_unlock(&sl->mtx); return loginid; } /* login */ loginid = login_func(ip, port, user, pwd, param); if (loginid == -1) { pthread_mutex_unlock(&sl->mtx); return -1; } node = calloc(1, sizeof(single_login_info_t)); if (node == NULL) { close(loginid); pthread_mutex_unlock(&sl->mtx); return -1; } snprintf(node->ip_port, sizeof(node->ip_port), "%s:%d", ip, port); node->loginid = loginid; node->user_num = 1; node->param = param; if (dlist_add(&sl->list, (void *)node) == -1) { close(loginid); free(node); pthread_mutex_unlock(&sl->mtx); return -1; } pthread_mutex_unlock(&sl->mtx); return loginid; }
void login_func(int newsockfd,char * log) { char login[256]; char password[256]; int n; char id[256]; xmlDoc *doc = NULL; xmlNode *root_element = NULL; const char *Filename = "users.xml"; doc = xmlReadFile(Filename, NULL, 0); n = write(newsockfd,"Hello, print you login and password\n",36); bzero(login,256); bzero(password,256); n = read( newsockfd,login,255 ); if (n < 0) { perror("ERROR reading from socket"); exit(1); } n=write(newsockfd,"OK",2); n = read( newsockfd,password,255 ); if (n < 0) { perror("ERROR reading from socket"); exit(1); } if (doc == NULL) { printf("error: could not parse file %s\n", Filename); } else { if(!strncmp(login,"exit",4)) exit(1); root_element = xmlDocGetRootElement(doc); bzero(id,256); login[strlen(login)-1] = 0; //login[strlen(login)-1] = 0; //password[strlen(password)-1] = 0; password[strlen(password)-1] = 0; search_user(root_element,login,password,id); if(id[0] == 0) { printf("Invalid login --%s-- and password --%s-- \n Retry write you login and password\n",login,password); write(newsockfd,"OK",5); login_func(newsockfd,login); } else { write(newsockfd,"next",5); search_new_topics(login,newsockfd); root_element = xmlDocGetRootElement(doc); on_off_user(root_element,login,1); xmlSaveFile(Filename,doc); strcpy(log,login); write(newsockfd,"next",5); } xmlFreeDoc(doc); } xmlCleanupParser(); return; }
void start_work(int newsockfd) { int n; xmlDoc *doc = NULL; xmlNode *root_element = NULL; const char *TopicFilename = "topics.xml"; const char *UserFilename = "users.xml"; char buffer[256]; char id[6]; char login[100]; bzero(login,100); login_func(newsockfd,login); strcpy(usersthr.login[usersthr.count],login); usersthr.count++; bzero(buffer,256); strcpy(buffer,"next\n"); n=write(newsockfd,buffer,7); while(1) { bzero(buffer,256); strcpy(buffer,"next\n"); n=write(newsockfd,buffer,7); //printf("next\n"); bzero(buffer,256); n = read( newsockfd,buffer,255 ); //printf("Buffer :%s\n",buffer); if (n < 0) { perror("ERROR reading from socket"); exit(1); } if(!strncmp(buffer,"topics",6)) { print_topic(buffer,newsockfd); //n = write(newsockfd,buffer,255); } if(!strncmp(buffer,"online",6)) { doc = xmlReadFile(UserFilename, NULL, 0); if (doc == NULL) { printf("error: could not parse file %s\n", UserFilename); n = write(newsockfd,"Error\n",6); } else { root_element = xmlDocGetRootElement(doc); search_online_user(root_element,newsockfd); xmlFreeDoc(doc); } xmlCleanupParser(); } if(!strncmp(buffer,"show",4)) { bzero(id,6); for(n=5;n<10;n++) id[n-5]=buffer[n]; doc = xmlReadFile(TopicFilename, NULL, 0); if (doc == NULL) { printf("error: could not parse file %s\n", TopicFilename); n = write(newsockfd,"Error\n",6); } else { root_element = xmlDocGetRootElement(doc); fnp_post_by_id(root_element,id,newsockfd); xmlFreeDoc(doc); } xmlCleanupParser(); doc = xmlReadFile(UserFilename, NULL, 0); if (doc == NULL) { printf("error: could not parse file %s\n", UserFilename); n = write(newsockfd,"Error\n",6); } else { root_element = xmlDocGetRootElement(doc); add_see_topic(root_element,login,id); xmlSaveFile(UserFilename,doc); xmlFreeDoc(doc); } xmlCleanupParser(); } if(!strncmp(buffer,"exit",4)) { bzero(buffer,256); strncpy(buffer,"exit\n",6); n = write(newsockfd,buffer,255); doc = xmlReadFile(UserFilename, NULL, 0); if (doc == NULL) { printf("error: could not parse file %s\n", UserFilename); n = write(newsockfd,"Error\n",6); } else { root_element = xmlDocGetRootElement(doc); on_off_user(root_element,login,0); xmlSaveFile(UserFilename,doc); xmlFreeDoc(doc); } xmlCleanupParser(); return; } if(!strncmp(buffer,"add",3)) { doc = xmlReadFile(TopicFilename, NULL, 0); if (doc == NULL) { printf("error: could not parse file %s\n", TopicFilename); n = write(newsockfd,"Error\n",6); } else { root_element = xmlDocGetRootElement(doc); add_new_topic(root_element,newsockfd,login); xmlSaveFile(TopicFilename,doc); xmlFreeDoc(doc); } xmlCleanupParser(); } else { n=write(newsockfd,"OK",2); } /* Write a response to the client */ if (n < 0) { perror("ERROR writing to socket"); exit(1); } } }