Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Support flags when installing as user.
Dan McGregor committed 8 years ago
commit 52c575086c6be9e6157569be95555e8a36501031
parent 326128d
4 files changed +34 -14
modified configure.ac
@@ -157,6 +157,7 @@ AC_CHECK_HEADER([regex.h], [
	[#include <sys/types.h>])

AC_CHECK_FUNCS_ONCE([strtofflags])
+
AC_CHECK_FUNCS_ONCE([fflagstostr])
AC_CHECK_FUNCS_ONCE([posix_fallocate])
AC_CHECK_FUNCS_ONCE([usleep])
AC_CHECK_FUNCS_ONCE([localtime_r])
modified libpkg/metalog.c
@@ -46,36 +46,52 @@ metalog_open(const char *metalog)

void
metalog_add(int type, const char *path, const char *uname, const char *gname,
-
    int mode, const char *link)
+
    int mode, unsigned long fflags, const char *link)
{
+
	char *fflags_buffer = NULL;
+

	if (metalogfp == NULL) {
		return;
	}

+
#ifdef HAVE_FFLAGSTOSTR
+
	if (fflags) {
+
		fflags_buffer = fflagstostr(fflags);
+
	}
+
#endif
+

	// directory
	switch (type) {
	case PKG_METALOG_DIR:
		if (fprintf(metalogfp,
-
		    "./%s type=dir uname=%s gname=%s mode=%3o\n",
-
		    path, uname, gname, mode) < 0) {
+
		    "./%s type=dir uname=%s gname=%s mode=%3o%s%s\n",
+
		    path, uname, gname, mode,
+
		    fflags ? " flags=" : "",
+
		    fflags_buffer ? fflags_buffer : "") < 0) {
			pkg_errno("%s", "Unable to write to the metalog");
		}
		break;
	case PKG_METALOG_FILE:
		if (fprintf(metalogfp,
-
		    "./%s type=file uname=%s gname=%s mode=%3o\n",
-
		    path, uname, gname, mode) < 0) {
+
		    "./%s type=file uname=%s gname=%s mode=%3o%s%s\n",
+
		    path, uname, gname, mode,
+
		    fflags ? " flags=" : "",
+
		    fflags_buffer ? fflags_buffer : "") < 0) {
			pkg_errno("%s", "Unable to write to the metalog");
		}
		break;
	case PKG_METALOG_LINK:
		if (fprintf(metalogfp,
-
		    "./%s type=link uname=%s gname=%s mode=%3o link=%s\n",
-
		    path, uname, gname, mode, link) < 0) {
+
		    "./%s type=link uname=%s gname=%s mode=%3o link=%s%s%s\n",
+
		    path, uname, gname, mode, link,
+
		    fflags ? " flags=" : "",
+
		    fflags_buffer ? fflags_buffer : "") < 0) {
			pkg_errno("%s", "Unable to write to the metalog");
		}
		break;
	}
+

+
	free(fflags_buffer);
}

void
modified libpkg/pkg_add.c
@@ -394,7 +394,7 @@ do_extract_dir(struct pkg* pkg, struct archive *a __unused, struct archive_entry

	metalog_add(PKG_METALOG_DIR, RELATIVE_PATH(path),
	    archive_entry_uname(ae), archive_entry_gname(ae),
-
	    aest->st_mode & ~S_IFDIR, NULL);
+
	    aest->st_mode & ~S_IFDIR, d->fflags, NULL);

	return (EPKG_OK);
}
@@ -452,7 +452,7 @@ do_extract_symlink(struct pkg *pkg, struct archive *a __unused, struct archive_e

	metalog_add(PKG_METALOG_LINK, RELATIVE_PATH(path),
	    archive_entry_uname(ae), archive_entry_gname(ae),
-
	    aest->st_mode & ~S_IFLNK, archive_entry_symlink(ae));
+
	    aest->st_mode & ~S_IFLNK, f->fflags, archive_entry_symlink(ae));

	return (EPKG_OK);
}
@@ -510,7 +510,7 @@ do_extract_hardlink(struct pkg *pkg, struct archive *a __unused, struct archive_

	metalog_add(PKG_METALOG_FILE, RELATIVE_PATH(path),
	    archive_entry_uname(ae), archive_entry_gname(ae),
-
	    aest->st_mode & ~S_IFREG, NULL);
+
	    aest->st_mode & ~S_IFREG, 0, NULL);

	return (EPKG_OK);
}
@@ -618,7 +618,7 @@ do_extract_regfile(struct pkg *pkg, struct archive *a, struct archive_entry *ae,

	metalog_add(PKG_METALOG_FILE, RELATIVE_PATH(path),
	    archive_entry_uname(ae), archive_entry_gname(ae),
-
	    aest->st_mode & ~S_IFREG, NULL);
+
	    aest->st_mode & ~S_IFREG, f->fflags, NULL);

	return (EPKG_OK);
}
@@ -722,6 +722,9 @@ pkg_extract_finalize(struct pkg *pkg)
	struct pkg_dir *d = NULL;
	char path[MAXPATHLEN];
	const char *fto;
+
	bool install_as_user;
+

+
	install_as_user = (getenv("INSTALL_AS_USER") != NULL);

	while (pkg_files(pkg, &f) == EPKG_OK) {
		if (*f->temppath == '\0')
@@ -739,7 +742,7 @@ pkg_extract_finalize(struct pkg *pkg)
		if (fstatat(pkg->rootfd, RELATIVE_PATH(fto), &st,
		    AT_SYMLINK_NOFOLLOW) != -1) {
#ifdef HAVE_CHFLAGSAT
-
			if (st.st_flags & NOCHANGESFLAGS) {
+
			if (!install_as_user && st.st_flags & NOCHANGESFLAGS) {
				chflagsat(pkg->rootfd, RELATIVE_PATH(fto), 0,
				    AT_SYMLINK_NOFOLLOW);
			}
@@ -753,7 +756,7 @@ pkg_extract_finalize(struct pkg *pkg)
		}

#ifdef HAVE_CHFLAGSAT
-
		if (f->fflags != 0) {
+
		if (!install_as_user && f->fflags != 0) {
			if (chflagsat(pkg->rootfd, RELATIVE_PATH(fto),
			    f->fflags, AT_SYMLINK_NOFOLLOW) == -1) {
				pkg_fatal_errno("Fail to chflags %s", fto);
modified libpkg/private/pkg.h
@@ -807,7 +807,7 @@ char* pkg_message_to_str(struct pkg *pkg);

int metalog_open(const char *metalog);
void metalog_add(int type, const char *path, const char *uname,
-
    const char *gname, int mode, const char *link);
+
    const char *gname, int mode, unsigned long fflags, const char *link);
void metalog_close();
enum pkg_metalog_type {
	PKG_METALOG_FILE = 0,