int main(int argc, char **argv) { struct sockaddr_in config, peer; struct epoll_event ev, events[EP_SIZE]; struct conn_status status[MAX_FD], *curr; in_port_t port = L_PORT; int listenfd, epfd, connfd; int i, flag, nfds, current_fd; socklen_t len; char buffer[FILE_BUFFER]; // init sockinit(&config); sockset(&config, port, NULL); memset(status, 0, sizeof(status)); memset(buffer, 0, sizeof(buffer)); signal(SIGPIPE, SIG_IGN); // create server listenfd = create_server(&config); if (listenfd < 0) { perror("xtrans: server create failed."); exit(EXIT_FAILURE); } // create epoll fd epfd = ep_ini(); if (epfd < 0) { perror("xtrans: epoll init failed."); exit(EXIT_FAILURE); } // add listen fd to epoll ev.events = EPOLLIN; ev.data.fd = listenfd; if (ep_add(epfd, listenfd, &ev) == -1) { perror("xtrans: add epoll event failed."); exit(EXIT_FAILURE); } // main loop for(;;) { nfds = ep_col(epfd, events); for (i = 0; i < nfds; i++) { current_fd = events[i].data.fd; if (current_fd == listenfd) { connfd = accept(listenfd, (SA *)&peer, &len); if (connfd == -1) { continue; } memcpy(&(status[connfd].client), &peer, sizeof(struct sockaddr_in)); ev.events = EPOLLIN; ev.data.fd = connfd; if (ep_add(epfd, connfd, &ev) == -1) { continue; } flag = welcome(connfd, &(status[connfd])); if (flag >= 0) { x_log(LOG_CONN, &(status[connfd])); } else { x_log(LOG_DISC, &(status[connfd])); terminate(epfd, connfd, &(status[connfd])); } } else if (events[i].events & EPOLLIN) { curr = &(status[current_fd]); switch (curr->status) { case STATUS_INIT: memset(&(curr->username), 0, sizeof(char)*12); flag = readln(current_fd, curr->username, 1); if (flag < 0) { terminate(epfd, current_fd, curr); x_log(LOG_DISC, curr); } flag = get_username(current_fd, curr); if (flag < 0) { terminate(epfd, current_fd, curr); x_log(LOG_DISC, curr); } break; case STATUS_NAME: memset(&(curr->passwd), 0, sizeof(char)*32); flag = readln(current_fd, curr->passwd, 1); if (flag < 0) { terminate(epfd, current_fd, curr); x_log(LOG_DISC, curr); } flag = get_passwd(current_fd, curr); if (flag < 0) { terminate(epfd, current_fd, curr); x_log(LOG_DISC, curr); } flag = auth(curr->username, curr->passwd); if (flag < 0) { flag = auth_failed(current_fd, curr); terminate(epfd, current_fd, curr); x_log(LOG_REFS, curr); } else { flag = auth_success(current_fd, curr); if (flag < 0) { x_log(LOG_DISC, curr); } else { x_log(LOG_LOGI, curr); } } break; case STATUS_SUCC: flag = readFd(current_fd, buffer, 1024); if (flag < 0) { terminate(epfd, current_fd, curr); x_log(LOG_DISC, curr); } curr->recvb = flag; terminate(epfd, current_fd, curr); x_log(LOG_FINS, curr); break; default: perror("xtrans: status not define, default action triggered."); terminate(epfd, current_fd, curr); } } } } return 0; }
int slapd_daemon_init( const char *urls ) { int i, j, n, rc; char **u; #ifdef NEW_LOGGING LDAP_LOG( CONNECTION, ARGS, "slapd_daemon_init: %s\n", urls ? urls : "<null>", 0, 0 ); #else Debug( LDAP_DEBUG_ARGS, "daemon_init: %s\n", urls ? urls : "<null>", 0, 0 ); #endif if( (rc = sockinit()) != 0 ) { return rc; } #ifdef HAVE_SYSCONF dtblsize = sysconf( _SC_OPEN_MAX ); #elif HAVE_GETDTABLESIZE dtblsize = getdtablesize(); #else dtblsize = FD_SETSIZE; #endif #ifdef FD_SETSIZE if(dtblsize > FD_SETSIZE) { dtblsize = FD_SETSIZE; } #endif /* !FD_SETSIZE */ /* open a pipe (or something equivalent connected to itself). * we write a byte on this fd whenever we catch a signal. The main * loop will be select'ing on this socket, and will wake up when * this byte arrives. */ if( (rc = lutil_pair( wake_sds )) < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( CONNECTION, ERR, "slap_daemon_init: lutil_pair() failed rc=%d\n", rc, 0, 0); #else Debug( LDAP_DEBUG_ANY, "daemon: lutil_pair() failed rc=%d\n", rc, 0, 0 ); #endif return rc; } FD_ZERO( &slap_daemon.sd_readers ); FD_ZERO( &slap_daemon.sd_writers ); if( urls == NULL ) { urls = "ldap:///"; } u = ldap_str2charray( urls, " " ); if( u == NULL || u[0] == NULL ) { #ifdef NEW_LOGGING LDAP_LOG( CONNECTION, ERR, "slap_daemon_init: no urls (%s) provided.\n", urls, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "daemon_init: no urls (%s) provided.\n", urls, 0, 0 ); #endif return -1; } for( i=0; u[i] != NULL; i++ ) { #ifdef NEW_LOGGING LDAP_LOG( CONNECTION, DETAIL1, "slap_daemon_init: listen on %s\n.", u[i], 0, 0 ); #else Debug( LDAP_DEBUG_TRACE, "daemon_init: listen on %s\n", u[i], 0, 0 ); #endif } if( i == 0 ) { #ifdef NEW_LOGGING LDAP_LOG( CONNECTION, INFO, "slap_daemon_init: no listeners to open (%s)\n", urls, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "daemon_init: no listeners to open (%s)\n", urls, 0, 0 ); #endif ldap_charray_free( u ); return -1; } #ifdef NEW_LOGGING LDAP_LOG( CONNECTION, INFO, "slap_daemon_init: %d listeners to open...\n", i, 0, 0 ); #else Debug( LDAP_DEBUG_TRACE, "daemon_init: %d listeners to open...\n", i, 0, 0 ); #endif slap_listeners = ch_malloc( (i+1)*sizeof(Listener *) ); for(n = 0, j = 0; u[n]; n++ ) { if ( slap_open_listener( u[n], &i, &j ) ) { ldap_charray_free( u ); return -1; } } slap_listeners[j] = NULL; #ifdef NEW_LOGGING LDAP_LOG( CONNECTION, DETAIL1, "slap_daemon_init: %d listeners opened\n", i, 0, 0 ); #else Debug( LDAP_DEBUG_TRACE, "daemon_init: %d listeners opened\n", i, 0, 0 ); #endif #ifdef HAVE_SLP slapd_slp_init( urls ); slapd_slp_reg(); #endif ldap_charray_free( u ); ldap_pvt_thread_mutex_init( &slap_daemon.sd_mutex ); return !i; }