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, ¶ms.server, sizeof(params.server)); /* Try to send email */ retval = SMTP_send_email(¶ms, 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); }
/* * 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(¶ms); 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); }