int netsnmp_sockaddr_in(struct sockaddr_in *addr, const char *inpeername, int remote_port) { char buf[sizeof(int) * 3 + 2]; sprintf(buf, ":%u", remote_port); return netsnmp_sockaddr_in2(addr, inpeername, remote_port ? buf : NULL); }
netsnmp_transport * mei_udp_create_tstring(const char *str, int local, const char *default_target) { struct sockaddr_in addr; if (netsnmp_sockaddr_in2(&addr, str, default_target)) { return mei_udp_transport(&meiDomain, (struct sockaddr_storage*)&addr, local); } else { return NULL; } }
netsnmp_transport * netsnmp_ssh_create_tstring(const char *str, int local, const char *default_target) { struct sockaddr_in addr; if (netsnmp_sockaddr_in2(&addr, str, default_target)) { return netsnmp_ssh_transport(&addr, local); } else { return NULL; } }
int netsnmp_sockaddr_in2(struct sockaddr_in *addr, const char *inpeername, const char *default_target) { int ret; if (addr == NULL) { return 0; } DEBUGMSGTL(("netsnmp_sockaddr_in", "addr %p, inpeername \"%s\", default_target \"%s\"\n", addr, inpeername ? inpeername : "[NIL]", default_target ? default_target : "[NIL]")); memset(addr, 0, sizeof(struct sockaddr_in)); addr->sin_addr.s_addr = htonl(INADDR_ANY); addr->sin_family = AF_INET; addr->sin_port = htons((u_short)SNMP_PORT); { int port = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DEFAULT_PORT); if (port != 0) { addr->sin_port = htons((u_short)port); } else if (default_target != NULL) netsnmp_sockaddr_in2(addr, default_target, NULL); } if (inpeername != NULL && *inpeername != '\0') { const char *host, *port; char *peername = NULL; char *cp; /* * Duplicate the peername because we might want to mank around with * it. */ peername = strdup(inpeername); if (peername == NULL) { return 0; } /* * Try and extract an appended port number. */ cp = strchr(peername, ':'); if (cp != NULL) { *cp = '\0'; port = cp + 1; host = peername; } else { host = NULL; port = peername; } /* * Try to convert the user port specifier */ if (port && *port == '\0') port = NULL; if (port != NULL) { long int l; char* ep; DEBUGMSGTL(("netsnmp_sockaddr_in", "check user service %s\n", port)); l = strtol(port, &ep, 10); if (ep != port && *ep == '\0' && 0 <= l && l <= 0x0ffff) addr->sin_port = htons((u_short)l); else { if (host == NULL) { DEBUGMSGTL(("netsnmp_sockaddr_in", "servname not numeric, " "check if it really is a destination)\n")); host = port; port = NULL; } else { DEBUGMSGTL(("netsnmp_sockaddr_in", "servname not numeric\n")); free(peername); return 0; } } } /* * Try to convert the user host specifier */ if (host && *host == '\0') host = NULL; if (host != NULL) { DEBUGMSGTL(("netsnmp_sockaddr_in", "check destination %s\n", host)); if (strcmp(peername, "255.255.255.255") == 0 ) { /* * The explicit broadcast address hack */ DEBUGMSGTL(("netsnmp_sockaddr_in", "Explicit UDP broadcast\n")); addr->sin_addr.s_addr = INADDR_NONE; } else { ret = netsnmp_gethostbyname_v4(peername, &addr->sin_addr.s_addr); if (ret < 0) { DEBUGMSGTL(("netsnmp_sockaddr_in", "couldn't resolve hostname\n")); free(peername); return 0; } DEBUGMSGTL(("netsnmp_sockaddr_in", "hostname (resolved okay)\n")); } } free(peername); } /* * Finished */ DEBUGMSGTL(("netsnmp_sockaddr_in", "return { AF_INET, %s:%hu }\n", inet_ntoa(addr->sin_addr), ntohs(addr->sin_port))); return 1; }