void diffdir(char *f, char *t, int level) { char **df, **dt, **dirf, **dirt; char *from, *to; int res; char fb[MAXPATHLEN+1], tb[MAXPATHLEN+1]; df = scandir(f); dt = scandir(t); dirf = df; dirt = dt; if(df == nil || dt == nil) goto Out; while (*df || *dt) { from = *df; to = *dt; if (from && isdotordotdot(from)) { df++; continue; } if (to && isdotordotdot(to)) { dt++; continue; } if (!from) res = 1; else if (!to) res = -1; else res = strcmp(from, to); if (res < 0) { if (mode == 0 || mode == 'n') Bprint(&stdout, "Only in %s: %s\n", f, from); df++; continue; } if (res > 0) { if (mode == 0 || mode == 'n') Bprint(&stdout, "Only in %s: %s\n", t, to); dt++; continue; } if (mkpathname(fb, f, from)) continue; if (mkpathname(tb, t, to)) continue; diff(fb, tb, level+1); df++; dt++; } Out: for (df = dirf; df && *df; df++) FREE(*df); for (dt = dirt; dt && *dt; dt++) FREE(*dt); FREE(dirf); FREE(dirt); }
/* * produce the path to the given instance of a major number. * path must hold MAXPATHLEN string */ int e_ddi_instance_majorinstance_to_path(major_t major, uint_t inst, char *path) { struct devnames *dnp; in_drv_t *dp; int ret; e_ddi_enter_instance(); /* look for the instance threaded off major */ dnp = &devnamesp[major]; for (dp = dnp->dn_inlist; dp != NULL; dp = dp->ind_next) if (dp->ind_instance == inst) break; /* produce path from the node that uses the instance */ if (dp) { *path = 0; ret = mkpathname(path, dp->ind_node, MAXPATHLEN); } else ret = DDI_FAILURE; e_ddi_exit_instance(); return (ret); }
static int mkpathname(char *path, in_node_t *np, int len) { int len_needed; if (np == e_ddi_inst_state.ins_root) return (DDI_SUCCESS); if (mkpathname(path, np->in_parent, len) == DDI_FAILURE) return (DDI_FAILURE); len_needed = strlen(path); len_needed += strlen(np->in_node_name) + 1; /* for '/' */ if (np->in_unit_addr) { len_needed += strlen(np->in_unit_addr) + 1; /* for '@' */ } len_needed += 1; /* for '\0' */ /* * XX complain */ if (len_needed > len) return (DDI_FAILURE); if (np->in_unit_addr[0] == '\0') (void) sprintf(path+strlen(path), "/%s", np->in_node_name); else (void) sprintf(path+strlen(path), "/%s@%s", np->in_node_name, np->in_unit_addr); return (DDI_SUCCESS); }