diff options
| -rw-r--r-- | command.c | 137 | ||||
| -rw-r--r-- | net.c | 75 | ||||
| -rw-r--r-- | net.h | 10 | 
3 files changed, 119 insertions, 103 deletions
| @@ -6,6 +6,7 @@  #include <sys/socket.h>  #include "command.h"  #include "db.h" +#include "net.h"  #include "user_data.h" @@ -16,90 +17,20 @@ static i64 make_timestamp(void){  } -static bool send_raw_text(int fd,const char *text,i64 len){ -	i64 cursor=0; -	while(cursor<len){ -		i64 nwr=send(fd,text+cursor,len-cursor,0); -		if(nwr<0){ -			if(errno==EINTR)continue; -			if(errno==ECONNRESET||errno==EPIPE)return true; -			die_perror("send"); -		} -		cursor+=nwr; -	} -	return false; -} - -static bool send_ok(int fd,const char *tag){ -	char *buf=NULL; -	i64 len=asprintf(&buf,"%s ok\n",tag); -	bool closed=send_raw_text(fd,buf,len); -	free(buf); -	return closed; -} - -static bool send_error(int fd,const char *tag,const char *msg){ -	char *buf=NULL; -	i64 len=asprintf(&buf,"%s error %s\n",tag,msg); -	bool closed=send_raw_text(fd,buf,len); -	free(buf); -	return closed; -} - -static bool send_name(int fd,const char *tag,const char *name){ -	char *buf=NULL; -	i64 len=asprintf(&buf,"%s name %s\n",tag,name); -	bool closed=send_raw_text(fd,buf,len); -	free(buf); -	return closed; -} - -static bool send_list(int fd,const char *tag,i64 count,const char **list){ -	char *buf=NULL; -	i64 len=asprintf(&buf,"%s list %" PRIi64,tag,count); -	bool closed=send_raw_text(fd,buf,len); -	free(buf); -	if(closed)return true; - -	if(count>0){ -		i64 bufsz=64; -		buf=malloc(bufsz,char); - -		for(i64 i=0;i<count;i++){ -			i64 len=strlen(list[i]); -			if(len>=bufsz){ -				bufsz=len+512; -				buf=realloc(buf,bufsz,char); -			} -			memcpy(buf+1,list[i],len); -			buf[0]=' '; -			if(send_raw_text(fd,buf,len+1)){ -				free(buf); -				return true; -			} -		} - -		free(buf); -	} - -	return send_raw_text(fd,"\n",1); -} - -  static bool cmd_register(struct conn_data *data,const char *tag,const char **args){  	i64 userid=db_find_user(args[0]);  	if(userid!=-1){ -		send_error(data->fd,tag,"Username already exists"); +		net_send_error(data->fd,tag,"Username already exists");  		return false;  	}  	db_create_user(args[0],args[1]); -	return send_ok(data->fd,tag); +	return net_send_ok(data->fd,tag);  }  static bool cmd_login(struct conn_data *data,const char *tag,const char **args){  	i64 userid=db_find_user(args[0]);  	if(userid==-1){ -		send_error(data->fd,tag,"User not found"); +		net_send_error(data->fd,tag,"User not found");  		return false;  	}  	char *pass=db_get_pass(userid); @@ -111,10 +42,10 @@ static bool cmd_login(struct conn_data *data,const char *tag,const char **args){  	if(success){  		data->userid=userid;  		userdata_register(userid,data->fd); -		send_ok(data->fd,tag); +		net_send_ok(data->fd,tag);  	} else {  		data->userid=-1; -		send_error(data->fd,tag,"Incorrect password"); +		net_send_error(data->fd,tag,"Incorrect password");  	}  	return false;  } @@ -122,48 +53,48 @@ static bool cmd_login(struct conn_data *data,const char *tag,const char **args){  static bool cmd_list_rooms(struct conn_data *data,const char *tag,const char **args){  	(void)args;  	if(data->userid==-1){ -		send_error(data->fd,tag,"Not logged in"); +		net_send_error(data->fd,tag,"Not logged in");  		return false;  	}  	struct db_room_list rl=db_list_rooms(data->userid);  	if(rl.count<=0){  		db_nullify_room_list(rl); -		return send_list(data->fd,tag,0,NULL); +		return net_send_list(data->fd,tag,0,NULL);  	}  	const char *names[rl.count];  	for(i64 i=0;i<rl.count;i++){  		names[i]=rl.list[i].name;  	} -	bool closed=send_list(data->fd,tag,rl.count,names); +	bool closed=net_send_list(data->fd,tag,rl.count,names);  	db_nullify_room_list(rl);  	return closed;  }  static bool cmd_list_members(struct conn_data *data,const char *tag,const char **args){  	if(data->userid==-1){ -		send_error(data->fd,tag,"Not logged in"); +		net_send_error(data->fd,tag,"Not logged in");  		return false;  	}  	i64 roomid=db_find_room(args[0]);  	if(roomid==-1){ -		send_error(data->fd,tag,"Room not found"); +		net_send_error(data->fd,tag,"Room not found");  		return false;  	}  	if(!db_is_member(roomid,data->userid)){ -		send_error(data->fd,tag,"Not in that room"); +		net_send_error(data->fd,tag,"Not in that room");  		return false;  	}  	struct db_user_list ul=db_list_members(roomid);  	if(ul.count<=0){  		db_nullify_user_list(ul); -		return send_list(data->fd,tag,0,NULL); +		return net_send_list(data->fd,tag,0,NULL);  	}  	const char *names[ul.count];  	for(i64 i=0;i<ul.count;i++){  		names[i]=ul.list[i].name;  	} -	bool closed=send_list(data->fd,tag,ul.count,names); +	bool closed=net_send_list(data->fd,tag,ul.count,names);  	db_nullify_user_list(ul);  	return closed;  } @@ -171,39 +102,39 @@ static bool cmd_list_members(struct conn_data *data,const char *tag,const char *  static bool cmd_create_room(struct conn_data *data,const char *tag,const char **args){  	(void)args;  	if(data->userid==-1){ -		send_error(data->fd,tag,"Not logged in"); +		net_send_error(data->fd,tag,"Not logged in");  		return false;  	}  	struct db_name_id room=db_create_room();  	db_add_member(room.id,data->userid); -	bool closed=send_name(data->fd,tag,room.name); +	bool closed=net_send_name(data->fd,tag,room.name);  	db_nullify_name_id(room);  	return closed;  }  static bool cmd_invite(struct conn_data *data,const char *tag,const char **args){  	if(data->userid==-1){ -		send_error(data->fd,tag,"Not logged in"); +		net_send_error(data->fd,tag,"Not logged in");  		return false;  	}  	i64 roomid=db_find_room(args[0]);  	if(roomid==-1){ -		send_error(data->fd,tag,"Room not found"); +		net_send_error(data->fd,tag,"Room not found");  		return false;  	}  	i64 user2=db_find_user(args[1]);  	if(user2==-1){ -		send_error(data->fd,tag,"User not found"); +		net_send_error(data->fd,tag,"User not found");  		return false;  	}  	if(!db_is_member(roomid,data->userid)){ -		send_error(data->fd,tag,"Not in that room"); +		net_send_error(data->fd,tag,"Not in that room");  		return false;  	}  	if(db_is_member(roomid,user2)){ -		send_error(data->fd,tag,"User already in that room"); +		net_send_error(data->fd,tag,"User already in that room");  		return false;  	} @@ -223,9 +154,9 @@ static bool cmd_invite(struct conn_data *data,const char *tag,const char **args)  		for(i64 j=0;j<nfds;j++){  			if(fds[j]!=data->fd){  				if(members.list[i].id==user2){ -					send_raw_text(fds[j],invitebuf,invitebuflen); +					net_send_raw_text(fds[j],invitebuf,invitebuflen);  				} else { -					send_raw_text(fds[j],joinbuf,joinbuflen); +					net_send_raw_text(fds[j],joinbuf,joinbuflen);  				}  			}  		} @@ -235,27 +166,27 @@ static bool cmd_invite(struct conn_data *data,const char *tag,const char **args)  	free(joinbuf);  	free(invitebuf); -	return send_ok(data->fd,tag); +	return net_send_ok(data->fd,tag);  }  static bool cmd_send(struct conn_data *data,const char *tag,const char **args){  	if(data->userid==-1){ -		send_error(data->fd,tag,"Not logged in"); +		net_send_error(data->fd,tag,"Not logged in");  		return false;  	}  	i64 roomid=db_find_room(args[0]);  	if(roomid==-1){ -		send_error(data->fd,tag,"Room not found"); +		net_send_error(data->fd,tag,"Room not found");  		return false;  	}  	if(!db_is_member(roomid,data->userid)){ -		send_error(data->fd,tag,"Not in that room"); +		net_send_error(data->fd,tag,"Not in that room");  		return false;  	}  	i64 timestamp=make_timestamp();  	db_create_message(roomid,data->userid,make_timestamp(),args[1]); -	bool closed=send_ok(data->fd,tag); +	bool closed=net_send_ok(data->fd,tag);  	char *pushbuf=NULL;  	char *username=db_get_username(data->userid); @@ -270,7 +201,7 @@ static bool cmd_send(struct conn_data *data,const char *tag,const char **args){  		if(nfds<=0)continue;  		for(i64 j=0;j<nfds;j++){  			if(fds[j]!=data->fd){ -				send_raw_text(fds[j],pushbuf,pushbuflen); +				net_send_raw_text(fds[j],pushbuf,pushbuflen);  			}  		}  	} @@ -290,23 +221,23 @@ static bool cmd_history(struct conn_data *data,const char *tag,const char **args  	}  	if(data->userid==-1){ -		send_error(data->fd,tag,"Not logged in"); +		net_send_error(data->fd,tag,"Not logged in");  		return false;  	}  	i64 roomid=db_find_room(args[0]);  	if(roomid==-1){ -		send_error(data->fd,tag,"Room not found"); +		net_send_error(data->fd,tag,"Room not found");  		return false;  	}  	if(!db_is_member(roomid,data->userid)){ -		send_error(data->fd,tag,"Not in that room"); +		net_send_error(data->fd,tag,"Not in that room");  		return false;  	}  	struct db_message_list ml=db_get_messages(roomid,nrequested);  	char *buf=NULL;  	i64 len=asprintf(&buf,"%s history %" PRIi64 "\n",tag,ml.count); -	bool closed=send_raw_text(data->fd,buf,len); +	bool closed=net_send_raw_text(data->fd,buf,len);  	free(buf);  	if(closed){ @@ -318,7 +249,7 @@ static bool cmd_history(struct conn_data *data,const char *tag,const char **args  		char *username=db_get_username(ml.list[i].userid);  		len=asprintf(&buf,"%s history_message %" PRIi64 " %s %s %" PRIi64 " %s\n",  				tag,ml.count-1-i,args[0],username,ml.list[i].timestamp,ml.list[i].message); -		closed=send_raw_text(data->fd,buf,len); +		closed=net_send_raw_text(data->fd,buf,len);  		free(buf);  		if(closed)break;  	} @@ -0,0 +1,75 @@ +#include <string.h> +#include <unistd.h> +#include <errno.h> +#include <sys/socket.h> +#include "net.h" + + +bool net_send_raw_text(int fd,const char *text,i64 len){ +	i64 cursor=0; +	while(cursor<len){ +		i64 nwr=send(fd,text+cursor,len-cursor,0); +		if(nwr<0){ +			if(errno==EINTR)continue; +			if(errno==ECONNRESET||errno==EPIPE)return true; +			die_perror("send"); +		} +		cursor+=nwr; +	} +	return false; +} + +bool net_send_ok(int fd,const char *tag){ +	char *buf=NULL; +	i64 len=asprintf(&buf,"%s ok\n",tag); +	bool closed=net_send_raw_text(fd,buf,len); +	free(buf); +	return closed; +} + +bool net_send_error(int fd,const char *tag,const char *msg){ +	char *buf=NULL; +	i64 len=asprintf(&buf,"%s error %s\n",tag,msg); +	bool closed=net_send_raw_text(fd,buf,len); +	free(buf); +	return closed; +} + +bool net_send_name(int fd,const char *tag,const char *name){ +	char *buf=NULL; +	i64 len=asprintf(&buf,"%s name %s\n",tag,name); +	bool closed=net_send_raw_text(fd,buf,len); +	free(buf); +	return closed; +} + +bool net_send_list(int fd,const char *tag,i64 count,const char **list){ +	char *buf=NULL; +	i64 len=asprintf(&buf,"%s list %" PRIi64,tag,count); +	bool closed=net_send_raw_text(fd,buf,len); +	free(buf); +	if(closed)return true; + +	if(count>0){ +		i64 bufsz=64; +		buf=malloc(bufsz,char); + +		for(i64 i=0;i<count;i++){ +			i64 len=strlen(list[i]); +			if(len>=bufsz){ +				bufsz=len+512; +				buf=realloc(buf,bufsz,char); +			} +			memcpy(buf+1,list[i],len); +			buf[0]=' '; +			if(net_send_raw_text(fd,buf,len+1)){ +				free(buf); +				return true; +			} +		} + +		free(buf); +	} + +	return net_send_raw_text(fd,"\n",1); +} @@ -0,0 +1,10 @@ +#pragma once + +#include "global.h" + + +bool net_send_raw_text(int fd,const char *text,i64 len); +bool net_send_ok(int fd,const char *tag); +bool net_send_error(int fd,const char *tag,const char *msg); +bool net_send_name(int fd,const char *tag,const char *name); +bool net_send_list(int fd,const char *tag,i64 count,const char **list); | 
