int main(int argc, char *argv[]){ /* Input values */ char *inFile = NULL, *forceFile = NULL, *setAlignments = NULL, *matrix = NULL; int windowSize = -1, gapWindow = -1, simWindow = -1, conWindow = -1; bool stats_gaps_columns = 0, stats_gaps_dist = 0, stats_simil_columns = 0, stats_simil_dist = 0, stats_seqs_ident = 0, stats_col_ident_gen = 0, stats_file_columns = 0, stats_file_dist = 0; alignment *origAlig = NULL, **compAlig = NULL; /* Internal variables */ int i = 1, numFiles = 0, maxResidues = 0, referFile = 0, alignDataType = -1; similarityMatrix *similMatrix = NULL; char **filesToCompare = NULL; bool appearErrors = false; float *compareVect = NULL; ifstream algsPaths; string line; /* ***** ***** ***** ***** ***** Help functions ***** ***** ***** ***** *** */ /* Show help and exit either help flag is set or not arguments are provided */ if((argc == 1) || ((!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) && (i+1 == argc))) { show_menu(); show_examples(); return 0; } /* Show version and revision if it is asked for */ if((!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) && (i+1 == argc)) { cout << endl << "statAl v" << VERSION << ".rev" << REVISION << " build[" << BUILD << "]" << endl << endl; return 0; } /* Allocate local memory for input alignment */ origAlig = new alignment; /* ***** ***** ***** ***** Input parameters loop ***** ***** ***** ***** ** */ while(i < argc) { /* Get input alignment */ if((!strcmp(argv[i], "-i") || !strcmp(argv[i], "-in")) && (i+1 != argc) && (inFile == NULL)) { /* Try to load input alignment */ inFile = new char[(int) strlen(argv[++i]) + 1]; strcpy(inFile, argv[i]); if(!origAlig -> loadAlignment(inFile)) { cerr << endl << "ERROR: Alignment not loaded: \"" << inFile << "\" Check input aligmment content." << endl << endl; appearErrors = true; } } /* Force selection of a specific input alignment as a reference to perform * alignment comparisons */ else if(!strcmp(argv[i], "-forceselect") && (i+1 != argc) && (forceFile == NULL)) { forceFile = new char[(int) strlen(argv[++i]) + 1]; strcpy(forceFile, argv[i]); if(!origAlig -> loadAlignment(forceFile)) { cerr << endl << "ERROR: Alignment not loaded: \"" << forceFile << "\" Check input aligmment content." << endl << endl; appearErrors = true; } } /* Load a set of alignments to perform alignments comparisos among them */ else if(!strcmp(argv[i], "-compareset") && (i+1 != argc) && (setAlignments == NULL)) { setAlignments = new char[(int) strlen(argv[++i]) + 1]; strcpy(setAlignments, argv[i]); } /* Load a similarity matrix */ else if(!strcmp(argv[i], "-matrix") && (i+1 != argc) && (matrix == NULL)) { matrix = new char[int(strlen(argv[++i])) + 1]; strcpy(matrix, argv[i]); similMatrix = new similarityMatrix(); if(!similMatrix -> loadSimMatrix(matrix)) { cerr << endl << "ERROR: Similarity Matrix not loaded: \"" << matrix << "\" Check input file content." << endl << endl; appearErrors = true; } } /* Set flags for computing different stats from input alignments */ else if((!strcmp(argv[i], "-sgc")) && (!stats_gaps_columns)) stats_gaps_columns = true; else if((!strcmp(argv[i], "-sgt")) && (!stats_gaps_dist)) stats_gaps_dist = true; else if((!strcmp(argv[i], "-ssc")) && (!stats_simil_columns)) stats_simil_columns = true; else if((!strcmp(argv[i], "-sst")) && (!stats_simil_dist)) stats_simil_dist = true; else if((!strcmp(argv[i], "-sident")) && (!stats_seqs_ident)) stats_seqs_ident = true; else if((!strcmp(argv[i], "-scolidentt")) && (!stats_col_ident_gen)) stats_col_ident_gen = true; else if((!strcmp(argv[i], "-sfc")) && (!stats_file_columns)) stats_file_columns = true; else if((!strcmp(argv[i], "-sft")) && (!stats_file_dist)) stats_file_dist = true; /* Windows size parameters. Setting others values than default could affect * stats computed from selected alignment */ else if(!strcmp(argv[i], "-w") && (i+1 != argc) && (windowSize == -1)) { if(utils::isNumber(argv[i+1])) { windowSize = atoi(argv[++i]); } else { cerr << endl << "ERROR: Window size value should be a number\n\n."; appearErrors = true; } if(windowSize < 1) { cerr << endl << "ERROR: Windows size value should be equal or greater " << "than 1. Check your command-line parameter" << endl << endl; appearErrors = true; } } /* Window size value only affecting stats related to gaps */ else if(!strcmp(argv[i], "-gw") && (i+1 != argc) && (gapWindow == -1)){ if(utils::isNumber(argv[i+1])) { gapWindow = atoi(argv[++i]); } else { cerr << endl << "ERROR: Gap Window size value should be a number\n\n."; appearErrors = true; } if(gapWindow < 1) { cerr << endl << "ERROR: Gap Windows size should be equal or greater " << "than 1. Check your command-line parameter" << endl << endl; appearErrors = true; } } /* Window size value only affecting stats related to similarity */ else if(!strcmp(argv[i], "-sw") && (i+1 != argc) && (simWindow == -1)) { if(utils::isNumber(argv[i+1])) { simWindow = atoi(argv[++i]); } else { cerr << endl << "ERROR: Similarity Window size should be a number\n\n."; appearErrors = true; } if(simWindow < 1) { cerr << endl << "ERROR: Similarity Windows size should be equal or " << "gretaer than 1. Check your command-line parameter\n\n"; appearErrors = true; } } /* Window size only affecting stats related to alignment comparisons */ else if(!strcmp(argv[i], "-cw") && (i+1 != argc) && (conWindow == -1)) { if(utils::isNumber(argv[i+1])) { conWindow = atoi(argv[++i]); } else { cerr << endl << "ERROR: Consistency Window size should be a number\n\n"; appearErrors = true; } if(conWindow < 1) { cerr << endl << "ERROR: Consistency Windows size should be equal or " << "gretaer than 1. Check your command-line parameter\n\n"; appearErrors = true; } } else { cerr << endl << "ERROR: Parameter \"" << argv[i] << "\" not valid\n\n."; appearErrors = true; } i++; if(appearErrors) break; } /* ***** ***** ***** ** Control input parameters errors ***** ***** ***** * */ if((!appearErrors) && (inFile != NULL)) { if((stats_file_columns) || (stats_file_dist)) { cerr << endl << "ERROR: No stats about alignments comparison can be " << "obtained from Single Input Alignment" << endl << endl; appearErrors = true; } if((forceFile != NULL) || (setAlignments != NULL)) { cerr << endl << "ERROR: Incompatibilities detected: Sigle Alignment " << "provided as well as Set of Alignments for being compared\n\n"; appearErrors = true; } } if((!appearErrors) && (forceFile != NULL)) { if(setAlignments == NULL) { cerr << endl << "ERROR: An alignmnet has been set as reference but it has" << "not been defined a set to compare with" << endl << endl; appearErrors = true; } } if((!appearErrors) && (stats_file_columns || stats_file_dist)) { if(setAlignments == NULL) { cerr << endl << "ERROR: A set of alignments should be provided to compute" << "stats about its comparison" << endl << endl; appearErrors = true; } } if((!appearErrors) && (windowSize != -1)) { if((gapWindow != -1) || (simWindow != -1) || (conWindow != -1)) { cerr << endl << "ERROR: General and specific windows size specified. Just" << " select one of them" << endl << endl; appearErrors = true; } } if((!appearErrors) && (setAlignments != NULL)) { /* Open and check whether input file containing the path to alignments for * being compared is correct or not */ algsPaths.open(setAlignments, ifstream::in); if(!algsPaths) { cerr << endl << "ERROR: Check input file \"" << setAlignments << "\" containing alignments paths" << endl << endl; appearErrors = true; } /* Count number of alignments */ while(getline(algsPaths, line)) numFiles++; algsPaths.close(); } /* ***** ***** ***** ** Input set of alignments: Load it ***** ***** ***** */ if((!appearErrors) && (numFiles != 0)) { /* allocate memory for input alignments */ filesToCompare = new char*[numFiles]; compAlig = new alignment*[numFiles]; algsPaths.open(setAlignments, ifstream::in); for(i = 0; (i < numFiles) && (!appearErrors); i++) { /* Get alignment path */ getline(algsPaths, line); if(line.size() == 0) continue; /* Store alignment path and try to load it */ filesToCompare[i] = new char [line.size() + 1]; strcpy(filesToCompare[i], line.c_str()); /* Check currently load alignment */ compAlig[i] = new alignment; if(!compAlig[i] -> loadAlignment(filesToCompare[i])) { cerr << endl << "ERROR: Alignment not loaded: \"" << filesToCompare[i] << "\". Check input file content" << endl << endl; appearErrors = true; break; } /* Check whether each individual alignment is aligned. It is impossible * to make any comparison with unaligned sequences */ if(!compAlig[i] -> isFileAligned()) { cerr << endl << "ERROR: Input alignment \"" << filesToCompare[i] << "\"" << "should have sequences aligned for computing any stats from them." << endl << endl; appearErrors = true; break; } /* Check all input alignments contain the same kind of biological data */ if(alignDataType == -1) alignDataType = compAlig[i] -> getTypeAlignment(); else if(compAlig[i] -> getTypeAlignment() != alignDataType) { cerr << endl << "ERROR: Check input alignment data-type. Alignment \"" << filesToCompare[0] << "\" contains a different data-type different " << "than \"" << filesToCompare[i] << "\"" << endl << endl; appearErrors = true; break; } /* Construct residues positions matrix to make possible any comparison */ compAlig[i] -> sequenMatrix(); if(compAlig[i] -> getNumAminos() > maxResidues) maxResidues = compAlig[i] -> getNumAminos(); } /* ***** ***** ***** ** Input set of alignments: Compare it ***** ***** * */ if((!appearErrors) && (forceFile == NULL)) { /* If reference alignment has not been set, just compute the most * consistent one and choose it as the reference one */ compareVect = new float[maxResidues]; referFile = compareFiles::algorithm(compAlig, filesToCompare, compareVect, numFiles, true); origAlig -> loadAlignment(filesToCompare[referFile]); } else if((!appearErrors) && (forceFile != NULL)) { /* Compute consistency vector for the aligment set as the reference one */ compareVect = new float[origAlig -> getNumAminos()]; appearErrors = !(compareFiles::forceComparison(compAlig, numFiles, origAlig, compareVect)); } /* Apply any possible windows for future stats */ conWindow = (conWindow != -1) ? conWindow : windowSize; if((conWindow != -1) && (!appearErrors)) compareFiles::applyWindow(origAlig -> getNumAminos(), conWindow, compareVect); /* Deallocate memory for the alignments used to make the comparisons */ for(i = 0; i < numFiles; delete compAlig[i], i++) delete filesToCompare[i]; } /* ***** ***** ***** ***** ***** Final Checks ***** ***** ***** ***** ***** */ if((!appearErrors) && (!origAlig -> isFileAligned() && (stats_gaps_columns or stats_gaps_dist or stats_simil_columns or stats_simil_dist or stats_seqs_ident or stats_col_ident_gen or stats_file_columns or stats_file_dist))) { cerr << endl << "ERROR: Reference alignment should aligned to compute any " << "stats using it" << endl << endl; appearErrors = true; } /* ***** ***** ***** ***** * Apply input parameters ***** ***** ***** ***** */ if(!appearErrors) { /* Apply window size to either input single alignment or the most consistent * one */ gapWindow = (windowSize != -1) ? windowSize : (gapWindow != -1) ? gapWindow : 0; simWindow = (windowSize != -1) ? windowSize : (simWindow != -1) ? simWindow : 0; origAlig -> setWindowsSize(gapWindow, simWindow); } /* ***** ***** ***** ***** * Load Similarity Matrix ***** ***** ***** ***** */ if(!appearErrors) { if((stats_simil_columns) || (stats_simil_dist)) { /* Load predefined similarity matrix, if none has been set by the user */ if(matrix == NULL){ similMatrix = new similarityMatrix(); if((origAlig -> getTypeAlignment()) == AAType) similMatrix -> defaultAASimMatrix(); else similMatrix -> defaultNTSimMatrix(); } /* Assign similarity matrix, either predefined one or supply by the user, * to the alignment that is used to compute stats */ if(!origAlig -> setSimilarityMatrix(similMatrix)) { cerr << endl << "ERROR: Impossible to associate similarity matrix to " << "selected alignment. Check input matrix file content\n\n"; appearErrors = true; } } } /* ***** ***** ***** ***** ** Compute/Show stats ***** ***** ***** ***** ** */ if(!appearErrors) { if(stats_gaps_columns) { cout << endl << "## Gaps scores per column" << endl; origAlig -> printStatisticsGapsColumns(); } if(stats_gaps_dist) { cout << endl << "## Gaps scores distribution" << endl; origAlig -> printStatisticsGapsTotal(); } if(stats_simil_columns) { cout << endl << "## Similarity values per column" << endl; origAlig -> printStatisticsConservationColumns(); } if(stats_simil_dist) { cout << endl << "## Similarity values distribution" << endl; origAlig -> printStatisticsConservationTotal(); } if(stats_seqs_ident) { cout << endl << "## Sequence Identity Values" << endl; origAlig -> printSeqIdentity(); } if(stats_col_ident_gen) { cout << endl << "## Columns Identity Descriptive Statistics" << endl; origAlig -> printColumnsIdentity_DescriptiveStats(); } if(stats_file_columns) { cout << endl << "## Consistency values per column for selected align\n"; compareFiles::printStatisticsFileColumns(origAlig -> getNumAminos(), compareVect); } if(stats_file_dist) { cout << endl << "## Consistency values distribution for selected align\n"; compareFiles::printStatisticsFileAcl(origAlig -> getNumAminos(), compareVect); } } /* ***** ***** ***** ***** *** Deallocate memory ***** ***** ***** ***** ** */ delete origAlig; delete[] compAlig; delete similMatrix; delete[] filesToCompare; delete[] compareVect; delete[] inFile; delete[] matrix; delete[] forceFile; return (appearErrors == true ? -1 : 0); }
int main(int argc,char **argv) { char *x, *y, buf[BUFSIZ], encrypted_pass[128], /* 80 bytes actually */ *cipher=NULL, *option; int smtp_info=0, is_mime=0, add_dateh=1, port=(-1), rc = (-1), no_cc=1, no_bcc=1, i; char *address_file=NULL, *helo_domain=NULL, *smtp_server=NULL, *attach_file=NULL, *msg_body_file=NULL, /* back in 1.17b15 */ *the_msg=NULL, *custom_header=NULL, *to=NULL, *save_to=NULL, *save_cc=NULL, *save_bcc=NULL, *from=NULL, *sub=NULL, *cc=NULL, *bcc=NULL, *rt=NULL, *rrr=NULL; g_verbose=0; g_connect_timeout = DEFAULT_CONNECT_TIMEOUT; /* 5 secs */ g_quiet=0; g_wait_for_cr=0; g_do_auth=0; g_esmtp=0; g_auth_plain=0; g_auth_cram_md5=0; g_auth_login=0; g_do_ssl=0; g_do_starttls=0; g_log_fp = NULL; g_show_attachment_in_log = 0; g_use_protocol = MSOCK_USE_AUTO; /* detect IPv4 or IPv6 */ g_force = MUTILS_FALSE; memset(g_log_file,0,sizeof(g_log_file)); memset(g_username,0,sizeof(g_username)); memset(g_userpass,0,sizeof(g_userpass)); memset(encrypted_pass, 0, sizeof(encrypted_pass)); memset(g_from_name,0,sizeof(g_from_name)); memset(g_content_type,0,sizeof(g_content_type)); memset(g_attach_sep, 0, sizeof(g_attach_sep)); memset(g_attach_name, 0, sizeof(g_attach_name)); memset(g_content_transfer_encoding, 0, sizeof(g_content_transfer_encoding)); memset(g_mime_type, 0, sizeof(g_mime_type)); memset(g_content_id, 0, sizeof(g_content_id)); /* (void) strcpy(g_content_transfer_encoding,"base64"); */ /* no default */ (void) strcpy(g_content_disposition,"attachment"); (void) strcpy(g_attach_sep,","); (void) strcpy(g_charset,DEFAULT_CHARSET); /* No default for mime_type, we will detect from file extensinon if no mime type is specified with -mime-type */ /* (void) strcpy(g_mime_type,"text/plain"); */ for (i=1; i < argc; i++) { option=argv[i]; switch (*(option+1)) { case 'a': { if (strncmp("attach",option+1,6) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing file to attach"); rc = 1; goto ExitProcessing; } attach_file=argv[i]; add_attachment_to_list(attach_file); } } else if (strncmp("aname",option+1,5) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing attachment name"); rc = 1; goto ExitProcessing; } mutilsSafeStrcpy(g_attach_name,argv[i],sizeof(g_attach_name)-1); } } else if (strncmp("auth-plain",option+1, strlen("auth-plain"))==0) { if (*option == '-') { g_auth_plain=1; } } else if (strncmp("auth-cram-md5",option+1, strlen("auth-cram-md5"))==0) { if (*option == '-') { g_auth_cram_md5=1; } } else if (strncmp("auth-login",option+1, strlen("auth-login"))==0) { if (*option == '-') { g_auth_login=1; } } else if (strncmp("auth",option+1, strlen("auth"))==0) { if (*option == '-') { g_auth_plain=1; g_auth_login=1; g_auth_cram_md5=1; g_auth_login=1; g_do_auth=1; } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'b': { if (strncmp("bcc",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing BCc address/es"); rc = 1; goto ExitProcessing; } bcc=argv[i]; save_bcc=mutilsStrdup(bcc); /* collapse all spaces to a comma */ mutilsSpacesToChar(bcc,','); addAddressToList(bcc,"Bcc"); } else if (*option == '+') { no_bcc=1; } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case '4': { if (strncmp("4", option + 1,1) == 0) { if (*option == '-') { g_use_protocol = MSOCK_USE_IPV4; } } break; } case '6': { if (strncmp("6", option + 1,1) == 0) { if (*option == '-') { g_use_protocol = MSOCK_USE_IPV6; } } break; } case 'c': { if (strncmp("cc",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing Cc address/es"); rc = 1; goto ExitProcessing; } cc=argv[i]; save_cc=mutilsStrdup(cc); /* collapse all spaces to a comma */ mutilsSpacesToChar(cc,','); addAddressToList(cc,"Cc"); } else if (*option == '+') { no_cc=1; } } else if (strncmp("cs",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing character set"); rc = 1; goto ExitProcessing; } mutilsSafeStrcpy(g_charset,argv[i],sizeof(g_charset)-1); } } else if (strncmp("ct", option + 1, 2) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing connect timeout with -ct"); rc = 1; goto ExitProcessing; } g_connect_timeout = atoi(argv[i]); } } else if (strncmp("content-type", option+1, 12)==0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing content-type value"); rc = 1; goto ExitProcessing; } mutilsSafeStrcpy(g_content_type,argv[i],sizeof(g_content_type)-1); } } else if (strncmp("content-disposition", option + 1, 12) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing content-dispostion value"); rc = 1; goto ExitProcessing; } if ((strcmp(argv[i],"inline") == 0) || strcmp(argv[i], "attachment") == 0) { mutilsSafeStrcpy(g_content_disposition,argv[i], sizeof(g_content_disposition)-1); } else { errorMsg("Invalid value for -content-disposition"); rc = 1; goto ExitProcessing; } } } else if (strncmp("content-id", option + 1, 10) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing content-id value"); rc = 1; goto ExitProcessing; } mutilsSafeStrcpy(g_content_id,argv[i],sizeof(g_content_id)-1); } } else if (strncmp("copyright", option + 1, 5) == 0) { print_copyright(); rc = 0; goto ExitProcessing; } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'D': { if (strncmp("D",option+1,1) == 0) { if (*option == '+') { add_dateh=0; } } break; } case 'd': { if (strncmp("domain",option+1,6) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing domain name"); rc = 1; goto ExitProcessing; } helo_domain=argv[i]; } } else if (strncmp("disposition", option + 1, 6) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing content dispostion value"); rc = 1; goto ExitProcessing; } if ((strcmp(argv[i],"inline") == 0) || strcmp(argv[i], "attachment") == 0) { mutilsSafeStrcpy(g_content_disposition,argv[i],sizeof(g_content_disposition)-1); } else { errorMsg("Invalid value for -disposition"); rc = 1; goto ExitProcessing; } } } break; } case 'e': { if (strncmp("example",option+1,2) == 0) { if (*option == '-') { show_examples(); rc = 1; goto ExitProcessing; } } else if (strncmp("ehlo",option+1,4) == 0) { if (*option == '-') { g_esmtp=1; } } else if (strncmp("enc-type",option+1,5) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing encoding type"); rc = 1; goto ExitProcessing; } mutilsSafeStrcpy(g_content_transfer_encoding, argv[i], sizeof(g_content_transfer_encoding)-1); } } else if (strncmp("embed-image", option + 1, 7) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing image for -embded-image"); rc = 1; goto ExitProcessing; } add_embed_image_to_attachment_list(argv[i]); /* TODO */ } } break; } case 'f': { if (strncmp("from",option+1,1) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing From address/es"); rc = 1; goto ExitProcessing; } from=argv[i]; } } break; } case 'x': { if (strncmp("xforce",option+1,1) == 0) { if (*option == '-') { g_force = MUTILS_TRUE; } } break; } case 'h': { if (strncmp("help",option+1,1) == 0) { usage(); rc = 0; goto ExitProcessing; } /* won't be here */ break; } case 'i': { if (strncmp("info",option+1,2) == 0) { smtp_info=1; } break; } case 'l': { if (strncmp("list_address",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing address list file"); rc = 1; goto ExitProcessing; } address_file=argv[i]; } } if (strncmp("log",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing address log file"); rc = 1; goto ExitProcessing; } g_log_fp = fopen(argv[i], "a"); if (g_log_fp == NULL) { errorMsg("Could not open log file %s for writing (%s)", argv[i], strerror(errno)); rc = 1; goto ExitProcessing; } /* ** tell msock lib to write error message to log file */ msock_set_logfp(g_log_fp); mutilsSafeStrcpy(g_log_file,argv[i],sizeof(g_log_file)-1); } } break; } case 'p': { if (strncmp("port",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing SMTP Port with -port"); rc = 1; goto ExitProcessing; } port=atoi(argv[i]); } } else if (strncmp("pass",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing password with -pass"); rc = 1; goto ExitProcessing; } (void) snprintf(g_userpass,sizeof(g_userpass)-1, "%s",argv[i]); } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'H': { if (strncmp("Header",option+1,1) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing custom header"); rc = 1; goto ExitProcessing; } custom_header=argv[i]; add_customer_header_to_list(custom_header); } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'M': { if (strncmp("Message",option+1,1) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing text message"); rc = 1; goto ExitProcessing; } the_msg=xStrdup(argv[i]); add_oneline_to_attachment_list(the_msg); } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'm': { if (strncmp("mime-type",option+1,9) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing mime type"); rc = 1; goto ExitProcessing; } mutilsSafeStrcpy(g_mime_type,argv[i],sizeof(g_mime_type)-1); } } else if (strncmp("msg-body",option+1,5) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing path of message body file"); rc = 1; goto ExitProcessing; } msg_body_file = argv[i]; add_msg_body_to_attachment_list(argv[i]); } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'n': { if (strncmp("name",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing Name with -n"); rc = 1; goto ExitProcessing; } (void) snprintf(g_from_name,sizeof(g_from_name)-1, "%s",argv[i]); } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 's': { if (strncmp("smtp",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing smtp server"); rc = 1; goto ExitProcessing; } smtp_server=argv[i]; } } else if (strncmp("subject",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing subject with -sub"); rc = 1; goto ExitProcessing; } sub=argv[i]; } } else if (strncmp("ssl", option + 1, 3) == 0) { #ifdef HAVE_OPENSSL g_do_ssl=1; #else (void) fprintf(stderr,"Error: '-ssl' not available, not compiled with OpenSSL\n"); rc = 1; goto ExitProcessing; #endif /* HAVE_OPENSSL */ } else if (strncmp("starttls",option+1,3) == 0) { #ifdef HAVE_OPENSSL g_do_starttls=1; #else (void) fprintf(stderr,"Error: '-starttls' not available, not compiled with OpenSSL\n"); rc = 1; goto ExitProcessing; #endif /* HAVE_OPENSSL */ } else if (strncmp("show-attach", option + 1, 9) == 0) { g_show_attachment_in_log = 1; } else if (strncmp("show-mime-types",option+1,9) == 0) { show_mime_types(); rc = 0; goto ExitProcessing; } else if (strncmp("separator", option + 1, 4) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing separator"); rc = 1; goto ExitProcessing; } (void) snprintf(g_attach_sep,sizeof(g_attach_sep)-1,"%s",argv[i]); if (strlen(g_attach_sep) != 1) { errorMsg("Invalid separator character specified"); rc = 1; goto ExitProcessing; } } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'u': { if (strncmp("user",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) { errorMsg("Missing smtp server"); rc = 1; goto ExitProcessing; } (void) snprintf(g_username,sizeof(g_username)-1, "%s",argv[i]); } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'v': { if (strncmp("verbose",option+1,1) == 0) { if (*option == '-') { g_verbose=1; msock_set_debug(g_verbose); } } break; } case 'q': { if (strncmp("quiet",option+1,1) == 0) { if (*option == '-') { g_quiet=1; } } break; } case 'V': { (void) fprintf(stderr,"mailsend Version: %.1024s\n",MAILSEND_VERSION); #ifdef HAVE_OPENSSL (void) fprintf(stderr,"Compiled with OpenSSL: %s\n", SSLeay_version(SSLEAY_VERSION)); #else (void) fprintf(stderr,"Not Compiled OpenSSL, some auth methods will be unavailable\n"); #endif /* ! HAVE_OPENSSL */ rc = 0; goto ExitProcessing; break; } case 't': { if (strncmp("to",option+1,1) == 0) { if (*option == '-') { i++; if (i == argc) { (void) fprintf(stderr,"Error: missing to addresses\n"); rc = 1; goto ExitProcessing; } to=argv[i]; save_to=mutilsStrdup(to); if (save_to == NULL) { errorMsg("memory allocation problem for -to"); rc = 1; goto ExitProcessing; } save_to=fix_to(save_to); to=fix_to(to); /* collapse all spaces to a comma */ mutilsSpacesToChar(to,','); /* add addresses to a singly linked list */ addAddressToList(to,"To"); /* Note: to is modifed now! */ } } break; } case 'r': { if (strncmp("rrr",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) { (void) fprintf(stderr,"Error: missing to addresses for -rrr\n"); rc = 1; goto ExitProcessing; } rrr=mutilsStrdup(argv[i]); if (rrr == NULL) { errorMsg("memory allocation problem for -rrr"); rc = 1; goto ExitProcessing; } } } else if (strncmp("rt",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) { (void) fprintf(stderr,"Error: missing to addresses for -rt\n"); rc = 1; goto ExitProcessing; } rt=mutilsStrdup(argv[i]); if (rt == NULL) { errorMsg("memory allocation problem for -rt"); rc = 1; goto ExitProcessing; } } } else { errorMsg("Unknown flag: %s\n",option); rc = 1; goto ExitProcessing; } break; } case 'w': { if (strncmp("wait",option+1,1) == 0) { if (*option == '-') { g_wait_for_cr=1; } } break; } default: { (void) fprintf(stderr,"Error: Unrecognized option: %s\n", option); rc = 1; goto ExitProcessing; } } } x=getenv("SMTP_USER_PASS"); y=NULL; if (x && y) { (void) fprintf(stderr,"SMTP_USER_PASS and SMTP_USER_PASS_ENC can not be set. Exiting..\n"); rc = 1; goto ExitProcessing; } if (x) { if (*g_userpass == '\0') { (void) snprintf(g_userpass,sizeof(g_userpass)-1,"%s",x); } } #ifdef HAVE_OPENSSL if (g_do_ssl && g_do_starttls) { (void) fprintf(stderr,"Options -ssl and -starttls are mutually exclusive\n"); rc = 1; goto ExitProcessing; } #endif /* HAVE_OPENSSL */ initialize_openssl(cipher); if (port == -1) port=MAILSEND_SMTP_PORT; if (smtp_info) { if (smtp_server == NULL) smtp_server="localhost"; } if (smtp_info && smtp_server) { if (helo_domain == NULL) helo_domain="localhost"; rc = show_smtp_info(smtp_server,port,helo_domain); if (rc < 0) rc = 1; goto ExitProcessing; } /* print_attachment_list(); print_oneline_attachment_list(); */ /* ** attaching a file or a one line message will make the mail a ** MIME mail */ if (attach_file || the_msg || msg_body_file) { is_mime=1; } if (smtp_server == NULL) { memset(buf,0,sizeof(buf)); x=askFor(buf,sizeof(buf)-1,"SMTP server address/IP: ",EMPTY_NOT_OK); if (x) smtp_server=xStrdup(x); } if (helo_domain == NULL) { /* memset(buf,0,sizeof(buf)); x=askFor(buf,sizeof(buf)-1,"Domain: ",EMPTY_NOT_OK); if (x) helo_domain=xStrdup(x); */ /* use localhost */ helo_domain=xStrdup("localhost"); } if (from == NULL) { memset(buf,0,sizeof(buf)); x=askFor(buf,sizeof(buf)-1,"From: ",EMPTY_NOT_OK); if (x) from=xStrdup(x); } /* if address file specified, add the addresses to the list as well */ if (address_file != NULL) { addAddressesFromFileToList(address_file); printAddressList(); } /* ** The To address must be speicifed, even if the file with the list of ** addresses is specified. The specified To will be shown in the ** envelope. None of the To, Cc and Bcc from the address list file will ** be shown anywhre.. that's how I like it. I hate long To, Cc or Bcc. ** [email protected], Thu Mar 29 11:56:45 EST 2001 */ if (save_to == NULL) { /* don't ask for To add addresses are specified with -l file */ if (getAddressList() == NULL) { memset(buf,0,sizeof(buf)); x=askFor(buf,sizeof(buf)-1,"To: ",EMPTY_NOT_OK); if (x) { save_to=xStrdup(x); addAddressToList(x,"To"); } } } /* ** if msg file specified, dont ask for unneeded things, as it could ** be used from other programs, and it will wait for input ** [email protected] Tue Apr 10 18:02:12 EST 2001 */ #ifdef WINNT if (attach_file == NULL && isInConsole(_fileno(stdin))) #else if (attach_file == NULL && isatty(fileno(stdin))) #endif /* WINNT */ { if (save_cc == NULL && !no_cc) { memset(buf,0,sizeof(buf)); x=askFor(buf,sizeof(buf)-1,"Carbon copy: ",EMPTY_OK); if (x) { save_cc=xStrdup(x); addAddressToList(x,"Cc"); } } if (save_bcc == NULL && ! no_bcc) { memset(buf,0,sizeof(buf)); x=askFor(buf,sizeof(buf)-1,"Blind Carbon copy: ",EMPTY_OK); if (x) { save_bcc=xStrdup(x); addAddressToList(x,"BCc"); } } if (sub == NULL) { memset(buf,0,sizeof(buf)); x=askFor(buf,sizeof(buf)-1,"Subject: ",EMPTY_OK); if (x) sub=xStrdup(x); } if (g_do_ssl || g_do_starttls) { if (*g_username == '\0') { memset(buf,0,sizeof(buf)); x=askFor(buf,sizeof(buf)-1,"Auth user: "******"%s",x); } } if (*g_userpass == '\0') { (void) fprintf(stderr,"\nPlease specify auth password with -pass\n"); (void) fprintf(stderr,"Or by environment variable SMTP_USER_PASS\n"); rc = 1; goto ExitProcessing; } } } rc=validateMusts(from,save_to,smtp_server,helo_domain); if (rc != 0) { rc = 1; goto ExitProcessing; } #ifdef UNIX signal(SIGPIPE,SIG_IGN); #endif /* UNIX */ #if 0 { MutilsTime mt; char timebuf[64]; mutils_time_now(&mt); mutils_time_fmt(&mt, timebuf, sizeof(timebuf)); (void) fprintf(stderr,"timebuf: %s\n",timebuf); return 1; } #endif /* 0 */ write_log("mailsend v%s\n",MAILSEND_VERSION); rc=send_the_mail(from,save_to,save_cc,save_bcc,sub,smtp_server,port, helo_domain,attach_file,msg_body_file,the_msg,is_mime,rrr,rt,add_dateh); if (rc == 0) { if (isInteractive()) { if (!g_quiet) { (void) printf("Mail sent successfully\n"); (void) fflush(stdout); } } if (!g_quiet) { write_log("Mail sent successfully\n"); } } else { if (isInteractive()) { (void) printf("Could not send mail\n"); } write_log("Could not send mail\n"); } if (isInteractive()) { if (g_wait_for_cr) { printf("\nPress Enter to Exit: "); x=fgets(buf,sizeof(buf)-1,stdin); } } if (rc != 0) { rc = 1; } ExitProcessing: close_log(); return (rc); }