示例#1
0
int32_t Shell_smtp (int32_t argc, char *argv[])
{
    struct addrinfo            hints;
    struct addrinfo           *result, *rp;
    int32_t                    retval = 0;
    uint32_t                   sfd = 0;
    int32_t                    err_code = 0;
    bool                       print_help;
    bool                       shorthelp = FALSE;
    SMTP_PARAM_STRUCT          params;
    char                      *errstr = NULL;
    char                      *server = NULL;
    char                      *optstring = ":f:t:s:u:p:m:h";
    int32_t                    next_option;
    char                      *email_text = NULL;
    uint32_t                   email_size = 0;
    TIME_STRUCT                time;
    DATE_STRUCT                date;
    char                       date_str[DATE_LENGTH];
    SHELL_GETOPT_CONTEXT       gopt_context;

    params.login = NULL;
    params.pass = NULL;

    print_help = Shell_check_help_request(argc, argv, &shorthelp);
    
    if (print_help)
    {
        if (!shorthelp)
        {
            fprintf(stdout,"Usage:"); 
        }
        fprintf(stdout, "%s", argv[0]);
        print_usage(stdout, shorthelp);
        err_code = SHELL_EXIT_SUCCESS;
        return(err_code);
    }
    
    /* Parse command line options */
    Shell_getopt_init(&gopt_context);
    do
    {
        next_option = Shell_getopt(argc, argv, optstring, &gopt_context);
        switch (next_option)
        {
            case 'f':
                params.envelope.from = gopt_context.optarg;
                break;
            case 't':
                params.envelope.to = gopt_context.optarg;
                break;
            case 'm':
                params.text = gopt_context.optarg;
                break;
            case 's':
                server = gopt_context.optarg;
                break;
            case 'u':
                params.login = gopt_context.optarg;
                break;
            case 'p':
                params.pass = gopt_context.optarg;
                break;
            case 'h':
                print_usage (stdout, FALSE);
                return(SHELL_EXIT_SUCCESS);
            case '?': /* User specified an invalid option. */
                print_usage(stderr, TRUE);
                return(SHELL_EXIT_ERROR);
            case ':': /* Option has a missing parameter. */
                printf("Option -%c requires a parameter.\n", next_option);
                return(SHELL_EXIT_ERROR);
            case -1: /* Done with options. */
                break;
            default:
                break;
        }
    }while(next_option != -1);
    
    
    _time_get(&time);
    _time_to_date(&time,&date);

    snprintf(date_str, DATE_LENGTH, "%s, %d %s %d %02d:%02d:%02d -0000",
        wday[date.WDAY],date.DAY, months[date.MONTH-1],date.YEAR, date.HOUR, date.MINUTE, date.SECOND);
    /* Evaluate email size */
    email_size = strlen(params.envelope.from) + 
                 strlen(params.envelope.to) +
                 strlen(params.text) +
                 strlen(date_str) +
                 strlen("From: <>\r\n") +
                 strlen("To: <>\r\n") + 
                 strlen("Subject: Freescale Tower Email\r\n") +
                 strlen("Date: \r\n\r\n") +   
                 strlen("\r\n") + 1;
    /* Allocate space */
    email_text = (char *) _mem_alloc_zero(email_size);
    if (email_text == NULL)
    {
        fprintf(stderr, "  Unable to allocate memory for email message.\n");
        err_code = SHELL_EXIT_ERROR;
        return(err_code);
    }
    /* Prepare email message */
    snprintf(email_text, email_size, "From: <%s>\r\n"
                                     "To: <%s>\r\n"
                                     "Subject: Freescale Tower Email\r\n"
                                     "Date: %s\r\n\r\n"
                                     "%s\r\n",
                                     params.envelope.from,
                                     params.envelope.to,
                                     date_str,
                                     params.text);
    params.text = email_text;
    
    _mem_zero(&hints, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM; /* TCP socket */
    hints.ai_flags = AI_PASSIVE;     /* For wildcard IP address */
    hints.ai_protocol = 0;           /* Any protocol */
    hints.ai_canonname = NULL;
    hints.ai_addr = NULL;
    hints.ai_next = NULL;

    retval = getaddrinfo(server, NULL, &hints, &result);
    if (retval != 0)
    {
        fprintf(stderr, "  getaddrinfo failed. Error: 0x%X\n", retval);
        err_code = SHELL_EXIT_ERROR;
        return(err_code);
    }
    /* Allocate buffer for error message */
    errstr = (char *) _mem_alloc_system_zero(ERR_MSG_BUFF_SIZE);
    /* Try to send email using one of addresses. If it fails try another one. */
    for (rp = result; rp != NULL; rp = rp->ai_next)
    {
        _mem_copy(rp->ai_addr, &params.server, sizeof(params.server));
        /* Try to send email */
        retval = SMTP_send_email(&params, errstr, ERR_MSG_BUFF_SIZE);
        /* If connection failed try another address */
        if (retval != SMTP_ERR_CONN_FAILED)
        {
            break;
        }
    }
    /* No address succeeded */
    if (rp == NULL)
    {
        fprintf(stderr, "  Unable to connect to %s.\n", server);
        err_code = SHELL_EXIT_ERROR;
    }

    if (retval != SMTP_OK)
    {
        printf("  Email sending failed%s %s\n", (strlen(errstr) > 0) ? ":":".", errstr);
        err_code = SHELL_EXIT_ERROR;
    }
    else
    {
        printf("  Email send. Server response: %s", errstr);
    }
    /* Cleanup */
    freeaddrinfo(result);
    _mem_free(errstr);
    _mem_free(email_text);
    return(err_code);
} 
示例#2
0
/*
 * Download/Upload file from/to TFTP server.
 */
int32_t Shell_tftpcln(int32_t argc, char *argv[])
{
    bool                   shorthelp = FALSE;
    int32_t                return_code = SHELL_EXIT_SUCCESS;
    TFTPCLN_PARAM_STRUCT   params = {0};
    char                   *optstring = ":h:pm:r:l:f:";
    SHELL_GETOPT_CONTEXT   gopt_context;
    int32_t                next_option;
    char                   *host;
    char                   *port;
    char                   *remote_filename;
    char                   *local_filename;
    char                   *mode;
    struct addrinfo        hints = {0};
    struct addrinfo        *getadd_result;
    int                    error;
    uint32_t               handle;
    int32_t                result;
    char*                  result_string;
    SHELL_CONTEXT_PTR      shell_ptr;

    shell_ptr = Shell_get_context(argv);
    Shell_tftpcln_stdout = shell_ptr->STDOUT;
    if (Shell_check_help_request(argc, argv, &shorthelp))
    {
        sh_tftpcln_print_usage(argv[0], shorthelp);
        return(return_code);
    }

    hints.ai_socktype = SOCK_STREAM;
    hints.ai_family = AF_UNSPEC;
    port = SHELL_TFTPCLN_DEFAULT_PORT;
    host = NULL;
    mode = NULL;
    remote_filename = NULL;
    local_filename = NULL;
    params.recv_callback = sh_tftpcln_callback;
    params.send_callback = sh_tftpcln_callback;
    params.error_callback = sh_tftpcln_error;

    /* Parse command line options */
    Shell_getopt_init(&gopt_context);
    do
    {
        next_option = Shell_getopt(argc, argv, optstring, &gopt_context);
        switch (next_option)
        {
            case 'h':
                host = gopt_context.optarg;
                break;
            case 'p':
                if(strtoul(gopt_context.optarg, NULL, 10) != 0)
                {
                    port = gopt_context.optarg;
                }
                break;
            case 'm':
                mode = gopt_context.optarg;
                break;
            case 'r':
                remote_filename = gopt_context.optarg;
                break;
            case 'l':
                local_filename = gopt_context.optarg;
                break;
            case 'f':
                if(strtoul(gopt_context.optarg, NULL, 10) == 4)
                {
                    hints.ai_family = AF_INET;
                }
                else if(strtoul(gopt_context.optarg, NULL, 10) == 6)
                {
                    hints.ai_family = AF_INET6;
                }
                break;
            case '?': /* User specified an invalid option. */
                fprintf(shell_ptr->STDOUT, "Unknown option -%c.\n", next_option);
                sh_tftpcln_print_usage(argv[0], TRUE);
                return_code = SHELL_EXIT_ERROR;
                next_option = -1;
                break;
            case ':': /* Option has a missing parameter. */
                fprintf(shell_ptr->STDOUT, "Option -%c requires a parameter.\n", next_option);
                return_code = SHELL_EXIT_ERROR;
                next_option = -1;
                break;
            case -1: /* Done with options. */
                break;
            default:
                break;
        }
    }while(next_option != -1);
    
    if (return_code == SHELL_EXIT_ERROR)
    {
        return(return_code);
    }

    /* check if we have all required parameters. */
    if (host == NULL)
    {
        fputs("Host not specified!\n", shell_ptr->STDOUT);
        sh_tftpcln_print_usage(argv[0], TRUE);
        return(SHELL_EXIT_ERROR);
    }

    error = getaddrinfo(host, port, &hints, &getadd_result);
    if (error == 0)
    {
        params.sa_remote_host = *getadd_result->ai_addr;

        freeaddrinfo(getadd_result);
        fprintf(shell_ptr->STDOUT, "Connecting to %s, port %s...", host, port);

        handle = TFTPCLN_connect(&params);
        if (handle == 0)
        {
            fputs("FAIL\n", shell_ptr->STDOUT);
            return(SHELL_EXIT_ERROR);
        }
        else
        {
            fputs("OK\n", shell_ptr->STDOUT);
        }
    }
    else
    {
        printf("Failed to resolve %s:%s\n", host, port);
    }

    if (!strcmp(mode, "PUT"))
    {
        if (local_filename == NULL)
        {
            fputs("Local file name not specified!\n", shell_ptr->STDOUT);
            sh_tftpcln_print_usage(argv[0], TRUE);
            return(SHELL_EXIT_ERROR);
        }
        fprintf(shell_ptr->STDOUT, "Uploading local file %s to %s:", local_filename, remote_filename);
        result = TFTPCLN_put(handle, local_filename, remote_filename);
    }
    else if (!strcmp(mode, "GET"))
    {
        if (remote_filename == NULL)
        {
            fputs("Remote file name not specified!\n", shell_ptr->STDOUT);
            sh_tftpcln_print_usage(argv[0], TRUE);
            return(SHELL_EXIT_ERROR);
        }
        fprintf(shell_ptr->STDOUT, "Downloading remote file %s to %s:", remote_filename, local_filename);
        result = TFTPCLN_get(handle, local_filename, remote_filename);
    }
    if (result == RTCS_OK)
    {
        result_string = "successful";
    }
    else
    {
        result_string = "failed";
    }
    fprintf(shell_ptr->STDOUT, "Transaction %s.\n", result_string);
    TFTPCLN_disconnect(handle);
    return(return_code);
}