static spif_bool_t spif_url_init_from_ipaddr(spif_url_t self, spif_ipsockaddr_t ipaddr) { spif_uint8_t tries; spif_hostinfo_t hinfo; ASSERT_RVAL(!SPIF_URL_ISNULL(self), FALSE); spif_str_init(SPIF_STR(self)); spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(url)); self->proto = (spif_str_t) NULL; self->user = (spif_str_t) NULL; self->passwd = (spif_str_t) NULL; self->path = (spif_str_t) NULL; self->query = (spif_str_t) NULL; /* Try up to 3 times to resolve the hostname. */ h_errno = 0; tries = 0; do { tries++; hinfo = gethostbyaddr((const char *) &(ipaddr->sin_addr), sizeof(ipaddr->sin_addr), AF_INET); } while ((tries <= 3) && (!hinfo) && (h_errno == TRY_AGAIN)); if (!hinfo || !hinfo->h_name) { spif_charptr_t buff; buff = SPIF_CHARPTR(inet_ntoa(ipaddr->sin_addr)); self->host = spif_str_new_from_ptr(buff); } else { self->host = spif_str_new_from_ptr(SPIF_CHARPTR(hinfo->h_name)); } self->port = spif_str_new_from_num(ntohs(ipaddr->sin_port)); return TRUE; }
spif_str_t spif_str_new(void) { spif_str_t self; self = SPIF_ALLOC(str); if (!spif_str_init(self)) { SPIF_DEALLOC(self); self = (spif_str_t) NULL; } return self; }
spif_bool_t spif_str_init_from_ptr(spif_str_t self, spif_charptr_t old) { ASSERT_RVAL(!SPIF_STR_ISNULL(self), FALSE); REQUIRE_RVAL((old != (spif_charptr_t) NULL), spif_str_init(self)); /* ***NOT NEEDED*** spif_obj_init(SPIF_OBJ(self)); */ spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS(SPIF_STRCLASS_VAR(str))); self->len = strlen((const char *) old); self->size = self->len + 1; self->s = (spif_charptr_t) MALLOC(self->size); memcpy(self->s, old, self->size); return TRUE; }
spif_bool_t spif_url_init(spif_url_t self) { ASSERT_RVAL(!SPIF_URL_ISNULL(self), FALSE); if (!spif_str_init(SPIF_STR(self))) { return FALSE; } spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(url)); self->proto = (spif_str_t) NULL; self->user = (spif_str_t) NULL; self->passwd = (spif_str_t) NULL; self->host = (spif_str_t) NULL; self->port = (spif_str_t) NULL; self->path = (spif_str_t) NULL; self->query = (spif_str_t) NULL; return TRUE; }
static spif_bool_t spif_url_init_from_unixaddr(spif_url_t self, spif_unixsockaddr_t unixaddr) { ASSERT_RVAL(!SPIF_URL_ISNULL(self), FALSE); spif_str_init(SPIF_STR(self)); spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(url)); self->proto = (spif_str_t) NULL; self->user = (spif_str_t) NULL; self->passwd = (spif_str_t) NULL; self->host = (spif_str_t) NULL; self->port = (spif_str_t) NULL; self->query = (spif_str_t) NULL; if (unixaddr->sun_path) { self->path = spif_str_new_from_ptr(SPIF_CHARPTR(unixaddr->sun_path)); } else { self->path = (spif_str_t) NULL; } return TRUE; }