X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=zpm-syncfs.c;h=3c0eebb0ff84bc43175d528f13e08c79e0514ce6;hb=b0fe3bd3a744f550191331676b7df3a493008217;hp=68f2e423e4c43ca6d52bafd25d4a26867acccab9;hpb=9acfd23b8707b49d642b3dc3f1ea531cba88604c;p=zpackage diff --git a/zpm-syncfs.c b/zpm-syncfs.c index 68f2e42..3c0eebb 100644 --- a/zpm-syncfs.c +++ b/zpm-syncfs.c @@ -628,15 +628,6 @@ static int remove_files(void *f, int ncols, char **vals, char **cols) { return 0; } - if (lstat(dest, &st) == -1) { - return seterror(conf,"can't stat"); - } - - if (S_ISDIR(st.st_mode)) { - flags = AT_REMOVEDIR; - } - /* TODO check that expected filetype matches actual filetype */ - if (conf->verbose) { if (conf->progress == 2) { fprintf(stderr, "%s(%s)\n", flags ? "rmdir" : "unlink", dest); @@ -651,14 +642,37 @@ static int remove_files(void *f, int ncols, char **vals, char **cols) { } } + errno = 0; + + if (lstat(dest, &st) == -1) { + switch (errno) { + case ENOENT: + /* TODO chatter if verbose */ + break; + default: + return seterror(conf, "can't stat %s: %s", dest, strerror(errno)); + } + return 0; + } + + if (S_ISDIR(st.st_mode)) { + flags = AT_REMOVEDIR; + } + /* TODO check that expected filetype matches actual filetype */ + + errno = 0; if (unlinkat(AT_FDCWD, dest, flags) == -1) { switch (errno) { case ENOENT: break; + case ENOTEMPTY: /* fall through */ + case EEXIST: + /* TODO chatter, or possibly require */ + break; default: - return seterror(conf, "can't unlink"); + return seterror(conf, "can't unlink %s: %s", dest, strerror(errno)); } } @@ -707,6 +721,17 @@ static int set_md(struct config *conf, struct nitem *item) { return success; } + if (conf->setuser && conf->setgroup) { + rv = lchown(item->dest, item->uid, item->gid); + if (rv == -1) { + setsyserr(conf, "can't lchown %s", item->dest); + return conf->errabort; + } + } + + /* have to chmod after the chown, setuid bits may (and will) + * be cleared after a chown + */ /* can't chmod a symlink */ if (item->ftype != 'l') { rv = chmod(item->dest, item->mode); @@ -717,13 +742,6 @@ static int set_md(struct config *conf, struct nitem *item) { } } - if (conf->setuser && conf->setgroup) { - rv = lchown(item->dest, item->uid, item->gid); - if (rv == -1) { - setsyserr(conf, "can't lchown %s", item->dest); - return conf->errabort; - } - } rv = utimensat(AT_FDCWD, item->dest, item->times, AT_SYMLINK_NOFOLLOW); if (rv == -1) { @@ -800,16 +818,11 @@ static int install(struct config *conf, struct nitem *item, unsigned int flags) } } - if (item->ftype == 'r') { - rv = zpm_extract(source, item->hash, item->dest, item->mode); - if (rv == 0) { - seterror(conf, "can't extract %s", item->dest); - return failure; - } - return success; - } - + errno = 0; switch (item->ftype) { + case 'r': rv = zpm_extract(source, item->hash, item->dest, item->mode); + if (rv == 0) rv = -1; + break; case 'd': rv = mkdir(item->dest, item->mode); break; case 'l': rv = symlink(item->target, item->dest); @@ -819,6 +832,17 @@ static int install(struct config *conf, struct nitem *item, unsigned int flags) } if (rv == -1) { + switch (item->ftype) { + case 'r': + seterror(conf, "can't extract %s", item->dest); + break; + case 'd': + setsyserr(conf, "install mkdir(\"%s\") failed", item->dest); + break; + case 'l': + setsyserr(conf, "install symlink(\"%s\") failed", item->dest); + break; + } setsyserr(conf, "installing %s failed", item->dest); return failure; }