diff options
author | victor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2003-08-15 18:40:13 +0800 |
---|---|---|
committer | victor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2003-08-15 18:40:13 +0800 |
commit | 449d862fbbbde494e94ba0bbc4689b91ca986175 (patch) | |
tree | f9d72d4c55643071dd8e633afa1ac7166a0552d0 /server.c | |
parent | 7b976a8121e3a2365abde9a90375a9bba1600e2d (diff) | |
download | pttbbs-449d862fbbbde494e94ba0bbc4689b91ca986175.tar pttbbs-449d862fbbbde494e94ba0bbc4689b91ca986175.tar.gz pttbbs-449d862fbbbde494e94ba0bbc4689b91ca986175.tar.bz2 pttbbs-449d862fbbbde494e94ba0bbc4689b91ca986175.tar.lz pttbbs-449d862fbbbde494e94ba0bbc4689b91ca986175.tar.xz pttbbs-449d862fbbbde494e94ba0bbc4689b91ca986175.tar.zst pttbbs-449d862fbbbde494e94ba0bbc4689b91ca986175.zip |
new developed servicebank
git-svn-id: http://opensvn.csie.org/pttbbs/branches/bank@1102 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/server.c b/server.c new file mode 100644 index 00000000..ad9b9054 --- /dev/null +++ b/server.c @@ -0,0 +1,144 @@ +#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; +} |