From 183202466df5c93dbaee09b8ee082d858965a62c Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Tue, 12 Jan 2016 15:49:09 +0200 Subject: [PATCH] Reformat telnetd.c --- server/modules/protocol/telnetd.c | 501 +++++++++++++++--------------- 1 file changed, 251 insertions(+), 250 deletions(-) diff --git a/server/modules/protocol/telnetd.c b/server/modules/protocol/telnetd.c index 324c66524..d9ff6bcf3 100644 --- a/server/modules/protocol/telnetd.c +++ b/server/modules/protocol/telnetd.c @@ -38,11 +38,12 @@ #include #include -MODULE_INFO info = { - MODULE_API_PROTOCOL, - MODULE_GA, - GWPROTOCOL_VERSION, - "A telnet deamon protocol for simple administration interface" +MODULE_INFO info = +{ + MODULE_API_PROTOCOL, + MODULE_GA, + GWPROTOCOL_VERSION, + "A telnet deamon protocol for simple administration interface" }; /** @@ -54,14 +55,14 @@ MODULE_INFO info = { * databases. * * In the first instance it is intended to allow a debug connection to access - * internal data structures, however it may also be used to manage the + * internal data structures, however it may also be used to manage the * configuration of the gateway. * * @verbatim * Revision History - * Date Who Description - * 17/06/2013 Mark Riddoch Initial version - * 17/07/2013 Mark Riddoch Addition of login phase + * Date Who Description + * 17/06/2013 Mark Riddoch Initial version + * 17/07/2013 Mark Riddoch Addition of login phase * 07/07/2015 Martin Brampton Call unified dcb_close on error * * @endverbatim @@ -81,40 +82,39 @@ static int telnetd_listen(DCB *dcb, char *config); /** * The "module object" for the telnetd protocol module. */ -static GWPROTOCOL MyObject = { - telnetd_read_event, /**< Read - EPOLLIN handler */ - telnetd_write, /**< Write - data from gateway */ - telnetd_write_event, /**< WriteReady - EPOLLOUT handler */ - telnetd_error, /**< Error - EPOLLERR handler */ - telnetd_hangup, /**< HangUp - EPOLLHUP handler */ - telnetd_accept, /**< Accept */ - NULL, /**< Connect */ - telnetd_close, /**< Close */ - telnetd_listen, /**< Create a listener */ - NULL, /**< Authentication */ - NULL /**< Session */ - }; +static GWPROTOCOL MyObject = +{ + telnetd_read_event, /**< Read - EPOLLIN handler */ + telnetd_write, /**< Write - data from gateway */ + telnetd_write_event, /**< WriteReady - EPOLLOUT handler */ + telnetd_error, /**< Error - EPOLLERR handler */ + telnetd_hangup, /**< HangUp - EPOLLHUP handler */ + telnetd_accept, /**< Accept */ + NULL, /**< Connect */ + telnetd_close, /**< Close */ + telnetd_listen, /**< Create a listener */ + NULL, /**< Authentication */ + NULL /**< Session */ +}; -static void telnetd_command(DCB *, unsigned char *cmd); -static void telnetd_echo(DCB *dcb, int enable); +static void telnetd_command(DCB *, unsigned char *cmd); +static void telnetd_echo(DCB *dcb, int enable); /** * Implementation of the mandatory version entry point * * @return version string of the module */ -char * -version() +char* version() { - return version_str; + return version_str; } /** * The module initialisation routine, called when the module * is first loaded. */ -void -ModuleInit() +void ModuleInit() { MXS_INFO("Initialise Telnetd Protocol module."); } @@ -127,102 +127,102 @@ ModuleInit() * * @return The module object */ -GWPROTOCOL * -GetModuleObject() +GWPROTOCOL* GetModuleObject() { - return &MyObject; + return &MyObject; } /** * Read event for EPOLLIN on the telnetd protocol module. * - * @param dcb The descriptor control block + * @param dcb The descriptor control block * @return */ -static int -telnetd_read_event(DCB* dcb) +static int telnetd_read_event(DCB* dcb) { -int n; -GWBUF *head = NULL; -SESSION *session = dcb->session; -TELNETD *telnetd = (TELNETD *)dcb->protocol; -char *password, *t; + int n; + GWBUF *head = NULL; + SESSION *session = dcb->session; + TELNETD *telnetd = (TELNETD *)dcb->protocol; + char *password, *t; - if ((n = dcb_read(dcb, &head, 0)) != -1) - { - - if (head) - { - unsigned char *ptr = GWBUF_DATA(head); - ptr = GWBUF_DATA(head); - while (GWBUF_LENGTH(head) && *ptr == TELNET_IAC) - { - telnetd_command(dcb, ptr + 1); - GWBUF_CONSUME(head, 3); - ptr = GWBUF_DATA(head); - } - if (GWBUF_LENGTH(head)) - { - switch (telnetd->state) - { - case TELNETD_STATE_LOGIN: - telnetd->username = strndup(GWBUF_DATA(head), GWBUF_LENGTH(head)); - /* Strip the cr/lf from the username */ - t = strstr(telnetd->username, "\r\n"); - if (t) - *t = 0; - telnetd->state = TELNETD_STATE_PASSWD; - dcb_printf(dcb, "Password: "); - telnetd_echo(dcb, 0); - gwbuf_consume(head, GWBUF_LENGTH(head)); - break; - case TELNETD_STATE_PASSWD: - password = strndup(GWBUF_DATA(head), GWBUF_LENGTH(head)); - /* Strip the cr/lf from the username */ - t = strstr(password, "\r\n"); - if (t) - *t = 0; - if (admin_verify(telnetd->username, password)) - { - telnetd_echo(dcb, 1); - telnetd->state = TELNETD_STATE_DATA; - dcb_printf(dcb, "\n\nMaxScale> "); - } - else - { - dcb_printf(dcb, "\n\rLogin incorrect\n\rLogin: "); - telnetd_echo(dcb, 1); - telnetd->state = TELNETD_STATE_LOGIN; - free(telnetd->username); - } - gwbuf_consume(head, GWBUF_LENGTH(head)); - free(password); - break; - case TELNETD_STATE_DATA: - SESSION_ROUTE_QUERY(session, head); - break; - } - } - else - { - // Force the free of the buffer header - gwbuf_consume(head, 0); - } - } - } - return n; + if ((n = dcb_read(dcb, &head, 0)) != -1) + { + if (head) + { + unsigned char *ptr = GWBUF_DATA(head); + ptr = GWBUF_DATA(head); + while (GWBUF_LENGTH(head) && *ptr == TELNET_IAC) + { + telnetd_command(dcb, ptr + 1); + GWBUF_CONSUME(head, 3); + ptr = GWBUF_DATA(head); + } + if (GWBUF_LENGTH(head)) + { + switch (telnetd->state) + { + case TELNETD_STATE_LOGIN: + telnetd->username = strndup(GWBUF_DATA(head), GWBUF_LENGTH(head)); + /* Strip the cr/lf from the username */ + t = strstr(telnetd->username, "\r\n"); + if (t) + { + *t = 0; + } + telnetd->state = TELNETD_STATE_PASSWD; + dcb_printf(dcb, "Password: "); + telnetd_echo(dcb, 0); + gwbuf_consume(head, GWBUF_LENGTH(head)); + break; + case TELNETD_STATE_PASSWD: + password = strndup(GWBUF_DATA(head), GWBUF_LENGTH(head)); + /* Strip the cr/lf from the username */ + t = strstr(password, "\r\n"); + if (t) + { + *t = 0; + } + if (admin_verify(telnetd->username, password)) + { + telnetd_echo(dcb, 1); + telnetd->state = TELNETD_STATE_DATA; + dcb_printf(dcb, "\n\nMaxScale> "); + } + else + { + dcb_printf(dcb, "\n\rLogin incorrect\n\rLogin: "); + telnetd_echo(dcb, 1); + telnetd->state = TELNETD_STATE_LOGIN; + free(telnetd->username); + } + gwbuf_consume(head, GWBUF_LENGTH(head)); + free(password); + break; + case TELNETD_STATE_DATA: + SESSION_ROUTE_QUERY(session, head); + break; + } + } + else + { + // Force the free of the buffer header + gwbuf_consume(head, 0); + } + } + } + return n; } /** * EPOLLOUT handler for the telnetd protocol module. * - * @param dcb The descriptor control block + * @param dcb The descriptor control block * @return */ -static int -telnetd_write_event(DCB *dcb) +static int telnetd_write_event(DCB *dcb) { - return dcb_drain_writeq(dcb); + return dcb_drain_writeq(dcb); } /** @@ -231,188 +231,189 @@ telnetd_write_event(DCB *dcb) * Writes the content of the buffer queue to the socket * observing the non-blocking principles of the gateway. * - * @param dcb Descriptor Control Block for the socket - * @param queue Linked list of buffes to write + * @param dcb Descriptor Control Block for the socket + * @param queue Linked list of buffes to write */ -static int -telnetd_write(DCB *dcb, GWBUF *queue) +static int telnetd_write(DCB *dcb, GWBUF *queue) { - int rc; - rc = dcb_write(dcb, queue); - return rc; + int rc; + rc = dcb_write(dcb, queue); + return rc; } /** * Handler for the EPOLLERR event. * - * @param dcb The descriptor control block + * @param dcb The descriptor control block */ -static int -telnetd_error(DCB *dcb) +static int telnetd_error(DCB *dcb) { - return 0; + return 0; } /** * Handler for the EPOLLHUP event. * - * @param dcb The descriptor control block + * @param dcb The descriptor control block */ -static int -telnetd_hangup(DCB *dcb) +static int telnetd_hangup(DCB *dcb) { - return 0; + return 0; } /** * Handler for the EPOLLIN event when the DCB refers to the listening * socket for the protocol. * - * @param dcb The descriptor control block + * @param dcb The descriptor control block * @return The number of new connections created */ -static int -telnetd_accept(DCB *dcb) +static int telnetd_accept(DCB *dcb) { -int n_connect = 0; + 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; + while (1) + { + int so; + struct sockaddr_in addr; + socklen_t addrlen = sizeof(struct sockaddr); + DCB *client_dcb; + TELNETD* telnetd_pr = NULL; - 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); + so = accept(dcb->fd, (struct sockaddr *)&addr, &addrlen); - if (client_dcb == NULL) + if (so == -1) + { + return n_connect; + } + else + { + atomic_add(&dcb->stats.n_accepts, 1); + client_dcb = dcb_alloc(DCB_ROLE_REQUEST_HANDLER); - { - close(so); - 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); - if (NULL == client_dcb->session) - { - dcb_close(client_dcb); - return n_connect; - } - telnetd_pr = (TELNETD *)malloc(sizeof(TELNETD)); - client_dcb->protocol = (void *)telnetd_pr; + if (client_dcb == NULL) + { + close(so); + 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); - if (telnetd_pr == NULL) - { - dcb_close(client_dcb); - return n_connect; - } + if (NULL == client_dcb->session) + { + dcb_close(client_dcb); + return n_connect; + } + telnetd_pr = (TELNETD *)malloc(sizeof(TELNETD)); + client_dcb->protocol = (void *)telnetd_pr; - if (poll_add_dcb(client_dcb)) - { - dcb_close(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; + if (telnetd_pr == NULL) + { + dcb_close(client_dcb); + return n_connect; + } + + if (poll_add_dcb(client_dcb)) + { + dcb_close(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; } /** * The close handler for the descriptor. Called by the gateway to * explicitly close a connection. * - * @param dcb The descriptor control block + * @param dcb The descriptor control block */ -static int -telnetd_close(DCB *dcb) +static int telnetd_close(DCB *dcb) { -TELNETD *telnetd = dcb->protocol; + TELNETD *telnetd = dcb->protocol; - if (telnetd && telnetd->username) - free(telnetd->username); + if (telnetd && telnetd->username) + { + free(telnetd->username); + } - return 0; + return 0; } /** * Telnet daemon listener entry point * - * @param listener The Listener DCB - * @param config Configuration (ip:port) + * @param listener The Listener DCB + * @param config Configuration (ip:port) */ -static int -telnetd_listen(DCB *listener, char *config) +static int telnetd_listen(DCB *listener, char *config) { -struct sockaddr_in addr; -int one = 1; -int rc; -int syseno = 0; + struct sockaddr_in addr; + int one = 1; + int rc; + int syseno = 0; - memcpy(&listener->func, &MyObject, sizeof(GWPROTOCOL)); + memcpy(&listener->func, &MyObject, sizeof(GWPROTOCOL)); - if (!parse_bindconfig(config, 4442, &addr)) - return 0; + if (!parse_bindconfig(config, 4442, &addr)) + { + return 0; + } + if ((listener->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + 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)); - // socket options - syseno = setsockopt(listener->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); - - if(syseno != 0){ - char errbuf[STRERROR_BUFLEN]; - MXS_ERROR("Failed to set socket options. Error %d: %s", - errno, strerror_r(errno, errbuf, sizeof(errbuf))); - return 0; - } - // set NONBLOCKING mode - setnonblocking(listener->fd); - // bind address and port - if (bind(listener->fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) - { - return 0; - } + if (syseno != 0) + { + char errbuf[STRERROR_BUFLEN]; + MXS_ERROR("Failed to set socket options. Error %d: %s", + errno, strerror_r(errno, errbuf, sizeof(errbuf))); + 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) { - MXS_NOTICE("Listening telnet connections at %s", config); - } else { - int eno = errno; - errno = 0; - char errbuf[STRERROR_BUFLEN]; - fprintf(stderr, - "\n* Failed to start listening telnet due error %d, %s\n\n", - eno, - strerror_r(eno, errbuf, sizeof(errbuf))); - return 0; - } + rc = listen(listener->fd, SOMAXCONN); - - if (poll_add_dcb(listener) == -1) - { - return 0; - } - return 1; + if (rc == 0) + { + MXS_NOTICE("Listening telnet connections at %s", config); + } + else + { + int eno = errno; + errno = 0; + char errbuf[STRERROR_BUFLEN]; + fprintf(stderr, + "\n* Failed to start listening telnet due error %d, %s\n\n", + eno, + strerror_r(eno, errbuf, sizeof(errbuf))); + return 0; + } + + if (poll_add_dcb(listener) == -1) + { + return 0; + } + return 1; } /** @@ -422,31 +423,31 @@ int syseno = 0; * * Currently we do no command execution * - * @param dcb The client DCB - * @param cmd The command stream + * @param dcb The client DCB + * @param cmd The command stream */ -static void -telnetd_command(DCB *dcb, unsigned char *cmd) +static void telnetd_command(DCB *dcb, unsigned char *cmd) { } /** * Enable or disable telnet protocol echo * - * @param dcb DCB of the telnet connection - * @param enable Enable or disable echo functionality + * @param dcb DCB of the telnet connection + * @param enable Enable or disable echo functionality */ -static void -telnetd_echo(DCB *dcb, int enable) +static void telnetd_echo(DCB *dcb, int enable) { -GWBUF *gwbuf; -char *buf; + GWBUF *gwbuf; + char *buf; - if ((gwbuf = gwbuf_alloc(3)) == NULL) - return; - buf = GWBUF_DATA(gwbuf); - buf[0] = TELNET_IAC; - buf[1] = enable ? TELNET_WONT : TELNET_WILL; - buf[2] = TELNET_ECHO; - dcb_write(dcb, gwbuf); + if ((gwbuf = gwbuf_alloc(3)) == NULL) + { + return; + } + buf = GWBUF_DATA(gwbuf); + buf[0] = TELNET_IAC; + buf[1] = enable ? TELNET_WONT : TELNET_WILL; + buf[2] = TELNET_ECHO; + dcb_write(dcb, gwbuf); }