ni_status ni2_copydirtoparentdir(void *srcdomain, ni_id *srcdir, void*dstdomain, ni_id *dstdir , bool recursive) { ni_status ret; ni_idlist children; int i, len; ni_proplist p; ni_id dir, newdstdir; NI_INIT(&p); /* get proplist from src dir */ ret = ni_read(srcdomain, srcdir, &p); if (ret != NI_OK) { return ret; } /* create the destination dir */ ret = ni_create(dstdomain, dstdir, p, &newdstdir, NI_INDEX_NULL); if (ret != NI_OK) { ni_proplist_free(&p); return ret; } ni_proplist_free(&p); if (recursive) { NI_INIT(&children); /* get list of children */ ret = ni_children(srcdomain, srcdir, &children); if (ret != NI_OK) { return ret; } len = children.ni_idlist_len; for (i = 0; i < len; i++) { dir.nii_object = children.ni_idlist_val[i]; ret = ni_self(srcdomain, &dir); if (ret != NI_OK) { ni_idlist_free(&children); return ret; } ret = ni2_copydirtoparentdir(srcdomain,&dir,dstdomain, &newdstdir,recursive); } ni_idlist_free(&children); } return NI_OK; }
int new_iface(void * pio) { int i; int err; NET net; char * name; char * type; char * cp = nextarg(((GEN_IO)pio)->inbuf); if (!*cp) /* no arg given */ { ns_printf(pio, "please enter a name & type for new loopback iface\n"); ns_printf(pio, "valid types include:\n"); #ifdef MAC_LOOPBACK ns_printf(pio, " lo\n"); #endif #ifdef USE_PPP ns_printf(pio, " ppp\n"); #endif return -1; } /* get name buffer for ni_create to use */ name = NULL; for(i = 0; i < IF_MAXNAMES; i++) { if(ifnames[i][0] == 0) /* unused entry */ { name = &ifnames[i][0]; break; } } if (!name) return -1; strcpy(name, cp); /* copy name arg into new buffer */ type = nextarg(cp); cp = strchr(name, ' '); /* get end of first arg (name) */ if(cp) *cp = '\0'; /* null terminate first arg */ err = -1; /* assume error */ #ifdef MUTE_WARNS /* some compilers give a bogus warning below if we don't assign a * gratuitous default value to net. */ net = (NET)(netlist.q_head); #endif /* MUTE_WARNS */ #ifdef MAC_LOOPBACK if(strnicmp(type, "lo", 2) == 0) { err = ni_create(&net, lb_create, name, NULL); } #endif /* MAC_LOOPBACK */ #ifdef USE_PPP if(strnicmp(type, "ppp", 3) == 0) { err = ni_create(&net, ppp_create, name, NULL); } #endif /* USE_PPP */ if (err) { ns_printf(pio, "Error %d creating iface name '%s' of type '%s'\n", err, name, type); *name = 0; /* free name buffer (mark as unused) */ } else ns_printf(pio, "Created iface %s, - %s\n", name, net->n_mib->ifDescr); return err; }
ni_status ni2_createchild(void *domain, ni_id *dir, const ni_name dirname) { /* make a child directory with the given name */ ni_status ret; ni_proplist p; ni_id child; int i, j, k, len; char *key = NULL; char *value = NULL; /* if the name contains "=", then we've got "foo=bar" */ /* property key is "foo", not "name" */ len = 0; for (i = 0; dirname[i] != '\0' && dirname[i] != '='; i++); if (dirname[i] == '=') len = i; if (len > 0) { key = malloc(len + 1); /* check for backslashes in property key */ for (i = 0, j = 0; i < len; i++, j++) { if (dirname[i] == '\\' && dirname[i+1] == '/') i++; key[j] = dirname[i]; } key[j] = '\0'; i = len + 1; } else { key = malloc(5); strcpy(key, "name"); i = 0; } /* compress out backslashes in value */ j = strlen(dirname); len = j - i; value = malloc(len + 1); for (k = 0; i < j; k++, i++) { if (dirname[i] == '\\' && dirname[i+1] == '/') i++; value[k] = dirname[i]; } value[k] = '\0'; /* set up the new directory */ NI_INIT(&p); nipl_createprop(&p, key); nipl_appendprop(&p, key, value); /* create it */ ret = ni_create(domain, dir, p, &child, NI_INDEX_NULL); if (ret != NI_OK) { ni_proplist_free(&p); return ret; } ni_proplist_free(&p); free(key); free(value); *dir = child; return NI_OK; }