summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2011-03-30 12:16:31 +0000
committerChristian Pointner <equinox@spreadspace.org>2011-03-30 12:16:31 +0000
commitef7c6b153122ce86d6aa0ec655abd665d799ecec (patch)
tree27ed83d90034c82474815db509e39bfb9505022f
parentdebian package works now (diff)
added get_mode implementation
-rw-r--r--src/lua-mq.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/lua-mq.c b/src/lua-mq.c
index 2975d16..3f30f4e 100644
--- a/src/lua-mq.c
+++ b/src/lua-mq.c
@@ -11,10 +11,34 @@
#define MQD_TYPENAME "mqd_t"
#include "lua-mq.h"
-static mode_t get_mode(const char* modestr)
+static const struct { char c; mode_t b; } M[] =
{
-/* TODO: implement this!!! */
- return S_IRWXU | S_IRWXG;
+ {'r', S_IRUSR}, {'w', S_IWUSR}, {'x', S_IXUSR},
+ {'r', S_IRGRP}, {'w', S_IWGRP}, {'x', S_IXGRP},
+ {'r', S_IROTH}, {'w', S_IWOTH}, {'x', S_IXOTH},
+};
+
+static int get_mode(mode_t *mode, const char* modestr)
+{
+ int i;
+
+ *mode = 0;
+ for (i=0; i<9; i++) {
+ if(*modestr == 0) break;
+ if (*modestr == M[i].c)
+ *mode |= M[i].b;
+ else if (*modestr == '-')
+ *mode &= ~M[i].b;
+ else if (*modestr == 's') {
+ switch(i) {
+ case 2: *mode |= S_ISUID | S_IXUSR; break;
+ case 5: *mode |= S_ISGID | S_IXGRP; break;
+ default: return -1; break;
+ }
+ }
+ modestr++;
+ }
+ return 0;
}
static int get_oflags(const char* flagstr)