summaryrefslogtreecommitdiffstats
path: root/server.c
diff options
context:
space:
mode:
authorvictor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2003-08-15 18:40:13 +0800
committervictor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2003-08-15 18:40:13 +0800
commit449d862fbbbde494e94ba0bbc4689b91ca986175 (patch)
treef9d72d4c55643071dd8e633afa1ac7166a0552d0 /server.c
parent7b976a8121e3a2365abde9a90375a9bba1600e2d (diff)
downloadpttbbs-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.c144
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;
+}