static int test1() { DCB *dcb; int result; int eno = 0; /* Poll tests */ ss_dfprintf(stderr, "testpoll : Initialise the polling system."); init_test_env(NULL); poll_init(); ss_dfprintf(stderr, "\t..done\nAdd a DCB"); dcb = dcb_alloc(DCB_ROLE_REQUEST_HANDLER); if(dcb == NULL){ ss_dfprintf(stderr, "\nError on function call: dcb_alloc() returned NULL.\n"); return 1; } dcb->fd = socket(AF_UNIX, SOCK_STREAM, 0); if(dcb->fd < 0){ char errbuf[STRERROR_BUFLEN]; ss_dfprintf(stderr, "\nError on function call: socket() returned %d: %s\n",errno,strerror_r(errno,errbuf,sizeof(errbuf))); return 1; } if((eno = poll_add_dcb(dcb)) != 0){ ss_dfprintf(stderr, "\nError on function call: poll_add_dcb() returned %d.\n",eno); return 1; } if((eno = poll_remove_dcb(dcb)) != 0){ ss_dfprintf(stderr, "\nError on function call: poll_remove_dcb() returned %d.\n",eno); return 1; } if((eno = poll_add_dcb(dcb)) != 0){ ss_dfprintf(stderr, "\nError on function call: poll_add_dcb() returned %d.\n",eno); return 1; } ss_dfprintf(stderr, "\t..done\nStart wait for events."); sleep(10); poll_shutdown(); ss_dfprintf(stderr, "\t..done\nTidy up."); dcb_close(dcb); ss_dfprintf(stderr, "\t..done\n"); return 0; }
/** * Telnet daemon listener entry point * * @param listener The Listener DCB * @param config Configuration (ip:port) */ static int telnetd_listen(DCB *listener, char *config) { struct sockaddr_in addr; char *port; int one = 1; short pnum; int rc; memcpy(&listener->func, &MyObject, sizeof(GWPROTOCOL)); port = strrchr(config, ':'); if (port) port++; else port = "4442"; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); pnum = atoi(port); addr.sin_port = htons(pnum); if ((listener->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { return 0; } // socket options setsockopt(listener->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); // set NONBLOCKING mode setnonblocking(listener->fd); // bind address and port if (bind(listener->fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { return 0; } rc = listen(listener->fd, SOMAXCONN); if (rc == 0) { fprintf(stderr, "Listening telnet connections at %s\n", config); } else { int eno = errno; errno = 0; fprintf(stderr, "\n* Failed to start listening telnet due error %d, %s\n\n", eno, strerror(eno)); return 0; } if (poll_add_dcb(listener) == -1) { return 0; } return 1; }
/** * Handler for the EPOLLIN event when the DCB refers to the listening * socket for the protocol. * * @param dcb The descriptor control block * @return The number of new connections created */ static int telnetd_accept(DCB *dcb) { int n_connect = 0; while (1) { int so; struct sockaddr_in addr; socklen_t addrlen = sizeof(struct sockaddr); DCB *client_dcb; TELNETD* telnetd_pr = NULL; dcb_state_t old_state = DCB_STATE_UNDEFINED; bool succp = FALSE; so = accept(dcb->fd, (struct sockaddr *)&addr, &addrlen); if (so == -1) return n_connect; else { atomic_add(&dcb->stats.n_accepts, 1); client_dcb = dcb_alloc(DCB_ROLE_REQUEST_HANDLER); if (client_dcb == NULL) { return n_connect; } client_dcb->fd = so; client_dcb->remote = strdup(inet_ntoa(addr.sin_addr)); memcpy(&client_dcb->func, &MyObject, sizeof(GWPROTOCOL)); client_dcb->session = session_alloc(dcb->session->service, client_dcb); telnetd_pr = (TELNETD *)malloc(sizeof(TELNETD)); client_dcb->protocol = (void *)telnetd_pr; if (telnetd_pr == NULL) { dcb_add_to_zombieslist(client_dcb); return n_connect; } if (poll_add_dcb(client_dcb) == -1) { dcb_add_to_zombieslist(dcb); return n_connect; } n_connect++; telnetd_pr->state = TELNETD_STATE_LOGIN; telnetd_pr->username = NULL; dcb_printf(client_dcb, "MaxScale login: "); } } return n_connect; }
/** * HTTTP daemon listener entry point * * @param listener The Listener DCB * @param config Configuration (ip:port) */ static int httpd_listen(DCB *listener, char *config) { struct sockaddr_in addr; int one = 1; int rc; memcpy(&listener->func, &MyObject, sizeof(GWPROTOCOL)); if (!parse_bindconfig(config, 6442, &addr)) return 0; if ((listener->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { return 0; } /* socket options */ setsockopt(listener->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); /* set NONBLOCKING mode */ setnonblocking(listener->fd); /* bind address and port */ if (bind(listener->fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { return 0; } rc = listen(listener->fd, SOMAXCONN); if (rc == 0) { fprintf(stderr, "Listening http connections at %s\n", config); } else { int eno = errno; errno = 0; fprintf(stderr, "\n* Failed to start listening http due error %d, %s\n\n", eno, strerror(eno)); return 0; } if (poll_add_dcb(listener) == -1) { return 0; } return 1; }
/** * Telnet daemon listener entry point * * @param listener The Listener DCB * @param config Configuration (ip:port) */ static int telnetd_listen(DCB *listener, char *config) { struct sockaddr_in addr; int one = 1; int rc; int syseno = 0; memcpy(&listener->func, &MyObject, sizeof(GWPROTOCOL)); if (!parse_bindconfig(config, 4442, &addr)) return 0; if ((listener->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { return 0; } // socket options syseno = setsockopt(listener->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); if(syseno != 0){ LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,"Error: Failed to set socket options. Error %d: %s",errno,strerror(errno)))); return 0; } // set NONBLOCKING mode setnonblocking(listener->fd); // bind address and port if (bind(listener->fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { return 0; } rc = listen(listener->fd, SOMAXCONN); if (rc == 0) { LOGIF(LM, (skygw_log_write_flush(LOGFILE_MESSAGE,"Listening telnet connections at %s", config))); } else { int eno = errno; errno = 0; fprintf(stderr, "\n* Failed to start listening telnet due error %d, %s\n\n", eno, strerror(eno)); return 0; } if (poll_add_dcb(listener) == -1) { return 0; } return 1; }
/** * Handler for the EPOLLIN event when the DCB refers to the listening * socket for the protocol. * * @param dcb The descriptor control block */ static int httpd_accept(DCB *dcb) { int n_connect = 0; while (1) { int so = -1; struct sockaddr_in addr; socklen_t addrlen; DCB *client = NULL; HTTPD_session *client_data = NULL; if ((so = accept(dcb->fd, (struct sockaddr *)&addr, &addrlen)) == -1) { return n_connect; } else { atomic_add(&dcb->stats.n_accepts, 1); if ((client = dcb_alloc(DCB_ROLE_REQUEST_HANDLER))) { client->listen_ssl = dcb->listen_ssl; client->fd = so; client->remote = strdup(inet_ntoa(addr.sin_addr)); memcpy(&client->func, &MyObject, sizeof(GWPROTOCOL)); /* create the session data for HTTPD */ client_data = (HTTPD_session *)calloc(1, sizeof(HTTPD_session)); client->data = client_data; client->session = session_alloc(dcb->session->service, client); if (NULL == client->session || poll_add_dcb(client) == -1) { close(so); dcb_close(client); return n_connect; } n_connect++; } else { close(so); } } } return n_connect; }
/** * Restart a service * * This function stops the listener for the service * * @param service The Service that should be restarted * @return Returns the number of listeners restarted */ int serviceRestart(SERVICE *service) { SERV_PROTOCOL *port; int listeners = 0; port = service->ports; while (port) { if (poll_add_dcb(port->listener) == 0) { port->listener->session->state = SESSION_STATE_LISTENER; listeners++; } port = port->next; } return listeners; }