--- util-linux-2.13-pre6/disk-utils/mkswap.c.selinux 2005-08-14 17:34:49.000000000 +0200 +++ util-linux-2.13-pre6/disk-utils/mkswap.c 2006-03-08 16:35:08.000000000 +0100 @@ -39,6 +39,12 @@ #include /* for _IO */ #include #include +#include +#ifdef HAVE_LIBSELINUX +#include +#include +#endif + #include "swapheader.h" #include "xstrncpy.h" #include "nls.h" @@ -76,6 +82,8 @@ #define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r)) +#define SELINUX_SWAPFILE_TYPE "swapfile_t" + static int linux_version_code(void) { struct utsname my_utsname; @@ -718,5 +726,39 @@ if (fsync(DEV)) die(_("fsync failed")); #endif + +#ifdef HAVE_LIBSELINUX + if (S_ISREG(statbuf.st_mode) && is_selinux_enabled()) { + security_context_t context_string; + security_context_t oldcontext; + context_t newcontext; + + if ((fgetfilecon(DEV, &oldcontext) < 0) && + (errno != ENODATA)) { + fprintf(stderr, _("%s: %s: unable to obtain selinux file label: %s\n"), + program_name, device_name, + strerror(errno)); + exit(1); + } + if (!(newcontext = context_new(oldcontext))) + die(_("unable to create new selinux context")); + if (context_type_set(newcontext, SELINUX_SWAPFILE_TYPE)) + die(_("couldn't compute selinux context")); + + context_string = context_str(newcontext); + + if (strcmp(context_string, oldcontext)!=0) { + if (fsetfilecon(DEV, context_string)) { + fprintf(stderr, _("%s: unable to relabel %s to %s: %s\n"), + program_name, device_name, + context_string, + strerror(errno)); + exit(1); + } + } + context_free(newcontext); + freecon(oldcontext); + } +#endif return 0; } --- util-linux-2.13-pre6/disk-utils/Makefile.am.selinux 2005-09-10 19:46:10.000000000 +0200 +++ util-linux-2.13-pre6/disk-utils/Makefile.am 2006-03-08 16:27:03.000000000 +0100 @@ -30,6 +30,13 @@ mkfs_cramfs_LDADD = -lz $(top_srcdir)/lib/libmd5.a endif +mkswap_LDADD = + if HAVE_UUID -mkswap_LDADD = -luuid +mkswap_LDADD += -luuid +endif + +if HAVE_SELINUX +mkswap_LDADD += -lselinux endif +