snmp_parse_args.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:24k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * snmp_parse_args.c
  3.  */
  4. /* Portions of this file are subject to the following copyright(s).  See
  5.  * the Net-SNMP's COPYING file for more details and other copyrights
  6.  * that may apply:
  7.  */
  8. /*
  9.  * Portions of this file are copyrighted by:
  10.  * Copyright @ 2003 Sun Microsystems, Inc. All rights reserved.
  11.  * Use is subject to license terms specified in the COPYING file
  12.  * distributed with the Net-SNMP package.
  13.  */
  14. #include <net-snmp/net-snmp-config.h>
  15. #if HAVE_STDLIB_H
  16. #include <stdlib.h>
  17. #endif
  18. #if HAVE_UNISTD_H
  19. #include <unistd.h>
  20. #endif
  21. #if HAVE_STRING_H
  22. #include <string.h>
  23. #else
  24. #include <strings.h>
  25. #endif
  26. #include <sys/types.h>
  27. #include <stdio.h>
  28. #if HAVE_UNISTD_H
  29. #include <unistd.h>
  30. #endif
  31. #include <ctype.h>
  32. #if HAVE_NETINET_IN_H
  33. #include <netinet/in.h>
  34. #endif
  35. #if TIME_WITH_SYS_TIME
  36. # ifdef WIN32
  37. #  include <sys/timeb.h>
  38. # else
  39. #  include <sys/time.h>
  40. # endif
  41. # include <time.h>
  42. #else
  43. # if HAVE_SYS_TIME_H
  44. #  include <sys/time.h>
  45. # else
  46. #  include <time.h>
  47. # endif
  48. #endif
  49. #if HAVE_SYS_SELECT_H
  50. #include <sys/select.h>
  51. #endif
  52. #if HAVE_WINSOCK_H
  53. #include <winsock.h>
  54. #endif
  55. #if HAVE_NETDB_H
  56. #include <netdb.h>
  57. #endif
  58. #if HAVE_ARPA_INET_H
  59. #include <arpa/inet.h>
  60. #endif
  61. #include <net-snmp/types.h>
  62. #include <net-snmp/output_api.h>
  63. #include <net-snmp/config_api.h>
  64. #include <net-snmp/library/snmp_parse_args.h>   /* for "internal" definitions */
  65. #include <net-snmp/utilities.h>
  66. #include <net-snmp/library/snmp_api.h>
  67. #include <net-snmp/library/snmp_client.h>
  68. #include <net-snmp/library/mib.h>
  69. #include <net-snmp/library/scapi.h>
  70. #include <net-snmp/library/keytools.h>
  71. #include <net-snmp/version.h>
  72. #include <net-snmp/library/parse.h>
  73. #include <net-snmp/library/snmpv3.h>
  74. #include <net-snmp/library/transform_oids.h>
  75. int             random_access = 0;
  76. void
  77. snmp_parse_args_usage(FILE * outf)
  78. {
  79.     fprintf(outf, "[OPTIONS] AGENT");
  80. }
  81. void
  82. snmp_parse_args_descriptions(FILE * outf)
  83. {
  84.     fprintf(outf, "  Version:  %sn", netsnmp_get_version());
  85.     fprintf(outf, "  Web:      http://www.net-snmp.org/n");
  86.     fprintf(outf,
  87.             "  Email:    net-snmp-coders@lists.sourceforge.netnnOPTIONS:n");
  88.     fprintf(outf, "  -h, --helpttdisplay this help messagen");
  89.     fprintf(outf,
  90.             "  -Htttdisplay configuration file directives understoodn");
  91.     fprintf(outf, "  -v 1|2c|3ttspecifies SNMP version to usen");
  92.     fprintf(outf, "  -V, --versionttdisplay package version numbern");
  93. #if !defined(DISABLE_SNMPV1) || !defined(DISABLE_SNMPV2C)
  94.     fprintf(outf, "SNMP Version 1 or 2c specificn");
  95.     fprintf(outf, "  -c COMMUNITYttset the community stringn");
  96. #endif /* support for community based SNMP */
  97.     fprintf(outf, "SNMP Version 3 specificn");
  98.     fprintf(outf,
  99.             "  -a PROTOCOLttset authentication protocol (MD5|SHA)n");
  100.     fprintf(outf,
  101.             "  -A PASSPHRASEttset authentication protocol pass phrasen");
  102.     fprintf(outf,
  103.             "  -e ENGINE-IDttset security engine ID (e.g. 800000020109840301)n");
  104.     fprintf(outf,
  105.             "  -E ENGINE-IDttset context engine ID (e.g. 800000020109840301)n");
  106.     fprintf(outf,
  107.             "  -l LEVELttset security level (noAuthNoPriv|authNoPriv|authPriv)n");
  108.     fprintf(outf, "  -n CONTEXTttset context name (e.g. bridge1)n");
  109.     fprintf(outf, "  -u USER-NAMEttset security name (e.g. bert)n");
  110. #ifdef HAVE_AES
  111.     fprintf(outf, "  -x PROTOCOLttset privacy protocol (DES|AES)n");
  112. #else
  113.     fprintf(outf, "  -x PROTOCOLttset privacy protocol (DES)n");
  114. #endif
  115.     fprintf(outf, "  -X PASSPHRASEttset privacy protocol pass phrasen");
  116.     fprintf(outf,
  117.             "  -Z BOOTS,TIMEttset destination engine boots/timen");
  118.     fprintf(outf, "General communication optionsn");
  119.     fprintf(outf, "  -r RETRIESttset the number of retriesn");
  120.     fprintf(outf,
  121.             "  -t TIMEOUTttset the request timeout (in seconds)n");
  122.     fprintf(outf, "Debuggingn");
  123.     fprintf(outf, "  -dtttdump input/output packets in hexadecimaln");
  124.     fprintf(outf,
  125.             "  -D TOKEN[,...]tturn on debugging output for the specified TOKENsnttt   (ALL gives extremely verbose debugging output)n");
  126.     fprintf(outf, "General optionsn");
  127.     fprintf(outf,
  128.             "  -m MIB[:...]ttload given list of MIBs (ALL loads everything)n");
  129.     fprintf(outf,
  130.             "  -M DIR[:...]ttlook in given list of directories for MIBsn");
  131. #ifndef DISABLE_MIB_LOADING
  132.     fprintf(outf,
  133.             "  -P MIBOPTSttToggle various defaults controlling MIB parsing:n");
  134.     snmp_mib_toggle_options_usage("ttt  ", outf);
  135. #endif
  136.     fprintf(outf,
  137.             "  -O OUTOPTSttToggle various defaults controlling output display:n");
  138.     snmp_out_toggle_options_usage("ttt  ", outf);
  139.     fprintf(outf,
  140.             "  -I INOPTSttToggle various defaults controlling input parsing:n");
  141.     snmp_in_toggle_options_usage("ttt  ", outf);
  142.     fprintf(outf,
  143.             "  -L LOGOPTSttToggle various defaults controlling logging:n");
  144.     snmp_log_options_usage("ttt  ", outf);
  145.     fflush(outf);
  146. }
  147. #define BUF_SIZE 512
  148. void
  149. handle_long_opt(const char *myoptarg)
  150. {
  151.     char           *cp, *cp2;
  152.     /*
  153.      * else it's a long option, so process it like name=value 
  154.      */
  155.     cp = malloc(strlen(myoptarg) + 3);
  156.     if (!cp)
  157.         return;
  158.     strcpy(cp, myoptarg);
  159.     cp2 = strchr(cp, '=');
  160.     if (!cp2 && !strchr(cp, ' ')) {
  161.         /*
  162.          * well, they didn't specify an argument as far as we
  163.          * can tell.  Give them a '1' as the argument (which
  164.          * works for boolean tokens and a few others) and let
  165.          * them suffer from there if it's not what they
  166.          * wanted 
  167.          */
  168.         strcat(cp, " 1");
  169.     } else {
  170.         /*
  171.          * replace the '=' with a ' ' 
  172.          */
  173.         if (cp2)
  174.             *cp2 = ' ';
  175.     }
  176.     netsnmp_config(cp);
  177.     free(cp);
  178. }
  179. extern int      snmpv3_options(char *optarg, netsnmp_session * session,
  180.                                char **Apsz, char **Xpsz, int argc,
  181.                                char *const *argv);
  182. /*
  183.  * This method does the real work for snmp_parse_args.  It takes an
  184.  * extra argument, proxy, and uses this to decide how to handle the lack of
  185.  * of a community string.
  186.  */
  187. int
  188. snmp_parse_args(int argc,
  189.                 char **argv,
  190.                 netsnmp_session * session, const char *localOpts,
  191.                 void (*proc) (int, char *const *, int))
  192. {
  193.     static char    *sensitive[4] = { NULL, NULL, NULL, NULL };
  194.     int             arg, sp = 0, zero_sensitive = 1, testcase = 0;
  195.     char           *cp;
  196.     char           *Apsz = NULL;
  197.     char           *Xpsz = NULL;
  198.     char           *Cpsz = NULL;
  199.     char            Opts[BUF_SIZE];
  200.     int             logopt = 0;
  201.     /*
  202.      * initialize session to default values 
  203.      */
  204.     snmp_sess_init(session);
  205.     strcpy(Opts, "Y:VhHm:M:O:I:P:D:dv:r:t:c:Z:e:E:n:u:l:x:X:a:A:p:T:-:3:s:S:L:");
  206.     if (localOpts)
  207.         strcat(Opts, localOpts);
  208.     if (strcmp(argv[0], "snmpd-trapsess") == 0 ||
  209. strcmp(argv[0], "snmpd-proxy")    == 0) {
  210. /*  Don't worry about zeroing sensitive parameters as they are not
  211.     on the command line anyway (called from internal config-line
  212.     handler).  */
  213. zero_sensitive = 0;
  214.     }
  215.     /*
  216.      * get the options 
  217.      */
  218.     DEBUGMSGTL(("snmp_parse_args", "starting: %d/%dn", optind, argc));
  219.     for (arg = 0; arg < argc; arg++) {
  220.         DEBUGMSGTL(("snmp_parse_args", " arg %d = %sn", arg, argv[arg]));
  221.     }
  222.     optind = 1;
  223.     while ((arg = getopt(argc, argv, Opts)) != EOF) {
  224.         DEBUGMSGTL(("snmp_parse_args", "handling (#%d): %cn", optind, arg));
  225.         switch (arg) {
  226.         case '-':
  227.             if (strcasecmp(optarg, "help") == 0) {
  228.                 return (-1);
  229.             }
  230.             if (strcasecmp(optarg, "version") == 0) {
  231.                 fprintf(stderr,"NET-SNMP version: %sn",netsnmp_get_version());
  232.                 return (-2);
  233.             }
  234.             handle_long_opt(optarg);
  235.             break;
  236.         case 'V':
  237.             fprintf(stderr, "NET-SNMP version: %sn", netsnmp_get_version());
  238.             return (-2);
  239.         case 'h':
  240.             return (-1);
  241.             break;
  242.         case 'H':
  243.             init_snmp("snmpapp");
  244.             fprintf(stderr, "Configuration directives understood:n");
  245.             read_config_print_usage("  ");
  246.             return (-2);
  247.         case 'Y':
  248.             netsnmp_config_remember(optarg);
  249.             break;
  250. #ifndef DISABLE_MIB_LOADING
  251.         case 'm':
  252.             setenv("MIBS", optarg, 1);
  253.             break;
  254.         case 'M':
  255.             netsnmp_set_mib_directory(optarg);
  256.             break;
  257. #endif /* DISABLE_MIB_LOADING */
  258.         case 'O':
  259.             cp = snmp_out_toggle_options(optarg);
  260.             if (cp != NULL) {
  261.                 fprintf(stderr, "Unknown output option passed to -O: %c.n", 
  262. *cp);
  263.                 return (-1);
  264.             }
  265.             break;
  266.         case 'I':
  267.             cp = snmp_in_options(optarg, argc, argv);
  268.             if (cp != NULL) {
  269.                 fprintf(stderr, "Unknown input option passed to -I: %c.n",
  270. *cp);
  271.                 return (-1);
  272.             }
  273.             break;
  274. #ifndef DISABLE_MIB_LOADING
  275.         case 'P':
  276.             cp = snmp_mib_toggle_options(optarg);
  277.             if (cp != NULL) {
  278.                 fprintf(stderr,
  279.                         "Unknown parsing option passed to -P: %c.n", *cp);
  280.                 return (-1);
  281.             }
  282.             break;
  283. #endif /* DISABLE_MIB_LOADING */
  284.         case 'D':
  285.             debug_register_tokens(optarg);
  286.             snmp_set_do_debugging(1);
  287.             break;
  288.         case 'd':
  289.             netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
  290.    NETSNMP_DS_LIB_DUMP_PACKET, 1);
  291.             break;
  292.         case 'v':
  293.             session->version = -1;
  294. #ifndef DISABLE_SNMPV1
  295.             if (!strcmp(optarg, "1")) {
  296.                 session->version = SNMP_VERSION_1;
  297.             }
  298. #endif
  299. #ifndef DISABLE_SNMPV2C
  300.             if (!strcasecmp(optarg, "2c")) {
  301.                 session->version = SNMP_VERSION_2c;
  302.             }
  303. #endif
  304.             if (!strcasecmp(optarg, "3")) {
  305.                 session->version = SNMP_VERSION_3;
  306.             }
  307.             if (session->version == -1) {
  308.                 fprintf(stderr,
  309.                         "Invalid version specified after -v flag: %sn",
  310.                         optarg);
  311.                 return (-1);
  312.             }
  313.             break;
  314.         case 'p':
  315.             fprintf(stderr, "Warning: -p option is no longer used - ");
  316.             fprintf(stderr, "specify the remote host as HOST:PORTn");
  317.             return (-1);
  318.             break;
  319.         case 'T':
  320.             fprintf(stderr, "Warning: -T option is no longer used - ");
  321.             fprintf(stderr, "specify the remote host as TRANSPORT:HOSTn");
  322.             return (-1);
  323.             break;
  324.         case 't':
  325.             session->timeout = atoi(optarg) * 1000000L;
  326.             if (session->timeout < 0 || !isdigit(optarg[0])) {
  327.                 fprintf(stderr, "Invalid timeout in seconds after -t flag.n");
  328.                 return (-1);
  329.             }
  330.             break;
  331.         case 'r':
  332.             session->retries = atoi(optarg);
  333.             if (session->retries < 0 || !isdigit(optarg[0])) {
  334.                 fprintf(stderr, "Invalid number of retries after -r flag.n");
  335.                 return (-1);
  336.             }
  337.             break;
  338.         case 'c':
  339.     if (zero_sensitive) {
  340. if ((sensitive[sp] = strdup(optarg)) != NULL) {
  341.     Cpsz = sensitive[sp];
  342.     memset(optarg, '', strlen(optarg));
  343.     sp++;
  344. } else {
  345.     fprintf(stderr, "malloc failure processing -c flag.n");
  346.     return -1;
  347. }
  348.     } else {
  349. Cpsz = optarg;
  350.     }
  351.             break;
  352.         case '3':
  353.     /*  TODO: This needs to zero things too.  */
  354.             if (snmpv3_options(optarg, session, &Apsz, &Xpsz, argc, argv) < 0){
  355.                 return (-1);
  356.             }
  357.             break;
  358.         case 'L':
  359.             if (snmp_log_options(optarg, argc, argv) < 0) {
  360.                 return (-1);
  361.             }
  362.     logopt = 1;
  363.             break;
  364. #define SNMPV3_CMD_OPTIONS
  365. #ifdef  SNMPV3_CMD_OPTIONS
  366.         case 'Z':
  367.             session->engineBoots = strtoul(optarg, NULL, 10);
  368.             if (session->engineBoots == 0 || !isdigit(optarg[0])) {
  369.                 fprintf(stderr, "Need engine boots value after -Z flag.n");
  370.                 return (-1);
  371.             }
  372.             cp = strchr(optarg, ',');
  373.             if (cp && *(++cp) && isdigit(*cp))
  374.                 session->engineTime = strtoul(cp, NULL, 10);
  375.             /*
  376.              * Handle previous '-Z boot time' syntax 
  377.              */
  378.             else if ((optind < argc) && isdigit(argv[optind][0]))
  379.                 session->engineTime = strtoul(argv[optind], NULL, 10);
  380.             else {
  381.                 fprintf(stderr, "Need engine time value after -Z flag.n");
  382.                 return (-1);
  383.             }
  384.             break;
  385.         case 'e':{
  386.                 size_t ebuf_len = 32, eout_len = 0;
  387.                 u_char *ebuf = (u_char *)malloc(ebuf_len);
  388.                 if (ebuf == NULL) {
  389.                     fprintf(stderr, "malloc failure processing -e flag.n");
  390.                     return (-1);
  391.                 }
  392.                 if (!snmp_hex_to_binary
  393.                     (&ebuf, &ebuf_len, &eout_len, 1, optarg)) {
  394.                     fprintf(stderr, "Bad engine ID value after -e flag.n");
  395.                     free(ebuf);
  396.                     return (-1);
  397.                 }
  398.                 session->securityEngineID = ebuf;
  399.                 session->securityEngineIDLen = eout_len;
  400.                 break;
  401.             }
  402.         case 'E':{
  403.                 size_t ebuf_len = 32, eout_len = 0;
  404.                 u_char *ebuf = (u_char *)malloc(ebuf_len);
  405.                 if (ebuf == NULL) {
  406.                     fprintf(stderr, "malloc failure processing -E flag.n");
  407.                     return (-1);
  408.                 }
  409.                 if (!snmp_hex_to_binary(&ebuf, &ebuf_len,
  410. &eout_len, 1, optarg)) {
  411.                     fprintf(stderr, "Bad engine ID value after -E flag.n");
  412.                     free(ebuf);
  413.                     return (-1);
  414.                 }
  415.                 session->contextEngineID = ebuf;
  416.                 session->contextEngineIDLen = eout_len;
  417.                 break;
  418.             }
  419.         case 'n':
  420.             session->contextName = optarg;
  421.             session->contextNameLen = strlen(optarg);
  422.             break;
  423.         case 'u':
  424.     if (zero_sensitive) {
  425. if ((sensitive[sp] = strdup(optarg)) != NULL) {
  426.     session->securityName = sensitive[sp];
  427.     session->securityNameLen = strlen(sensitive[sp]);
  428.     memset(optarg, '', strlen(optarg));
  429.     sp++;
  430. } else {
  431.     fprintf(stderr, "malloc failure processing -u flag.n");
  432.     return -1;
  433. }
  434.     } else {
  435. session->securityName = optarg;
  436. session->securityNameLen = strlen(optarg);
  437.     }
  438.             break;
  439.         case 'l':
  440.             if (!strcasecmp(optarg, "noAuthNoPriv") || !strcmp(optarg, "1")
  441.                 || !strcasecmp(optarg, "noauth")
  442.                 || !strcasecmp(optarg, "nanp")) {
  443.                 session->securityLevel = SNMP_SEC_LEVEL_NOAUTH;
  444.             } else if (!strcasecmp(optarg, "authNoPriv")
  445.                        || !strcmp(optarg, "2")
  446.                        || !strcasecmp(optarg, "auth")
  447.                        || !strcasecmp(optarg, "anp")) {
  448.                 session->securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV;
  449.             } else if (!strcasecmp(optarg, "authPriv")
  450.                        || !strcmp(optarg, "3")
  451.                        || !strcasecmp(optarg, "priv")
  452.                        || !strcasecmp(optarg, "ap")) {
  453.                 session->securityLevel = SNMP_SEC_LEVEL_AUTHPRIV;
  454.             } else {
  455.                 fprintf(stderr,
  456.                         "Invalid security level specified after -l flag: %sn",
  457.                         optarg);
  458.                 return (-1);
  459.             }
  460.             break;
  461.         case 'a':
  462. #ifndef DISABLE_MD5
  463.             if (!strcasecmp(optarg, "MD5")) {
  464.                 session->securityAuthProto = usmHMACMD5AuthProtocol;
  465.                 session->securityAuthProtoLen = USM_AUTH_PROTO_MD5_LEN;
  466.             } else
  467. #endif
  468.                 if (!strcasecmp(optarg, "SHA")) {
  469.                 session->securityAuthProto = usmHMACSHA1AuthProtocol;
  470.                 session->securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN;
  471.             } else {
  472.                 fprintf(stderr,
  473.                         "Invalid authentication protocol specified after -a flag: %sn",
  474.                         optarg);
  475.                 return (-1);
  476.             }
  477.             break;
  478.         case 'x':
  479.             testcase = 0;
  480. #ifndef DISABLE_DES
  481.             if (!strcasecmp(optarg, "DES")) {
  482.                 testcase = 1;
  483.                 session->securityPrivProto = usmDESPrivProtocol;
  484.                 session->securityPrivProtoLen = USM_PRIV_PROTO_DES_LEN;
  485.             }
  486. #endif
  487. #ifdef HAVE_AES
  488.             if (!strcasecmp(optarg, "AES128") ||
  489.                 !strcasecmp(optarg, "AES")) {
  490.                 testcase = 1;
  491.                 session->securityPrivProto = usmAESPrivProtocol;
  492.                 session->securityPrivProtoLen = USM_PRIV_PROTO_AES_LEN;
  493.             }
  494. #endif
  495.             if (testcase == 0) {
  496.                 fprintf(stderr,
  497.                       "Invalid privacy protocol specified after -x flag: %sn",
  498.                         optarg);
  499.                 return (-1);
  500.             }
  501.             break;
  502.         case 'A':
  503.     if (zero_sensitive) {
  504. if ((sensitive[sp] = strdup(optarg)) != NULL) {
  505.     Apsz = sensitive[sp];
  506.     memset(optarg, '', strlen(optarg));
  507.     sp++;
  508. } else {
  509.     fprintf(stderr, "malloc failure processing -A flag.n");
  510.     return -1;
  511. }
  512.     } else {
  513. Apsz = optarg;
  514.     }
  515.             break;
  516.         case 'X':
  517.     if (zero_sensitive) {
  518. if ((sensitive[sp] = strdup(optarg)) != NULL) {
  519.     Xpsz = sensitive[sp];
  520.     memset(optarg, '', strlen(optarg));
  521.     sp++;
  522. } else {
  523.     fprintf(stderr, "malloc failure processing -X flag.n");
  524.     return -1;
  525. }
  526.     } else {
  527. Xpsz = optarg;
  528.     }
  529.             break;
  530. #endif                          /* SNMPV3_CMD_OPTIONS */
  531.         case '?':
  532.             return (-1);
  533.             break;
  534.         default:
  535.             proc(argc, argv, arg);
  536.             break;
  537.         }
  538.     }
  539.     DEBUGMSGTL(("snmp_parse_args", "finished: %d/%dn", optind, argc));
  540.     
  541.     if (!logopt)
  542. snmp_enable_stderrlog();
  543.     /*
  544.      * read in MIB database and initialize the snmp library
  545.      */
  546.     init_snmp("snmpapp");
  547.     /*
  548.      * session default version 
  549.      */
  550.     if (session->version == SNMP_DEFAULT_VERSION) {
  551.         /*
  552.          * run time default version 
  553.          */
  554.         session->version = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, 
  555.       NETSNMP_DS_LIB_SNMPVERSION);
  556.         /*
  557.          * compile time default version 
  558.          */
  559.         if (!session->version) {
  560.             switch (DEFAULT_SNMP_VERSION) {
  561. #ifndef DISABLE_SNMPV1
  562.             case 1:
  563.                 session->version = SNMP_VERSION_1;
  564.                 break;
  565. #endif
  566. #ifndef DISABLE_SNMPV2C
  567.             case 2:
  568.                 session->version = SNMP_VERSION_2c;
  569.                 break;
  570. #endif
  571.             case 3:
  572.                 session->version = SNMP_VERSION_3;
  573.                 break;
  574.             default:
  575.                 snmp_log(LOG_ERR, "Can't determine a valid SNMP version for the sessionn");
  576.                 return(-2);
  577.             }
  578.         } else {
  579. #ifndef DISABLE_SNMPV1
  580.             if (session->version == NETSNMP_DS_SNMP_VERSION_1)  /* bogus value.  version 1 actually = 0 */
  581.                 session->version = SNMP_VERSION_1;
  582. #endif
  583.         }
  584.     }
  585.     /*
  586.      * make master key from pass phrases 
  587.      */
  588.     if (Apsz) {
  589.         session->securityAuthKeyLen = USM_AUTH_KU_LEN;
  590.         if (session->securityAuthProto == NULL) {
  591.             /*
  592.              * get .conf set default 
  593.              */
  594.             const oid      *def =
  595.                 get_default_authtype(&session->securityAuthProtoLen);
  596.             session->securityAuthProto =
  597.                 snmp_duplicate_objid(def, session->securityAuthProtoLen);
  598.         }
  599.         if (session->securityAuthProto == NULL) {
  600. #ifndef DISABLE_MD5
  601.             /*
  602.              * assume MD5
  603.              */
  604.             session->securityAuthProto =
  605.                 snmp_duplicate_objid(usmHMACMD5AuthProtocol,
  606.                                      USM_AUTH_PROTO_MD5_LEN);
  607.             session->securityAuthProtoLen = USM_AUTH_PROTO_MD5_LEN;
  608. #else
  609.             session->securityAuthProto =
  610.                 snmp_duplicate_objid(usmHMACSHA1AuthProtocol,
  611.                                      USM_AUTH_PROTO_SHA_LEN);
  612.             session->securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN;
  613. #endif
  614.         }
  615.         if (generate_Ku(session->securityAuthProto,
  616.                         session->securityAuthProtoLen,
  617.                         (u_char *) Apsz, strlen(Apsz),
  618.                         session->securityAuthKey,
  619.                         &session->securityAuthKeyLen) != SNMPERR_SUCCESS) {
  620.             snmp_perror(argv[0]);
  621.             fprintf(stderr,
  622.                     "Error generating a key (Ku) from the supplied authentication pass phrase. n");
  623.             return (-2);
  624.         }
  625.     }
  626.     if (Xpsz) {
  627.         session->securityPrivKeyLen = USM_PRIV_KU_LEN;
  628.         if (session->securityPrivProto == NULL) {
  629.             /*
  630.              * get .conf set default 
  631.              */
  632.             const oid      *def =
  633.                 get_default_privtype(&session->securityPrivProtoLen);
  634.             session->securityPrivProto =
  635.                 snmp_duplicate_objid(def, session->securityPrivProtoLen);
  636.         }
  637.         if (session->securityPrivProto == NULL) {
  638.             /*
  639.              * assume DES 
  640.              */
  641. #ifndef DISABLE_DES
  642.             session->securityPrivProto =
  643.                 snmp_duplicate_objid(usmDESPrivProtocol,
  644.                                      USM_PRIV_PROTO_DES_LEN);
  645.             session->securityPrivProtoLen = USM_PRIV_PROTO_DES_LEN;
  646. #else
  647.             session->securityPrivProto =
  648.                 snmp_duplicate_objid(usmAESPrivProtocol,
  649.                                      USM_PRIV_PROTO_AES_LEN);
  650.             session->securityPrivProtoLen = USM_PRIV_PROTO_AES_LEN;
  651. #endif
  652.         }
  653.         if (generate_Ku(session->securityAuthProto,
  654.                         session->securityAuthProtoLen,
  655.                         (u_char *) Xpsz, strlen(Xpsz),
  656.                         session->securityPrivKey,
  657.                         &session->securityPrivKeyLen) != SNMPERR_SUCCESS) {
  658.             snmp_perror(argv[0]);
  659.             fprintf(stderr,
  660.                     "Error generating a key (Ku) from the supplied privacy pass phrase. n");
  661.             return (-2);
  662.         }
  663.     }
  664.     /*
  665.      * get the hostname 
  666.      */
  667.     if (optind == argc) {
  668.         fprintf(stderr, "No hostname specified.n");
  669.         return (-1);
  670.     }
  671.     session->peername = argv[optind++]; /* hostname */
  672. #if !defined(DISABLE_SNMPV1) || !defined(DISABLE_SNMPV2C)
  673.     /*
  674.      * If v1 or v2c, check community has been set, either by a -c option above,
  675.      * or via a default token somewhere.  
  676.      * If neither, it will be taken from the incoming request PDU.
  677.      */
  678.     if (session->version == SNMP_VERSION_1 ||
  679. session->version == SNMP_VERSION_2c) {
  680.         if (Cpsz == NULL) {
  681.             Cpsz = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 
  682.  NETSNMP_DS_LIB_COMMUNITY);
  683.     if (Cpsz == NULL) {
  684.                 if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID,
  685.                                            NETSNMP_DS_LIB_IGNORE_NO_COMMUNITY)){
  686.                     DEBUGMSGTL(("snmp_parse_args",
  687.                                 "ignoring that the community string is not presentn"));
  688.                     session->community = NULL;
  689.                     session->community_len = 0;
  690.                 } else {
  691.                     fprintf(stderr, "No community name specified.n");
  692.                     return (-1);
  693.                 }
  694.     }
  695. } else {
  696.             session->community = (unsigned char *)Cpsz;
  697.             session->community_len = strlen(Cpsz);
  698.         }
  699.     }
  700. #endif /* support for community based SNMP */
  701.     return optind;
  702. }