int parseMyProxyArgument (const char * arg, char * & user, char * & host, int & port) { MyString strArg (arg); int at_idx = strArg.FindChar ((int)'@'); int colon_idx = strArg.FindChar ((int)':', at_idx+1); if (at_idx != -1) { MyString _user = strArg.Substr (0, at_idx-1); user = strdup(_user.Value()); } if (colon_idx == -1) { MyString _host = strArg.Substr (at_idx+1, strArg.Length()-1); host = strdup(_host.Value()); } else { MyString _host = strArg.Substr (at_idx+1, colon_idx-1); host = strdup(_host.Value()); MyString _port = strArg.Substr (colon_idx+1, strArg.Length()-1); port = atoi(_port.Value()); } return TRUE; }
MyString MyString::EscapeChars(const MyString& Q, const char escape) const { // create a result string. may as well reserve the length to // begin with so we don't recopy the string for EVERY character. // this algorithm WILL recopy the string for each char that ends // up being escaped. MyString S; S.reserve(Len); // go through each char in this string for (int i = 0; i < Len; i++) { // if it is in the set of chars to escape, // drop an escape onto the end of the result if (Q.FindChar(Data[i]) >= 0) { // this character needs escaping S += escape; } // put this char into the result S += Data[i]; } // thats it! return S; }
int Job::declare_file(const MyString &name, filesize_t size, CondorError &errstack) { JobFile *ignored; JobFile jobFile; jobFile.size = size; jobFile.currentOffset = 0; jobFile.name = name; jobFile.file = safe_open_wrapper_follow((spoolDirectory + DIR_DELIM_STRING + jobFile.name).Value(), O_WRONLY | O_CREAT | _O_BINARY, 0600); if (-1 != jobFile.file) { if (0 == declaredFiles.lookup(name, ignored)) { close(jobFile.file); errstack.pushf("SOAP", ALREADYEXISTS, "File '%s' already declared.", name.Value()); return 4; } if (declaredFiles.insert(name, jobFile)) { close(jobFile.file); errstack.pushf("SOAP", FAIL, "Failed to record file '%s'.", name.Value()); return 2; } } else { // If there is a path delimiter in the name we assume that // the client knows what she is doing and will set a // proper Iwd later on. If there is no path delimiter we // have a problem. if (-1 != name.FindChar(DIR_DELIM_CHAR)) { dprintf(D_FULLDEBUG, "Failed to open '%s' for writing, reason: %s\n", (spoolDirectory+DIR_DELIM_STRING+jobFile.name).Value(), strerror(errno)); errstack.pushf("SOAP", FAIL, "Failed to open '%s' for writing, reason: %s", name.Value(), strerror(errno)); return 3; } } return 0; }
MyString get_fqdn_from_hostname(const MyString& hostname) { if (hostname.FindChar('.') != -1) return hostname; MyString ret; if (!nodns_enabled()) { addrinfo_iterator ai; int res = ipv6_getaddrinfo(hostname.Value(), NULL, ai); if (res) { dprintf(D_HOSTNAME, "ipv6_getaddrinfo() could not look up %s: %s (%d)\n", hostname.Value(), gai_strerror(res), res); return ret; } while (addrinfo* info = ai.next()) { if (info->ai_canonname) { if (strchr(info->ai_canonname, '.')) return info->ai_canonname; } } hostent* h = gethostbyname(hostname.Value()); if (h && h->h_name && strchr(h->h_name, '.')) { return h->h_name; } if (h && h->h_aliases && *h->h_aliases) { for (char** alias = h->h_aliases; *alias; ++alias) { if (strchr(*alias, '.')) return *alias; } } } MyString default_domain; if (param(default_domain, "DEFAULT_DOMAIN_NAME")) { ret = hostname; if (ret[ret.Length() - 1] != '.') ret += "."; ret += default_domain; } return ret; }
int get_fqdn_and_ip_from_hostname(const MyString& hostname, MyString& fqdn, condor_sockaddr& addr) { MyString ret; condor_sockaddr ret_addr; bool found_ip = false; // if the hostname contains dot, hostname is assumed to be full hostname if (hostname.FindChar('.') != -1) { ret = hostname; } if (nodns_enabled()) { // if nodns is enabled, convert hostname to ip address directly ret_addr = convert_hostname_to_ipaddr(hostname); found_ip = true; } else { // we look through getaddrinfo and gethostbyname // to further seek fully-qualified domain name and corresponding // ip address addrinfo_iterator ai; int res = ipv6_getaddrinfo(hostname.Value(), NULL, ai); if (res) { dprintf(D_HOSTNAME, "ipv6_getaddrinfo() could not look up %s: %s (%d)\n", hostname.Value(), gai_strerror(res), res); return 0; } while (addrinfo* info = ai.next()) { if (info->ai_canonname) { fqdn = info->ai_canonname; addr = condor_sockaddr(info->ai_addr); return 1; } } hostent* h = gethostbyname(hostname.Value()); if (h && h->h_name && strchr(h->h_name, '.')) { fqdn = h->h_name; addr = condor_sockaddr((sockaddr*)h->h_addr); return 1; } if (h && h->h_aliases && *h->h_aliases) { for (char** alias = h->h_aliases; *alias; ++alias) { if (strchr(*alias, '.')) { fqdn = *alias; addr = condor_sockaddr((sockaddr*)h->h_addr); return 1; } } } } MyString default_domain; // if FQDN is still unresolved, try DEFAULT_DOMAIN_NAME if (ret.Length() == 0 && param(default_domain, "DEFAULT_DOMAIN_NAME")) { ret = hostname; if (ret[ret.Length() - 1] != '.') ret += "."; ret += default_domain; } if (ret.Length() > 0 && found_ip) { fqdn = ret; addr = ret_addr; return 1; } return 0; }
/* This function has a unit test. */ int is_valid_sinful( const char *sinful ) { dprintf(D_HOSTNAME, "Checking if %s is a sinful address\n", sinful); char addrbuf[INET6_ADDRSTRLEN]; const char* acc = sinful; const char* tmp; const char* addr_begin; const char* addr_end; if (!acc) return FALSE; if (*acc != '<') { dprintf(D_HOSTNAME, "%s is not a sinful address: does not begin with \"<\"\n", sinful); return FALSE; } acc++; if (*acc == '[') { dprintf(D_HOSTNAME, "%s is an ipv6 address\n", sinful); tmp = strchr(acc, ']'); if (!tmp) { dprintf(D_HOSTNAME, "%s is not a sinful address: could not find closing \"]\"\n", sinful); return FALSE; } addr_begin = acc + 1; addr_end = tmp; // too long if (addr_end - addr_begin > INET6_ADDRSTRLEN) { dprintf(D_HOSTNAME, "%s is not a sinful address: addr too long %d\n", sinful, (int)(addr_end - addr_begin)); return FALSE; } strncpy(addrbuf, addr_begin, addr_end - addr_begin); addrbuf[addr_end - addr_begin] = '\0'; dprintf(D_HOSTNAME, "tring to convert %s using inet_pton, %s\n", sinful, addrbuf); in6_addr tmp_addr; if (inet_pton(AF_INET6, addrbuf, &tmp_addr) <= 0) { dprintf(D_HOSTNAME, "%s is not a sinful address: inet_pton(AF_INET6, %s) failed\n", sinful, addrbuf); return FALSE; } acc = tmp + 1; } else { MyString ipaddr = acc; int colon_pos = ipaddr.FindChar(':'); if(colon_pos == -1) { return false; } ipaddr.setChar(colon_pos, 0); if( ! is_ipv4_addr_implementation(ipaddr.Value(),NULL,NULL,false) ) { return FALSE; } acc = acc + colon_pos; } if (*acc != ':') { dprintf(D_HOSTNAME, "%s is not a sinful address: no colon found\n", sinful); return FALSE; } tmp = strchr(acc, '>'); if (!tmp) { dprintf(D_HOSTNAME, "%s is not a sinful address: no closing \">\" found\n", sinful); return FALSE; } dprintf(D_HOSTNAME, "%s is a sinful address!\n", sinful); return TRUE; }