int relatepaths(char *from, char *to, char *outpath) { char *cp, *cp2; int len; char buf[NAME_MAX]; assert(*from == '/' && *to == '/'); for (cp = to, cp2 = from; *cp == *cp2; cp++, cp2++) if (*cp == '\0') break; while (cp[-1] != '/') cp--, cp2--; if (cp - 1 == to) { /* closest common ancestor is /, so use full pathname */ len = strlen(strcpy(outpath, to)); if (outpath[len] != '/') { outpath[len++] = '/'; outpath[len] = '\0'; } } else { len = 0; while ((cp2 = getcomponent(cp2, buf)) != 0) { strcpy(outpath + len, "../"); len += 3; } while ((cp = getcomponent(cp, buf)) != 0) { sprintf(outpath + len, "%s/", buf); len += strlen(outpath + len); } } return len; }
void reversepath(char *inpath, char *name, int len, char *outpath) { char *cp, *cp2; char buf[NAME_MAX]; struct stat sb; cp = strcpy(outpath + PATH_MAX - (len + 1), name); cp2 = inpath; while ((cp2 = getcomponent(cp2, buf)) != 0) { if (strcmp(buf, ".") == 0) continue; if (strcmp(buf, "..") == 0) { if (stat(".", &sb) < 0) fail("cannot stat current directory"); name = ino2name(sb.st_ino, ".."); len = strlen(name); cp -= len + 1; strcpy(cp, name); cp[len] = '/'; free(name); xchdir(".."); } else { cp -= 3; strncpy(cp, "../", 3); xchdir(buf); } } strcpy(outpath, cp); }
static void tiff(fz_predict *p, unsigned char *in, unsigned char *out) { int left[MAXC]; int i, k; for (k = 0; k < p->colors; k++) left[k] = 0; for (i = 0; i < p->columns; i++) { for (k = 0; k < p->colors; k++) { int a = getcomponent(in, i * p->colors + k, p->bpc); int b = p->encode ? a - left[k] : a + left[k]; int c = b % (1 << p->bpc); putcomponent(out, i * p->colors + k, p->bpc, c); left[k] = p->encode ? a : c; } } }
/* * Return the dsl_dir_t, and possibly the last component which couldn't * be found in *tail. The name must be in the specified dsl_pool_t. This * thread must hold the dp_config_rwlock for the pool. Returns NULL if the * path is bogus, or if tail==NULL and we couldn't parse the whole name. * (*tail)[0] == '@' means that the last component is a snapshot. */ int dsl_dir_hold(dsl_pool_t *dp, const char *name, void *tag, dsl_dir_t **ddp, const char **tailp) { char buf[MAXNAMELEN]; const char *spaname, *next, *nextnext = NULL; int err; dsl_dir_t *dd; uint64_t ddobj; err = getcomponent(name, buf, &next); if (err != 0) return (err); /* Make sure the name is in the specified pool. */ spaname = spa_name(dp->dp_spa); if (strcmp(buf, spaname) != 0) return (SET_ERROR(EINVAL)); ASSERT(dsl_pool_config_held(dp)); err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj, NULL, tag, &dd); if (err != 0) { return (err); } while (next != NULL) { dsl_dir_t *child_ds; err = getcomponent(next, buf, &nextnext); if (err != 0) break; ASSERT(next[0] != '\0'); if (next[0] == '@') break; dprintf("looking up %s in obj%lld\n", buf, dd->dd_phys->dd_child_dir_zapobj); err = zap_lookup(dp->dp_meta_objset, dd->dd_phys->dd_child_dir_zapobj, buf, sizeof (ddobj), 1, &ddobj); if (err != 0) { if (err == ENOENT) err = 0; break; } err = dsl_dir_hold_obj(dp, ddobj, buf, tag, &child_ds); if (err != 0) break; dsl_dir_rele(dd, tag); dd = child_ds; next = nextnext; } if (err != 0) { dsl_dir_rele(dd, tag); return (err); } /* * It's an error if there's more than one component left, or * tailp==NULL and there's any component left. */ if (next != NULL && (tailp == NULL || (nextnext && nextnext[0] != '\0'))) { /* bad path name */ dsl_dir_rele(dd, tag); dprintf("next=%p (%s) tail=%p\n", next, next?next:"", tailp); err = SET_ERROR(ENOENT); } if (tailp != NULL) *tailp = next; *ddp = dd; return (err); }
/* * same as dsl_open_dir, ignore the first component of name and use the * spa instead */ int dsl_dir_open_spa(spa_t *spa, const char *name, void *tag, dsl_dir_t **ddp, const char **tailp) { char buf[MAXNAMELEN]; const char *next, *nextnext = NULL; int err; dsl_dir_t *dd; dsl_pool_t *dp; uint64_t ddobj; int openedspa = FALSE; dprintf("%s\n", name); err = getcomponent(name, buf, &next); if (err) return (err); if (spa == NULL) { err = spa_open(buf, &spa, FTAG); if (err) { dprintf("spa_open(%s) failed\n", buf); return (err); } openedspa = TRUE; /* XXX this assertion belongs in spa_open */ ASSERT(!dsl_pool_sync_context(spa_get_dsl(spa))); } dp = spa_get_dsl(spa); rw_enter(&dp->dp_config_rwlock, RW_READER); err = dsl_dir_open_obj(dp, dp->dp_root_dir_obj, NULL, tag, &dd); if (err) { rw_exit(&dp->dp_config_rwlock); if (openedspa) spa_close(spa, FTAG); return (err); } while (next != NULL) { dsl_dir_t *child_ds; err = getcomponent(next, buf, &nextnext); if (err) break; ASSERT(next[0] != '\0'); if (next[0] == '@') break; dprintf("looking up %s in obj%lld\n", buf, dd->dd_phys->dd_child_dir_zapobj); err = zap_lookup(dp->dp_meta_objset, dd->dd_phys->dd_child_dir_zapobj, buf, sizeof (ddobj), 1, &ddobj); if (err) { if (err == ENOENT) err = 0; break; } err = dsl_dir_open_obj(dp, ddobj, buf, tag, &child_ds); if (err) break; dsl_dir_close(dd, tag); dd = child_ds; next = nextnext; } rw_exit(&dp->dp_config_rwlock); if (err) { dsl_dir_close(dd, tag); if (openedspa) spa_close(spa, FTAG); return (err); } /* * It's an error if there's more than one component left, or * tailp==NULL and there's any component left. */ if (next != NULL && (tailp == NULL || (nextnext && nextnext[0] != '\0'))) { /* bad path name */ dsl_dir_close(dd, tag); dprintf("next=%p (%s) tail=%p\n", next, next?next:"", tailp); err = ENOENT; } if (tailp) *tailp = next; if (openedspa) spa_close(spa, FTAG); *ddp = dd; return (err); }