static int initial_parse (struct _mu_imapio *io) { int rc, type; int eat_rest = 0; if ((rc = mu_wordsplit_len (io->_imap_buf_base, io->_imap_buf_level, &io->_imap_ws, io->_imap_ws_flags | (io->_imap_server ? 0 : MU_WRDSF_INCREMENTAL)))) { if (rc == MU_WRDSE_NOINPUT) return IMAPIO_OK; return IMAPIO_ERR; } io->_imap_ws_flags |= MU_WRDSF_REUSE; if (io->_imap_server) return IMAPIO_OK; if ((rc = mu_wordsplit (NULL, &io->_imap_ws, MU_WRDSF_INCREMENTAL))) { if (rc == MU_WRDSE_NOINPUT) return IMAPIO_OK; return IMAPIO_ERR; } if (strcmp (io->_imap_ws.ws_wordv[0], "+") == 0) eat_rest = 1; else if ((type = is_status_response (io->_imap_ws.ws_wordv[1])) && (type == STATUS_RESPONSE || strcmp (io->_imap_ws.ws_wordv[0], "*") == 0)) { rc = get_response_code (io); if (rc) return IMAPIO_ERR; eat_rest = 1; } if (eat_rest) { while (io->_imap_ws.ws_endp < io->_imap_ws.ws_len && mu_isblank (io->_imap_ws.ws_input[io->_imap_ws.ws_endp])) io->_imap_ws.ws_endp++; io->_imap_ws.ws_flags |= MU_WRDSF_NOSPLIT; rc = mu_wordsplit (NULL, &io->_imap_ws, MU_WRDSF_INCREMENTAL); io->_imap_ws.ws_flags &= ~MU_WRDSF_NOSPLIT; if (rc) { if (rc != MU_WRDSE_NOINPUT) return IMAPIO_ERR; } return IMAPIO_RESP; } return IMAPIO_OK; }
void main(void) { enum codes code = OK; int sockfd; struct sockaddr_in self; char buffer[MAXBUF]; FILE *in; extern FILE *popen(); char buff[2048]; setlogmask (LOG_UPTO (LOG_INFO | LOG_ERR)); syslog (LOG_INFO, "Starting Listener Mail Service... pid:[%d]", getpid()); // Create streaming socket if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { syslog (LOG_ERR, "[Listener Mail Service]: Error in create Socket..."); exit(errno); } // Initialize address/port structure bzero(&self, sizeof(self)); self.sin_family = AF_INET; self.sin_port = htons(MY_PORT); self.sin_addr.s_addr = INADDR_ANY; // Assign a port number to the socket if ( bind(sockfd, (struct sockaddr*)&self, sizeof(self)) != 0 ) { syslog (LOG_ERR, "[Listener Mail Service]: Error in Socket-bind..."); exit(errno); } // Make it a listening socket if ( listen(sockfd, 20) != 0 ) { syslog (LOG_ERR, "[Listener Mail Service]: Error in Socket-listen..."); exit(errno); } syslog (LOG_INFO, "[Listener Mail Service]: Started..."); //Forever while (1) { int clientfd; struct sockaddr_in client_addr; int addrlen=sizeof(client_addr); // accept a connection (creating a data pipe) clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen); syslog (LOG_INFO, "[Listener Mail Service]: Socket %s:%d connected\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); recv(clientfd, buffer, MAXBUF, 0); syslog (LOG_INFO, "[Listener Mail Service]: Data receive [%s]\n", buffer); //Validate message structure //printf("ESTO ES LO QUE LEE\n%s\n",buffer ); char **parts = calloc(4, sizeof(char *)); size_t size = strsplit(buffer, parts, "|"); sprintf(buff,"echo \" %s \" | mailx -v -r \"[email protected]\" -s \"Banco de los Sistemas Operativos\" -S smtp=\"smtp.gmail.com:587\" -S smtp-use-starttls -S smtp-auth=login -S smtp-auth-user=\"[email protected]\" -S smtp-auth-password=\"sisoper123\" -S ssl-verify=ignore [email protected]",parts[0]); if(!(in = popen(buff, "r"))){ exit(1); } char *str_code = get_response_code(code); send(clientfd, str_code, strlen(str_code), 0); //Close data connection close(clientfd); sleep(10); } // Clean up (should never get here!) close(sockfd); pclose(in); }
//////////////////////////////////////////////////////////////////////////////// // Listener Service //////////////////////////////////////////////////////////////////////////////// void listener_service(void) { enum codes code = OK; int sockfd; struct sockaddr_in self; char buffer[MAXBUF]; setlogmask (LOG_UPTO (LOG_INFO | LOG_ERR)); syslog (LOG_INFO, "Starting Listener Service... pid:[%d]", getpid()); // Create streaming socket if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { syslog (LOG_ERR, "[Listener Service]: Error in create Socket..."); exit(errno); } // Initialize address/port structure bzero(&self, sizeof(self)); self.sin_family = AF_INET; self.sin_port = htons(MY_PORT); self.sin_addr.s_addr = INADDR_ANY; // Assign a port number to the socket if ( bind(sockfd, (struct sockaddr*)&self, sizeof(self)) != 0 ) { syslog (LOG_ERR, "[Listener Service]: Error in Socket-bind..."); exit(errno); } // Make it a listening socket if ( listen(sockfd, 20) != 0 ) { syslog (LOG_ERR, "[Listener Service]: Error in Socket-listen..."); exit(errno); } syslog (LOG_INFO, "[Listener Service]: Started..."); //Forever while (1) { int clientfd; struct sockaddr_in client_addr; int addrlen=sizeof(client_addr); // accept a connection (creating a data pipe) clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen); syslog (LOG_INFO, "[Listener Service]: Socket %s:%d connected\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); recv(clientfd, buffer, MAXBUF, 0); syslog (LOG_INFO, "[Listener Service]: Data receive [%s]\n", buffer); char **partes= calloc(10,sizeof(char *)); size_t tamano= strsplit(buffer,partes,"|"); //Divide hasta un | //Validate message structure //Insert into sqlite int customer_id = atoi(partes[0]); char *transaction_id = partes[1]; char *card_number = partes[2]; int amount = atoi(partes[3]); if ( insert_request(customer_id, transaction_id, card_number, amount) == 0 ) code = OK; //Back response 202 (Received) else code = INTERNAL_SERVER_ERROR; //Back response 500 // (Internal server error) char *str_code = get_response_code(code); send(clientfd, str_code, strlen(str_code), 0); //Close data connection close(clientfd); } // Clean up (should never get here!) close(sockfd); }