#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/utsname.h>
#include <sys/sysinfo.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <strings.h>
#include <linux/reboot.h>
#include <syslog.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/select.h>
#define LISTENQ 10
#define MAXLINE 1000
#define SERV_PORT 9999
#define COMMAND "command"
#define REGISTER "register"
#define LOGIN "login"
#define GETFRIENDS "getfriends"
#define ADDFRIENDS "addfriends"
#define SHELL "shell"
#define SYSINFO "sysinfo"
#define SYSNAME "sysname"
#define REBOOT "reboot"
#define POWEROFF "poweroff"
#define COMNUM 1
#define REGNUM 2
#define LOGNUM 3
#define GETFRINUM 4
#define ADDFRINUM 5
#define SHELLNUM 6
#define NONNUM 7
#define INFONUM 100
#define NAMENUM 101
#define REBOOTNUM 102
#define POWEROFFNUM 103
#define OTHERNUM 104
struct friends {
char friendsname[32];
_Bool online;
struct sockaddr useraddr;
};
struct userfriends {
char user[32];
struct friends *pfriends[10];//every user has at most 10 friends
};
typedef struct sockaddr SA;
//do client requist
void do_client(int sockfd,const char *buf,int n);
void do_register(const char *buf,int sockfd);
void do_login(const char *buf,int sockfd);
void do_getfriends(const char *buf,int sockfd);
void do_addfriends(const char *buf,int sockfd);
void do_command(const char *buf,int sockfd);
void do_shell(const char *buf,int sockfd);
//command:
void deal_with_command(int number,const char *buf,int sockfd);
void Reboot(int sockfd);
void Poweroff(int sockfd);
struct utsname getname(int sockfd);
struct sysinfo getinfo(int sockfd);
//socket
int Socket(int family,int type,int protocol);
void Bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
void Listen(int sockfd,int backlog);
void Connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);
int Select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *execptset,struct timeval *timeout);
int Accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);
void Close(int fd);
void Inet_pton(int family,const char *strptr,void *addrptr);
struct in_addr gethostaddr(const char *hostname);
int create_serv(int port);
int create_client(const char *hostname,int port);
//local command
void parsecommand(const char *s);
void executecmd(const char *s);
void client_require_and_response(FILE *fp,int sockfd);
//handle error
void err_ret(const char *fmt,...);
void err_sys(const char *fmt,...);
void err_dump(const char *fmt,...);
void err_msg(const char *fmt,...);
void err_quit(const char *fmt,...);
//math
int max(int a,int b);
//io function
ssize_t Writen(int fd,const void *vptr,size_t n);
ssize_t Readline(int fd,void *vptr,size_t maxlen);
ssize_t Read(int fd,void *buf,size_t count);
int makeargv(const char *s,const char *delimiter,char ***argvp);
int compare_token(const char *token);
char *firsttok(const char *s,const char *delimiter,char first[]);
//char *command_string(const char *buf,const char *delimiter);
//char *login_name(const char *buf,const char *delimiter,char *first);
//char *login_string(const char *buf,const char *delimiter);
//char *myname(const char *buf,char *delimiter);
//char *register_string(const char *buf,const char *delimiter);
void trapright(const char *buf,char *trapper,char *destbuf);
void trapleft(char **buf,const char *trapper);