/* Build the remote part or the URL from SCHEME, HOST and an optional PORT. Returns an allocated string or NULL on failure and sets ERRNO. */ static char * make_host_part (const char *scheme, const char *host, unsigned short port) { char portstr[10]; char *hostname; char *hostport; /* Map scheme and port. */ if (!strcmp (scheme, "hkps") || !strcmp (scheme,"https")) { scheme = "https"; strcpy (portstr, "443"); } else /* HKP or HTTP. */ { scheme = "http"; strcpy (portstr, "11371"); } if (port) snprintf (portstr, sizeof portstr, "%hu", port); else { /*fixme_do_srv_lookup ()*/ } hostname = map_host (host); if (!hostname) return NULL; hostport = strconcat (scheme, "://", hostname, ":", portstr, NULL); xfree (hostname); return hostport; }
/* Build the remote part of the URL from SCHEME, HOST and an optional PORT. Returns an allocated string at R_HOSTPORT or NULL on failure If R_POOLNAME is not NULL it receives a malloced string with the poolname. */ static gpg_error_t make_host_part (ctrl_t ctrl, const char *scheme, const char *host, unsigned short port, int force_reselect, char **r_hostport, unsigned int *r_httpflags, char **r_poolname) { gpg_error_t err; char portstr[10]; char *hostname; *r_hostport = NULL; portstr[0] = 0; err = map_host (ctrl, host, force_reselect, &hostname, portstr, r_httpflags, r_poolname); if (err) return err; /* Map scheme and port. */ if (!strcmp (scheme, "hkps") || !strcmp (scheme,"https")) { scheme = "https"; if (! *portstr) strcpy (portstr, "443"); } else /* HKP or HTTP. */ { scheme = "http"; if (! *portstr) strcpy (portstr, "11371"); } if (port) snprintf (portstr, sizeof portstr, "%hu", port); else { /*fixme_do_srv_lookup ()*/ } *r_hostport = strconcat (scheme, "://", hostname, ":", portstr, NULL); xfree (hostname); if (!*r_hostport) { if (r_poolname) { xfree (*r_poolname); *r_poolname = NULL; } return gpg_error_from_syserror (); } return 0; }
/* Build the remote part of the URL from SCHEME, HOST and an optional * PORT. If NO_SRV is set no SRV record lookup will be done. Returns * an allocated string at R_HOSTPORT or NULL on failure. If * R_HTTPHOST is not NULL it receives a malloced string with the * hostname; this may be different from HOST if HOST is selected from * a pool. */ static gpg_error_t make_host_part (ctrl_t ctrl, const char *scheme, const char *host, unsigned short port, int force_reselect, int no_srv, char **r_hostport, unsigned int *r_httpflags, char **r_httphost) { gpg_error_t err; const char *srvtag; char portstr[10]; char *hostname; enum ks_protocol protocol; *r_hostport = NULL; if (!strcmp (scheme, "hkps") || !strcmp (scheme,"https")) { scheme = "https"; srvtag = no_srv? NULL : "pgpkey-https"; protocol = KS_PROTOCOL_HKPS; } else /* HKP or HTTP. */ { scheme = "http"; srvtag = no_srv? NULL : "pgpkey-http"; protocol = KS_PROTOCOL_HKP; } portstr[0] = 0; err = map_host (ctrl, host, srvtag, force_reselect, protocol, &hostname, portstr, r_httpflags, r_httphost); if (err) return err; /* If map_host did not return a port (from a SRV record) but a port * has been specified (implicitly or explicitly) then use that port. * In the case that a port was not specified (which is probably a * bug in https.c) we will set up defaults. */ if (*portstr) ; else if (!*portstr && port) snprintf (portstr, sizeof portstr, "%hu", port); else if (!strcmp (scheme,"https")) strcpy (portstr, "443"); else strcpy (portstr, "11371"); if (*hostname != '[' && is_ip_address (hostname) == 6) *r_hostport = strconcat (scheme, "://[", hostname, "]:", portstr, NULL); else *r_hostport = strconcat (scheme, "://", hostname, ":", portstr, NULL); xfree (hostname); if (!*r_hostport) { if (r_httphost) { xfree (*r_httphost); *r_httphost = NULL; } return gpg_error_from_syserror (); } return 0; }