merge to 0.30.212
[util-vserver.git] / src / vdlimit.c
index 4e5b09e..edb3f80 100644 (file)
@@ -1,4 +1,4 @@
-// $Id: vdlimit.c,v 1.2 2005/03/24 12:44:17 ensc Exp $    --*- c -*--
+// $Id: vdlimit.c,v 1.3 2007/01/18 15:28:28 mef Exp $    --*- c -*--
 
 // Copyright (C) 2005 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
 //  
@@ -21,7 +21,6 @@
 #endif
 
 #include "util.h"
-#include <lib_internal/sys_clone.h>
 #include <lib/internal.h>
 
 #include <vserver.h>
@@ -85,14 +84,24 @@ showVersion()
 static void
 setDlimit(char const *filename, xid_t xid, uint32_t flags, struct vc_ctx_dlimit const *limit)
 {
+  bool         was_added = false;
+
   if (vc_get_dlimit(filename, xid, flags, 0) == -1) {
     if (vc_add_dlimit(filename, xid, flags) == -1) {
       perror(ENSC_WRAPPERS_PREFIX "vc_add_dlimit()");
       exit(wrapper_exit_code);
     }
+
+    was_added = true;
   }
+
   if (vc_set_dlimit(filename, xid, flags, limit) == -1) {
     perror(ENSC_WRAPPERS_PREFIX "vc_set_dlimit()");
+
+    if (was_added &&
+       vc_rem_dlimit(filename, xid, flags)==-1)
+      perror(ENSC_WRAPPERS_PREFIX "vc_rem_dlimit()");
+
     exit(wrapper_exit_code);
   }
 }
@@ -200,6 +209,14 @@ setDLimitField(struct vc_ctx_dlimit *dst, char const *opt)
   return true;
 }
 
+bool
+isHigherLimit(uint_least32_t lhs, uint_least32_t rhs)
+{
+  if (lhs==VC_CDLIM_KEEP || rhs==VC_CDLIM_KEEP) return false;
+
+  return lhs > rhs;
+}
+
 int main(int argc, char *argv[])
 {
   bool         do_set       = false;
@@ -261,6 +278,10 @@ int main(int argc, char *argv[])
     WRITE_MSG(2, "No mount point specified; try '--help' for more information\n");
   else if (xid==VC_NOCTX)
     WRITE_MSG(2, "No xid specified; try '--help' for more information\n");
+  else if (isHigherLimit(limit.space_used, limit.space_total))
+    WRITE_MSG(2, "invalid parameters: 'space_used' is larger than 'space_total'\n");
+  else if (isHigherLimit(limit.inodes_used, limit.inodes_total))
+    WRITE_MSG(2, "invalid parameters: 'inodes_used' is larger than 'inodes_total'\n");
   else {
     for (; optind < argc; ++optind) {
       if      (do_set)     setDlimit(argv[optind], xid, flags, &limit);