Exemplo n.º 1
0
int main()
{
	struct sockaddr_in peeraddr;
	socklen_t addrlen;
	pid_t pid;
	
	sockfd = network_init();
	if (-1 == pipe(pipefd))
		error_exit("pipe");
	mesgbuff = (mesgpack_st *)malloc(sizeof(mesgpack_st));
	userlist = (linknode_st *)malloc(sizeof(linknode_st));
	userlist->next = NULL;

	
	if (-1 == (pid = fork()))
		error_exit("fork");
	/* ============== child, process client message ===============*/
	if (0 == pid) {
		close(pipefd[1]);
		signal(SIGUSR1, sigusr1_handler);
		while (1) {
			if( 0 >= recvfrom(sockfd, mesgbuff, sizeof(mesgpack_st),0, 
						(struct sockaddr *)&peeraddr, &addrlen))
				perror("child:recvfrom");
	
			printf("[%d]%s:%d\n", addrlen, 
					inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));

			switch (mesgbuff->type) {
			case CMD_CHAT:
				broadcast(sockfd, userlist, mesgbuff);
				break;
			case CMD_LOGIN:
				user_login(sockfd, userlist, (struct sockaddr *)&peeraddr, mesgbuff);
				break;
			case CMD_LOGOUT:
				user_logout(sockfd, userlist, (struct sockaddr *)&peeraddr, mesgbuff);
				break;
			default:
				break;
			}
		}
	} else {
	/* ================ father process local data ============= */
		close(pipefd[0]);
		strcpy(mesgbuff->user, "system");
		setbuf(stdout, NULL);
		
		while (1) {
			printf(">");
			fgets(mesgbuff->data, DATA_BUFF_LEN, stdin);
			write(pipefd[1], mesgbuff->data, DATA_BUFF_LEN);
			kill(pid, SIGUSR1);
		}
	}
	return 0;
}	
Exemplo n.º 2
0
FormosaExit()
{
	int fd = getdtablesize();

	while (fd)
		(void) close(--fd);

	if (ifPass)
		user_logout(cutmp, &curuser);
	ReleaseSocket();
	exit(0);
}
Exemplo n.º 3
0
void
TimeOut(int s)
{
	if (ifPass)
	{
#if 1
		if (uinfo.active < 1 || uinfo.active > MAXACTIVE)
			csbbslog("ERR", "%s TimeOut user_logout: active[%d]", uinfo.userid, uinfo.active);
#endif
		user_logout(cutmp, &curuser);
	}
	ReleaseSocket();
	exit(1);
}
Exemplo n.º 4
0
void server_parse_input(char * message){

    //if query is empty... do nothing
    if(strlen(message)==0)return;
    
    //if query is type 1 - login user
    if(message[0]=='1'){

        //skip first 2 characters "1|"
        message+=2;
        
        //alocate memory for user
        user_t * user = malloc(sizeof(user_t));
        
        //copy username
        char * separator = strchr(message,'|');
        separator[0]='\0';
        user->username = malloc((strlen(message)+1)*sizeof(char));
        strcpy(user->username, message);

        //erase copied characters from message
        message = separator+1;

        //copy password
        user->password = malloc((strlen(message)+1)*sizeof(char));
        strcpy(user->password, message);

        //authentificate used
        if(user_auth(user)){
            //and log in
            if(!user_login(user)){
                message_send(user,"Server is full !!!\n");
                free(user->username);
                free(user->password);
                free(user);
            }
        }
        //wrong credentials
        else{
            message_send(user,"Login incorrect\n");
            free(user->username);
            free(user->password);
            free(user);
        }
    }


    //if query is of type 2 - send online users
    else if(message[0]=='2'){
        //print to server console
        printf("Sending online users\n");

        //skip first 2 characters - 2|
        message+=2;
        //call function with given name of named pipe
        print_online(message);
    }

    //query is of type 3 - send message
    //query format is 3|from|to|message
    else if(message[0]=='3'){
        
        //skip first 2 characters - 3|
        message+=2;

        //copy "from"
        char * separator = strchr(message,'|');
         separator[0]='\0';
        char * from = malloc((strlen(message)+1)*sizeof(char));
        strcpy(from, message);

        //erase copyied characters
        message = separator+1;

        //copy "to"
        separator = strchr(message,'|');
        separator[0]='\0';
        char * to = malloc((strlen(message)+1)*sizeof(char));
        strcpy(to, message);
        //erase copied characters
        message = separator+1;
        
        //find user "to"
        user_t * user=NULL;
        for(int i=0; i<SERVER_CAPACITY; i++){
            if(users_logged[i] && !strcmp(users_logged[i]->username,to)){
                user=users_logged[i];
            }
        }  

        //if we have found user "to"
        if(user){

            //compose message
            char tmp[BUFFER_SIZE];
            tmp[0]='\0';
            strcat(tmp,from);
            strcat(tmp," -> ");
            strcat(tmp,message);
            strcat(tmp,"\n");
            //send message to user "to"
            message_send(user,tmp);

            //print message to server console
            printf("User %s sent a message to %s\n",from, to);
        }

        //free used memory
        free(from);
        free(to);

    }

    //query is of type 4 - logout user
    else if(message[0]=='4'){

        //erase first 2 characters - 4|
        message+=2;
        //logout user
        user_logout(message);
    }

}
Exemplo n.º 5
0
// INT 80h Handler, kernel entry.
void int_80() {
	if(krn)	{
		return;
	}
	
	krn++;
	int systemCall = kernel_buffer[0];
	int fd         = kernel_buffer[1];
	int buffer     = kernel_buffer[2];
	int count      = kernel_buffer[3];

	
	int i, j;
	Process * current;
	Process * p;
	int inode;
	int _fd;
	// Yeah, wanna know why we don't access an array directly? ... Because of big bugs we might have.
	switch(systemCall) {
		case READY:
			kernel_buffer[KERNEL_RETURN] = kernel_ready();
			break;
		case WRITE:
 			current = getp();
			kernel_buffer[KERNEL_RETURN] = fd_write(current->file_descriptors[fd],(char *)buffer,count);
			break;
		case READ:
			current = getp();
			kernel_buffer[KERNEL_RETURN] = fd_read(current->file_descriptors[fd],(char *)buffer,count);
			break;
		case MKFIFO:
			_fd = process_getfreefd();
			fd = fd_open(_FD_FIFO, (void *)kernel_buffer[1],kernel_buffer[2]);
			if(_fd != -1 && fd != -1)	{
				getp()->file_descriptors[_fd] = fd;
				kernel_buffer[KERNEL_RETURN] = _fd;
			}
			else {
				kernel_buffer[KERNEL_RETURN] = -1;
			}
			break;
		case OPEN:
			_fd = process_getfreefd();
			fd = fd_open(_FD_FILE, (void *) kernel_buffer[1], kernel_buffer[2]);
			if(_fd != -1 && fd >= 0)
			{
				getp()->file_descriptors[_fd] = fd;
				kernel_buffer[KERNEL_RETURN] = _fd;
			}
			else {
				kernel_buffer[KERNEL_RETURN] = fd;
			}
			break;
		case CLOSE:
			kernel_buffer[KERNEL_RETURN] = fd_close(getp()->file_descriptors[fd]);
			break;
		case PCREATE:
			kernel_buffer[KERNEL_RETURN] = sched_pcreate(kernel_buffer[1],kernel_buffer[2],kernel_buffer[3]);
			break;
		case PRUN:
			kernel_buffer[KERNEL_RETURN] = sched_prun(kernel_buffer[1]);
			break;
		case PDUP2:
			kernel_buffer[KERNEL_RETURN] = sched_pdup2(kernel_buffer[1],kernel_buffer[2],kernel_buffer[3]);
			break;
		case GETPID:
			kernel_buffer[KERNEL_RETURN] = sched_getpid();
			break;
		case WAITPID:
			kernel_buffer[KERNEL_RETURN] = sched_waitpid(kernel_buffer[1]);
			break;
		case PTICKS:
			kernel_buffer[KERNEL_RETURN] = (int) storage_index();
			break;
		case PNAME:
			p = process_getbypid(kernel_buffer[1]);
			if(p == NULL)
			{
				kernel_buffer[KERNEL_RETURN] = (int) NULL;
			} else {
				kernel_buffer[KERNEL_RETURN] = (int) p->name;
			}
			break;
		case PSTATUS:
			p = process_getbypid(kernel_buffer[1]);
			if(p == NULL)
			{
				kernel_buffer[KERNEL_RETURN] = (int) -1;
			} else {
				kernel_buffer[KERNEL_RETURN] = (int) p->state;
			}
			break;
		case PPRIORITY:
			p = process_getbypid(kernel_buffer[1]);
			if(p == NULL)
			{
				kernel_buffer[KERNEL_RETURN] = (int) -1;
			} else {
				kernel_buffer[KERNEL_RETURN] = (int) p->priority;
			}
			break;
		case PGID:
			p = process_getbypid(kernel_buffer[1]);
			if(p == NULL)
			{
				kernel_buffer[KERNEL_RETURN] = (int) -1;
			} else {
				kernel_buffer[KERNEL_RETURN] = (int) p->gid;
			}
			break;
		case PGETPID_AT:
			p = process_getbypindex(kernel_buffer[1]);
			if (p->state != -1) {
				kernel_buffer[KERNEL_RETURN] = (int) p->pid;
			} else {
				kernel_buffer[KERNEL_RETURN] = -1;
			}
			break;
		case KILL:
			kernel_buffer[KERNEL_RETURN - 1] = kernel_buffer[1];
			kernel_buffer[KERNEL_RETURN - 2] = kernel_buffer[2];
			break;
		case PSETP:
			p = process_getbypid(kernel_buffer[1]);
			if(p == NULL)	{
				kernel_buffer[KERNEL_RETURN] = (int) -1;
			} else {
				if(kernel_buffer[2] <= 4 && kernel_buffer[2] >= 0)	{
					p->priority = kernel_buffer[2];
				}
				kernel_buffer[KERNEL_RETURN] = (int) p->gid;
			}
			break;
		case SETSCHED:
			sched_set_mode(kernel_buffer[1]);
			break;
		case PWD:
			kernel_buffer[KERNEL_RETURN] = (int) fs_pwd();
			break;
		case CD:
			kernel_buffer[KERNEL_RETURN] = (int) fs_cd(kernel_buffer[1]);
			break;
		case FINFO:
			fs_finfo(kernel_buffer[1], kernel_buffer[2]);
			break;
		case MOUNT:
			fs_init();
			break;
		case MKDIR:
			kernel_buffer[KERNEL_RETURN] = (int) fs_mkdir(kernel_buffer[1],current_ttyc()->pwd);
			break;
		case RM:
			inode = fs_indir(kernel_buffer[1],current_ttyc()->pwd);
			if (inode) {
				kernel_buffer[KERNEL_RETURN] = (int) fs_rm(inode,0);
			} else {
				kernel_buffer[KERNEL_RETURN] = ERR_NO_EXIST;
			}
			break;
		case GETUID:
			if(kernel_buffer[1] == 0)
			{
				kernel_buffer[KERNEL_RETURN] = (int) current_ttyc()->uid;
			} else {
				kernel_buffer[KERNEL_RETURN] = (int) user_exists(kernel_buffer[1]);
			}
			break;
		case GETGID:
			if(kernel_buffer[1] == 0)
			{
				kernel_buffer[KERNEL_RETURN] = (int) user_gid(current_ttyc()->uid);
			} else {
				kernel_buffer[KERNEL_RETURN] = (int) user_gid(kernel_buffer[1]);
			}

			break;
		case MAKEUSER:
			kernel_buffer[KERNEL_RETURN] = user_create(kernel_buffer[1],
							kernel_buffer[2], user_gid(current_ttyc()->uid));
			break;
		case SETGID:
			kernel_buffer[KERNEL_RETURN] = user_setgid(kernel_buffer[1], 
													   kernel_buffer[2]);
			break;
		case UDELETE:
			kernel_buffer[KERNEL_RETURN] = user_delete(kernel_buffer[1]);
			break;
		case UEXISTS:
			kernel_buffer[KERNEL_RETURN] = user_exists(kernel_buffer[1]);
			break;
		case ULOGIN:
			kernel_buffer[KERNEL_RETURN] = user_login(kernel_buffer[1], 
													  kernel_buffer[2]);
			break;
		case ULOGOUT:
			kernel_buffer[KERNEL_RETURN] = user_logout();
			break;
		case CHOWN:
			kernel_buffer[KERNEL_RETURN] = fs_chown(kernel_buffer[1],
													kernel_buffer[2]);
			break;
		case CHMOD:
			kernel_buffer[KERNEL_RETURN] = fs_chmod(kernel_buffer[1],
												    kernel_buffer[2]);
			break;
		case GETOWN:
			kernel_buffer[KERNEL_RETURN] = fs_getown(kernel_buffer[1]);
			break;
		case GETMOD:
			kernel_buffer[KERNEL_RETURN] = fs_getmod(kernel_buffer[1]);
			break;
		case CP:
			kernel_buffer[KERNEL_RETURN] = fs_cp(kernel_buffer[1], kernel_buffer[2], current_ttyc()->pwd, current_ttyc()->pwd);
			break;
		case MV:
			kernel_buffer[KERNEL_RETURN] = fs_mv(kernel_buffer[1], kernel_buffer[2], current_ttyc()->pwd);
			break;
		case LINK:
			kernel_buffer[KERNEL_RETURN] = fs_open_link(kernel_buffer[1], kernel_buffer[2], current_ttyc()->pwd);
			break;
		case FSSTAT:
			kernel_buffer[KERNEL_RETURN] = fs_stat(kernel_buffer[1]);
			break;
		case SLEEP:
			kernel_buffer[KERNEL_RETURN] = scheduler_sleep(kernel_buffer[1]);
			break;
		default:
			break;
	}
	
	krn--;
}
Exemplo n.º 6
0
void work::run()
{
	struct epoll_event ev,events[CLIENTCOUNT];
	setnonblocking(listen_st);
	int epfd = epoll_create(CLIENTCOUNT);
	ev.data.fd = listen_st;
	ev.events = EPOLLIN | EPOLLERR | EPOLLHUP;
	epoll_ctl(epfd,EPOLL_CTL_ADD,listen_st,&ev);
	
	int st = 0;
	while(1)
	{
	     int nfds = epoll_wait(epfd,events,CLIENTCOUNT,-1);
	     if(nfds == -1)
	     {
		 printf("epoll_wait failed %s\n",strerror(errno));
		  break;
	     }  
	     for(int i=0;i < nfds ;i++)
	     {
		   if(events[i].data.fd < 0)
		    continue;
		   if(events[i].data.fd == listen_st)
		  {
			st = socket_accept();
			if( st >= 0)
			{
			   setnonblocking(st);
			   ev.data.fd = st;
			   ev.events = EPOLLIN | EPOLLERR | EPOLLHUP;
			   epoll_ctl(epfd,EPOLL_CTL_ADD,st,&ev);
			  continue;
		            
			}
		   
		   }
		    if(events[i].events & EPOLLIN)
		   {
			st = events[i].data.fd;
			if(socket_recv(st) <= 0)
			{
			     user_logout(st);
			     events[i].data.fd = -1;
			}
		    }
		     if(events[i].events & EPOLLERR)
		     {
		         st = events[i].data.fd;
			  user_logout(st);
			  events[i].data.fd = -1;
			}
		     if(events[i].events & EPOLLHUP)
		     {
			 st = events[i].data.fd;
			 user_logout(st);
			 events[i].data.fd = -1;
			}

		} 
	}

	
}
Exemplo n.º 7
0
int main(int argc, char **argv, char **envp)
{
	CGI *cgi = NULL;
	NEOERR *err;
	mdb_conn *conn = NULL;

	/* skey, user, pass, return jsoncallback*/
	char *s, *u, *r, *jcbk;
	
	//sleep(20);
	mtc_init("logout");
	mconfig_parse_file(SITE_CONFIG, &g_cfg);
	mutil_wrap_fcgi(argc, argv, envp);
	if (mdb_init(&conn, DB_DSN) != MDB_ERR_NONE) {
		mtc_err("init db error %s", mdb_get_errmsg(conn));
		printf("Content-Type: text/html; charset=UTF-8\r\n\r\n");
		printf("{errcode: %d}", SAM_ERR_INIT);
		return 1;
	}
	
#ifndef DROP_FCGI
	while (FCGI_Accept() >= 0) {
#endif

		/*
		 * cgi init 
		 */
		err = cgi_init(&cgi, NULL);
		if (err != STATUS_OK) {
			mtc_err("init cgi error");
			printf("Content-Type: text/html; charset=UTF-8\r\n\r\n");
			printf("{errcode: %d}", SAM_ERR_INIT);
			goto opfinish;
		}
		err = cgi_parse(cgi);
		if (err != STATUS_OK) {
			mtc_err("parse cgi error");
			hdf_set_int_value(cgi->hdf, PRE_OUTPUT".errcode", SAM_ERR_PARSE);
			goto opfinish;
		}

		u = hdf_get_value(cgi->hdf, PRE_COOKIE".samuser", NULL);
		s = hdf_get_value(cgi->hdf, PRE_COOKIE".samkey", NULL);
		if (s && u) {
			if (user_has_login(conn, u, s)) {
				user_logout(conn, u);
				cgi_cookie_clear(cgi, "samuser", SITE_DOMAIN, NULL);
				cgi_cookie_clear(cgi, "samkey", SITE_DOMAIN, NULL);
				hdf_set_value(cgi->hdf, PRE_OUTPUT".success", "1");
				goto opfinish;
			}
		}
		hdf_set_int_value(cgi->hdf, PRE_OUTPUT".errcode", SAM_ERR_NOTLOGIN);
	opfinish:
		if (cgi) {
			r = hdf_get_value(cgi->hdf, PRE_QUERY".r", NULL);
			if (r) {
				cgi_redirect(cgi, r);
			} else {
				jcbk = hdf_get_value(cgi->hdf, PRE_QUERY".jsoncallback", NULL);
				if (jcbk != NULL) {
					mjson_execute_hdf(cgi->hdf, jcbk, 0);
				} else {
					mjson_output_hdf(cgi->hdf, 0);
				}
			}
#ifdef DEBUG_HDF
			hdf_write_file(cgi->hdf, HF_LOG_PATH"hdf.logout");
#endif
			cgi_destroy(&cgi);
		}
		
#ifndef DROP_FCGI
 	} /* FCGI_Accept() */
#endif

	mdb_destroy(conn);
	return 0;
}
Exemplo n.º 8
0
void work::run()
{
	struct epoll_event ev, events[CLIENTCOUNT]; //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件
	setnonblocking (listen_st); //把socket设置为非阻塞方式
	int epfd = epoll_create(CLIENTCOUNT); //生成用于处理accept的epoll专用的文件描述符
	ev.data.fd = listen_st; //设置与要处理的事件相关的文件描述符
	ev.events = EPOLLIN | EPOLLERR | EPOLLHUP; //设置要处理的事件类型	
	epoll_ctl(epfd, EPOLL_CTL_ADD, listen_st, &ev); //注册epoll事件

	int st = 0;
	while (1)
	{
		int nfds = epoll_wait(epfd, events, CLIENTCOUNT, -1); //等待epoll事件的发生		
		if (nfds == -1)
		{
			printf("epoll_wait failed %s\n", strerror(errno));
			break;
		}

		for (int i = 0; i < nfds; i++)
		{
			if (events[i].data.fd < 0)
				continue;

			if (events[i].data.fd == listen_st) //监测到一个SOCKET用户连接到了绑定的SOCKET端口,建立新的连接。
			{
				st = socket_accept();//将来自client端的socket描述符设置为非阻塞
				if (st >= 0)
				{
					setnonblocking(st);
					ev.data.fd = st;
					ev.events = EPOLLIN | EPOLLERR | EPOLLHUP; //设置要处理的事件类型	
					epoll_ctl(epfd, EPOLL_CTL_ADD, st, &ev);//将来自client端的socket描述符加入epoll
					continue;
				}
			}
			if (events[i].events & EPOLLIN) //socket收到数据
			{
				st = events[i].data.fd;
				if (socket_recv(st) <= 0)
				{
					user_logout(st);
					events[i].data.fd = -1;
				}
			}
			if (events[i].events & EPOLLERR) //socket错误。
			{
				st = events[i].data.fd;
				user_logout(st);
				events[i].data.fd = -1;
			}

			if (events[i].events & EPOLLHUP) //socket被挂断。
			{
				st = events[i].data.fd;
				user_logout(st);
				events[i].data.fd = -1;
			}
		}
	}
	close(epfd);
}