int main(int argc, char **argv){ int acc_sock, dump_sock; struct sockaddr_un ser_addr, cli_addr; if((acc_sock = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0) err_sys("socket func fail"); printf("acc_sock:%d\n",acc_sock); ser_addr.sun_family = AF_LOCAL; strcpy(ser_addr.sun_path, UNIX_SERV_PATH); printf("path:%s\n", ser_addr.sun_path); unlink(UNIX_SERV_PATH);/*unlink for the next usage*/ if(bind(acc_sock, (struct sockaddr*)&ser_addr, sizeof(ser_addr)) < 0) err_sys("bind %s error", UNIX_SERV_PATH); if(listen(acc_sock, 5) < 0) err_sys("listen error"); signal(SIGCHLD, sig_son); signal(SIGINT, sig_intr); while(1){ int len = sizeof(cli_addr); if((dump_sock = accept(acc_sock, (struct sockaddr*)&cli_addr, (socklen_t *)&len)) < 0){ err_sys("accept error"); } if(fork() == 0){/*child*/ close(acc_sock); client_dump(dump_sock); close(dump_sock); exit(0); } close(dump_sock); } close(acc_sock); return 0; }
/* dump clients */ static void m_dump_client(char *arg) { struct client *cptr = NULL; if(arg) { if(chars_isdigit(*arg)) cptr = client_find_id(atoi(arg)); else cptr = client_find_name(arg); } client_dump(cptr); }