#include "bank.h"
extern int sockfd;
SHM_t *SHM;
char *fn_passwd = ".PASSWDS";
char flag;
typedef struct map_t {
char *key;
int (*fp)(char *);
} map_t;
void sig_handler(int signo){
pid_t pid;
while( (pid = waitpid(-1, NULL, WNOHANG)) > 0)
fprintf(stderr, "Child %d terminated\n", pid);
exit(0);
}
int list(char *param){
printf("list: %s\n", param);
writemsg(SUCCESS, "list success");
return 1;
}
int query(char *param){
char buf[STRLEN];
sprintf(buf, "%s's money is %d", param, bank_moneyof(bank_searchuser(param)));
writemsg(SUCCESS, buf);
return 1;
}
int give(char param[STRLEN]){
char user[STRLEN], money[STRLEN];
char tmp[STRLEN];
printf("give: %s\n", param);
getcmd(param, user, money);
bank_deumoney(user, atoi(money));
sprintf(tmp, "give %s %s", user, money);
writemsg(SUCCESS, tmp);
return 1;
}
int quit(char *param){
printf("[server] client quit\n");
exit(0);
}
map_t map[] = {
{"list", list},
{"query", query},
{"give", give},
{"quit", quit},
{"", NULL},
};
void writemsg(int status, char *str){
//write(sockfd, &status. sizeof(status));
writeln(str);
}
void serv_work(void){
int i, status = ERROR;
char buf[STRLEN], cmd[STRLEN], param[STRLEN];
fprintf(stderr, "new child\n");
attach_SHM();
while(readline(buf, 600) != NULL){
printf("[server] read: ");
puts(buf);
getcmd(buf, cmd, param);
for (i = 0; map[i].fp; i++){
if (!strcasecmp(map[i].key, cmd)){
status = (*(map[i].fp))(param);
break;
}
}
if(!map[i].fp){
writemsg(ERROR, "Wrong command");
strcpy(param, "error");
}
printf("[server] complete\n");
}
}
int check_perm(char *ip){
}
int main(int argc, char **argv){
int listenfd;
pid_t pid;
socklen_t addr_len;
struct sockaddr_in serv_addr;
listenfd = socket(PF_INET, SOCK_STREAM, 0);
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
bind(listenfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr));
listen(listenfd, 5);
signal(SIGCHLD, sig_handler);
while(1){
addr_len = sizeof(serv_addr);
if( (sockfd = accept(listenfd,(struct sockaddr *) &serv_addr, &addr_len)) < 0){
if(errno == EINTR)
continue;
else
herror("accept");
}
#define NOFORK 1
#if NOFORK
if((pid = fork()) < 0)
perror("fork");
else if(pid == 0){
#endif
int len;
struct sockaddr_in name;
close(listenfd);
if(getpeername(sockfd,(struct sockaddr *) &name, &len) < 0){
perror("getpeername");
exit(-1);
}
else{
printf("address: %s\n", inet_ntoa(((struct sockaddr_in *) &name)->sin_addr));
}
serv_work();
exit(0);
#if NOFORK
}
#endif
close(sockfd);
}
return 0;
}