- if (status != NI_OK) {
- return (NULL);
- }
- } else if ((sep = index(domain, '@')) != NULL) {
- free(ni);
- tag = strncpy((char *)malloc(sep-domain+1), domain, sep-domain);
- tag[sep-domain] = '\0';
- addr = strcpy ((char *)malloc(strlen(sep+1)), sep+1);
- sin.sin_addr.s_addr = inet_addr(addr);
- if (sin.sin_addr.s_addr == INADDR_NONE) {
- he = gethostbyname(addr);
- if (he == NULL) {
- free(addr);
- free(tag);
- return (NULL);
- }
- bcopy(he->h_addr_list[0], &sin.sin_addr.s_addr, he->h_length);
- }
- ni = ni_connect(&sin, tag);
- free(addr);
- free(tag);
- } else if (strcmp(domain, ".") != 0) {
- /*
- * nothing else makes sense
- */
- free(ni);
- return (NULL);
- }
- } else {
- if (strcmp(domain, "..") == 0) {
- status = getparent((ni_private *)oldni, &ni);
- if (status != NI_OK) {
- return (NULL);
- }
- } else if ((sep = index(domain, '@')) != NULL) {
- tag = strncpy((char *)malloc(sep-domain+1), domain, sep-domain);
- tag[sep-domain] = '\0';
- addr = strcpy ((char *)malloc(strlen(sep+1)), sep+1);
- sin.sin_addr.s_addr = inet_addr(addr);
- if (sin.sin_addr.s_addr == INADDR_NONE) {
- he = gethostbyname(addr);
- if (he == NULL) {
- free(addr);
- free(tag);
- return (NULL);
- }
- bcopy(he->h_addr_list[0], &sin.sin_addr.s_addr, he->h_length);
- }
- ni = ni_connect(&sin, tag);
- free(addr);
- free(tag);
- } else {
- ni = ni_alloc();
- *ni = *NIP(oldni);
- ni_clear(ni);
- if (!get_daddr(oldni, (ni_name)domain, ni)) {
- ni_free(ni);
- ni = NULL;
- }