int nc_connect(net_client_t **nc,const nc_arg_t *nc_arg) { //忽略SIGPIPE 信号 struct sigaction sa; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = SIG_IGN; sigaction(SIGPIPE,&sa,NULL); int rv,sd; rv = nc_nbconnect(&sd,nc_arg); if(rv < 0) return -1; int on=1; setsockopt(sd, IPPROTO_TCP, TCP_NODELAY,(void *)&on,(socklen_t)sizeof(on)); allocator_t *allocator; if(allocator_create(&allocator) < 0) { close(sd); return -1; } (*nc) = (net_client_t *)malloc(sizeof(net_client_t)); memset((*nc),0,sizeof(net_client_t)); thread_mutex_create(&((*nc)->mpool_mutex),0); allocator_mutex_set(allocator,(*nc)->mpool_mutex); (*nc)->allocator = allocator; queue_create(&((*nc)->recv_queue),C_MAX_QUEUE_CAPACITY); // BTPDQ_INIT(&(*nc)->recv_queue); // thread_mutex_create(&((*nc)->recv_mutex),0); thread_mutex_create(&((*nc)->peer_mutex),0); if(nc_arg->data_func) (*nc)->data_func = nc_arg->data_func; else (*nc)->data_func = default_process_func; if(nc_arg->msg_func) (*nc)->msg_func = nc_arg->msg_func; int epfd = evloop_init(); (*nc)->epfd = epfd; cpeer_create_out(sd,*nc); pthread_t td; pthread_create(&td,NULL,&start_threads,(*nc)); (*nc)->td_start = td; return 0; }
int main (int argc, char **argv) { int ret; int c; FILE *pidfile; struct utsname sysinfo; machine_type machine; while ((c = getopt(argc, argv, "fdv")) != -1) { switch (c) { case 'f': console = 1; break; case 'd': debug = 1; console = 1; break; case 'v': printf("pommed v" M_VERSION " Apple laptops hotkeys handler\n"); printf("Copyright (C) 2006-2011 Julien BLACHE <*****@*****.**>\n"); exit(0); break; default: usage(); exit(1); break; } } if (geteuid() != 0) { logmsg(LOG_ERR, "pommed needs root privileges to operate"); exit(1); } if (!console) { openlog("pommed", LOG_PID, LOG_DAEMON); } logmsg(LOG_INFO, "pommed v" M_VERSION " Apple laptops hotkeys handler"); logmsg(LOG_INFO, "Copyright (C) 2006-2011 Julien BLACHE <*****@*****.**>"); /* Load our configuration */ ret = config_load(); if (ret < 0) { exit(1); } /* Identify the machine we're running on */ machine = check_machine(); switch (machine) { case MACHINE_MAC_UNKNOWN: logmsg(LOG_ERR, "Unknown Apple machine"); exit(1); break; case MACHINE_UNKNOWN: logmsg(LOG_ERR, "Unknown non-Apple machine"); exit(1); break; case MACHINE_ERROR: exit(1); break; default: if (machine < MACHINE_LAST) { #ifdef __powerpc__ mops = &pb_mops[machine]; #else mops = &mb_mops[machine]; #endif /* __powerpc__ */ } break; } /* Runtime sanity check: catch errors in the mb_mops and pb_mops arrays */ if (mops->type != machine) { logmsg(LOG_ERR, "machine_ops mismatch: expected %d, found %d", machine, mops->type); exit(1); } if (debug) { ret = uname(&sysinfo); if (ret < 0) logmsg(LOG_ERR, "uname() failed: %s", strerror(errno)); else logdebug("System: %s %s %s\n", sysinfo.sysname, sysinfo.release, sysinfo.machine); } ret = evloop_init(); if (ret < 0) { logmsg(LOG_ERR, "Event loop initialization failed"); exit (1); } ret = mops->lcd_backlight_probe(); if (ret < 0) { logmsg(LOG_ERR, "LCD backlight probe failed, check debug output"); exit(1); } ret = evdev_init(); if (ret < 1) { logmsg(LOG_ERR, "No suitable event devices found"); exit(1); } kbd_backlight_init(); ret = audio_init(); if (ret < 0) { logmsg(LOG_WARNING, "Audio initialization failed, audio support disabled"); } ret = mbpdbus_init(); if (ret < 0) { logmsg(LOG_WARNING, "Could not connect to DBus system bus"); } power_init(); if (!console) { /* * Detach from the console */ if (daemon(0, 0) != 0) { logmsg(LOG_ERR, "daemon() failed: %s", strerror(errno)); evdev_cleanup(); exit(1); } } pidfile = fopen(PIDFILE, "w"); if (pidfile == NULL) { logmsg(LOG_WARNING, "Could not open pidfile %s: %s", PIDFILE, strerror(errno)); evdev_cleanup(); exit(1); } fprintf(pidfile, "%d\n", getpid()); fclose(pidfile); /* Spawn the beep thread */ beep_init(); signal(SIGINT, sig_int_term_handler); signal(SIGTERM, sig_int_term_handler); do { ret = evloop_iteration(); } while (ret >= 0); evdev_cleanup(); beep_cleanup(); mbpdbus_cleanup(); kbd_backlight_cleanup(); power_cleanup(); evloop_cleanup(); config_cleanup(); logmsg(LOG_INFO, "Exiting"); if (!console) closelog(); unlink(PIDFILE); return 0; }