Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=fw32.git;a=commitdiff;h=9d5252d49218e51b824d965febf5ec40f023168c

commit 9d5252d49218e51b824d965febf5ec40f023168c
Author: James Buren <r...@frugalware.org>
Date:   Wed Nov 9 09:28:55 2011 -0600

fw32.c: allow binded directories to be RO or RW.

diff --git a/fw32.c b/fw32.c
index 9c55600..3f9abe8 100644
--- a/fw32.c
+++ b/fw32.c
@@ -14,27 +14,33 @@
#include <assert.h>
#include <pwd.h>

+typedef struct
+{
+  const char *dir;
+  bool ro;
+} FW32_DIR;
+
static const char *FW32_ROOT = "/usr/lib/fw32";

static const char *FW32_CONFIG = "/etc/fw32/pacman-g2.conf";

-static const char *FW32_DIRS[] =
+static FW32_DIR FW32_DIRS[] =
{
-  "/proc",
-  "/sys",
-  "/dev",
-  "/etc",
-  "/home",
-  "/tmp",
-  "/var/tmp",
-  "/var/cache/pacman-g2",
-  "/usr/share/kde",
-  "/usr/share/icons",
-  "/usr/share/fonts",
-  "/usr/share/themes",
-  "/media",
-  "/mnt",
-  0
+  { "/proc",                 true },
+  { "/sys",                  true },
+  { "/dev",                  true },
+  { "/etc",                  true },
+  { "/usr/share/kde",        true },
+  { "/usr/share/icons",      true },
+  { "/usr/share/fonts",      true },
+  { "/usr/share/themes",     true },
+  { "/var/cache/pacman-g2", false },
+  { "/media",               false },
+  { "/mnt",                 false },
+  { "/home",                false },
+  { "/var/tmp",             false },
+  { "/tmp",                 false },
+  {                      0, false }
};

static void
@@ -240,54 +246,62 @@ run(const char *cmd,const char *dir,bool drop,char 
**args1)
}

static void
-mount_directory(const char *src)
+mount_directory(FW32_DIR *src)
{
char dst[PATH_MAX];

assert(src);

-  snprintf(dst,sizeof dst,"%s%s",FW32_ROOT,src);
+  snprintf(dst,sizeof dst,"%s%s",FW32_ROOT,src->dir);

if(ismounted(dst))
return;

-  if(mount(src,dst,"",MS_BIND,""))
+  if(mount(src->dir,dst,"fw32",MS_BIND,""))
error("Failed to mount directory: %s: %s\n",dst,strerror(errno));
+
+  if(src->ro)
+    if(mount(src->dir,dst,"fw32",MS_BIND | MS_RDONLY | MS_REMOUNT,""))
+      error("Failed to mount directory: %s: %s\n",dst,strerror(errno));
}

static void
-umount_directory(const char *path)
+umount_directory(FW32_DIR *path)
{
assert(path);

-  if(umount2(path,UMOUNT_NOFOLLOW) && errno != EINVAL)
-    error("Failed to umount directory: %s: %s\n",path,strerror(errno));
+  if(umount2(path->dir,UMOUNT_NOFOLLOW) && errno != EINVAL)
+    error("Failed to umount directory: %s: %s\n",path->dir,strerror(errno));
}

static void
mount_all(void)
{
-  const char **p;
+  FW32_DIR *p;

p = FW32_DIRS;

-  while(*p)
-    mount_directory(*p++);
+  while(p->dir)
+    mount_directory(p++);
}

static void
umount_all(void)
{
-  const char **p;
+  FW32_DIR *p, d;
char path[PATH_MAX];

p = FW32_DIRS;

-  while(*p)
+  while(p->dir)
{
-    snprintf(path,sizeof path,"%s%s",FW32_ROOT,*p++);
+    snprintf(path,sizeof path,"%s%s",FW32_ROOT,(p++)->dir);
+
+    d.dir = path;
+
+    d.ro = false;

-    umount_directory(path);
+    umount_directory(&d);
}
}

@@ -296,12 +310,13 @@ pacman_g2(char **args1)
{
pid_t id;
int status;
+  FW32_DIR cache = { "/var/cache/pacman-g2", false };

assert(args1);

umount_all();

-  mount_directory("/var/cache/pacman-g2");
+  mount_directory(&cache);

id = fork();

@@ -330,7 +345,7 @@ pacman_g2(char **args1)
if(!WIFEXITED(status) || WEXITSTATUS(status))
error("pacman-g2 failed to complete its operation.\n");

-  umount_directory("/var/cache/pacman-g2");
+  umount_directory(&cache);

mount_all();
}
@@ -350,7 +365,7 @@ static void
fw32_create(void)
{
struct stat st;
-  const char **p;
+  FW32_DIR *p;
char path[PATH_MAX];
char *args[] =
{
@@ -378,9 +393,9 @@ fw32_create(void)

p = FW32_DIRS;

-  while(*p)
+  while(p->dir)
{
-    snprintf(path,sizeof path,"%s%s",FW32_ROOT,*p++);
+    snprintf(path,sizeof path,"%s%s",FW32_ROOT,(p++)->dir);

mkdir_parents(path);
}
@@ -407,7 +422,7 @@ static void
fw32_update(void)
{
struct stat st;
-  const char **p;
+  FW32_DIR *p;
char path[PATH_MAX];

if(stat(FW32_ROOT,&st))
@@ -415,9 +430,9 @@ fw32_update(void)

p = FW32_DIRS;

-  while(*p)
+  while(p->dir)
{
-    snprintf(path,sizeof path,"%s%s",FW32_ROOT,*p++);
+    snprintf(path,sizeof path,"%s%s",FW32_ROOT,(p++)->dir);

mkdir_parents(path);
}
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to