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