summaryrefslogblamecommitdiffstats
path: root/server.c
blob: ad9b905431fb2c11ada8035d6fcc1ec130e7f3ea (plain) (tree)















































































































































                                                                                             
#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;
}