Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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);
			}
	    }
}