Example #1
0
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;
}  
Example #2
0
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);
}