New commands: mkfs-b, mke2journal*, mke2fs-J*
[libguestfs.git] / daemon / ext2.c
index c5e1415..2603ed0 100644 (file)
@@ -1,5 +1,5 @@
 /* libguestfs - the guestfsd daemon
- * Copyright (C) 2009 Red Hat Inc. 
+ * Copyright (C) 2009 Red Hat Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
 #include "actions.h"
 
 char **
-do_tune2fs_l (char *device)
+do_tune2fs_l (const char *device)
 {
   int r;
   char *out, *err;
@@ -36,8 +36,6 @@ do_tune2fs_l (char *device)
   char **ret = NULL;
   int size = 0, alloc = 0;
 
-  IS_DEVICE (device, NULL);
-
   r = command (&out, &err, "/sbin/tune2fs", "-l", device, NULL);
   if (r == -1) {
     reply_with_error ("tune2fs: %s", err);
@@ -77,31 +75,31 @@ do_tune2fs_l (char *device)
       do { colon++; } while (*colon && isspace (*colon));
 
       if (add_string (&ret, &size, &alloc, p) == -1) {
-       free (out);
-       return NULL;
+        free (out);
+        return NULL;
       }
       if (strcmp (colon, "<none>") == 0 ||
-         strcmp (colon, "<not available>") == 0 ||
-         strcmp (colon, "(none)") == 0) {
-       if (add_string (&ret, &size, &alloc, "") == -1) {
-         free (out);
-         return NULL;
-       }
+          strcmp (colon, "<not available>") == 0 ||
+          strcmp (colon, "(none)") == 0) {
+        if (add_string (&ret, &size, &alloc, "") == -1) {
+          free (out);
+          return NULL;
+        }
       } else {
-       if (add_string (&ret, &size, &alloc, colon) == -1) {
-         free (out);
-         return NULL;
-       }
+        if (add_string (&ret, &size, &alloc, colon) == -1) {
+          free (out);
+          return NULL;
+        }
       }
     }
     else {
       if (add_string (&ret, &size, &alloc, p) == -1) {
-       free (out);
-       return NULL;
+        free (out);
+        return NULL;
       }
       if (add_string (&ret, &size, &alloc, "") == -1) {
-       free (out);
-       return NULL;
+        free (out);
+        return NULL;
       }
     }
 
@@ -117,13 +115,11 @@ do_tune2fs_l (char *device)
 }
 
 int
-do_set_e2label (char *device, char *label)
+do_set_e2label (const char *device, const char *label)
 {
   int r;
   char *err;
 
-  IS_DEVICE (device, -1);
-
   r = command (NULL, &err, "/sbin/e2label", device, label, NULL);
   if (r == -1) {
     reply_with_error ("e2label: %s", err);
@@ -136,13 +132,11 @@ do_set_e2label (char *device, char *label)
 }
 
 char *
-do_get_e2label (char *device)
+do_get_e2label (const char *device)
 {
   int r, len;
   char *out, *err;
 
-  IS_DEVICE (device, NULL);
-
   r = command (&out, &err, "/sbin/e2label", device, NULL);
   if (r == -1) {
     reply_with_error ("e2label: %s", err);
@@ -162,13 +156,11 @@ do_get_e2label (char *device)
 }
 
 int
-do_set_e2uuid (char *device, char *uuid)
+do_set_e2uuid (const char *device, const char *uuid)
 {
   int r;
   char *err;
 
-  IS_DEVICE (device, -1);
-
   r = command (NULL, &err, "/sbin/tune2fs", "-U", uuid, device, NULL);
   if (r == -1) {
     reply_with_error ("tune2fs -U: %s", err);
@@ -181,13 +173,11 @@ do_set_e2uuid (char *device, char *uuid)
 }
 
 char *
-do_get_e2uuid (char *device)
+do_get_e2uuid (const char *device)
 {
   int r;
   char *out, *err, *p, *q;
 
-  IS_DEVICE (device, NULL);
-
   /* It's not so straightforward to get the volume UUID.  We have
    * to use tune2fs -l and then look for a particular string in
    * the output.
@@ -244,13 +234,11 @@ do_get_e2uuid (char *device)
 }
 
 int
-do_resize2fs (char *device)
+do_resize2fs (const char *device)
 {
   char *err;
   int r;
 
-  IS_DEVICE (device, -1);
-
   r = command (NULL, &err, "/sbin/resize2fs", device, NULL);
   if (r == -1) {
     reply_with_error ("resize2fs: %s", err);
@@ -263,13 +251,11 @@ do_resize2fs (char *device)
 }
 
 int
-do_e2fsck_f (char *device)
+do_e2fsck_f (const char *device)
 {
   char *err;
   int r;
 
-  IS_DEVICE (device, -1);
-
   r = command (NULL, &err, "/sbin/e2fsck", "-p", "-f", device, NULL);
   if (r == -1) {
     reply_with_error ("e2fsck: %s", err);
@@ -280,3 +266,152 @@ do_e2fsck_f (char *device)
   free (err);
   return 0;
 }
+
+int
+do_mke2journal (int blocksize, const char *device)
+{
+  char *err;
+  int r;
+
+  char blocksize_s[32];
+  snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
+
+  r = command (NULL, &err,
+              "/sbin/mke2fs", "-O", "journal_dev", "-b", blocksize_s,
+              device, NULL);
+  if (r == -1) {
+    reply_with_error ("mke2journal: %s", err);
+    free (err);
+    return -1;
+  }
+
+  free (err);
+  return 0;
+}
+
+int
+do_mke2journal_L (int blocksize, const char *label, const char *device)
+{
+  char *err;
+  int r;
+
+  char blocksize_s[32];
+  snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
+
+  r = command (NULL, &err,
+              "/sbin/mke2fs", "-O", "journal_dev", "-b", blocksize_s,
+              "-L", label,
+              device, NULL);
+  if (r == -1) {
+    reply_with_error ("mke2journal_L: %s", err);
+    free (err);
+    return -1;
+  }
+
+  free (err);
+  return 0;
+}
+
+int
+do_mke2journal_U (int blocksize, const char *uuid, const char *device)
+{
+  char *err;
+  int r;
+
+  char blocksize_s[32];
+  snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
+
+  r = command (NULL, &err,
+              "/sbin/mke2fs", "-O", "journal_dev", "-b", blocksize_s,
+              "-U", uuid,
+              device, NULL);
+  if (r == -1) {
+    reply_with_error ("mke2journal_U: %s", err);
+    free (err);
+    return -1;
+  }
+
+  free (err);
+  return 0;
+}
+
+int
+do_mke2fs_J (const char *fstype, int blocksize, const char *device,
+            const char *journal)
+{
+  char *err;
+  int r;
+
+  char blocksize_s[32];
+  snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
+
+  int len = strlen (journal);
+  char jdev[len+32];
+  snprintf (jdev, len+32, "device=%s", journal);
+
+  r = command (NULL, &err,
+              "/sbin/mke2fs", "-t", fstype, "-J", jdev, "-b", blocksize_s,
+              device, NULL);
+  if (r == -1) {
+    reply_with_error ("mke2fs_J: %s", err);
+    free (err);
+    return -1;
+  }
+
+  free (err);
+  return 0;
+}
+
+int
+do_mke2fs_JL (const char *fstype, int blocksize, const char *device,
+             const char *label)
+{
+  char *err;
+  int r;
+
+  char blocksize_s[32];
+  snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
+
+  int len = strlen (label);
+  char jdev[len+32];
+  snprintf (jdev, len+32, "device=LABEL=%s", label);
+
+  r = command (NULL, &err,
+              "/sbin/mke2fs", "-t", fstype, "-J", jdev, "-b", blocksize_s,
+              device, NULL);
+  if (r == -1) {
+    reply_with_error ("mke2fs_JL: %s", err);
+    free (err);
+    return -1;
+  }
+
+  free (err);
+  return 0;
+}
+
+int
+do_mke2fs_JU (const char *fstype, int blocksize, const char *device,
+             const char *uuid)
+{
+  char *err;
+  int r;
+
+  char blocksize_s[32];
+  snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
+
+  int len = strlen (uuid);
+  char jdev[len+32];
+  snprintf (jdev, len+32, "device=UUID=%s", uuid);
+
+  r = command (NULL, &err,
+              "/sbin/mke2fs", "-t", fstype, "-J", jdev, "-b", blocksize_s,
+              device, NULL);
+  if (r == -1) {
+    reply_with_error ("mke2fs_JU: %s", err);
+    free (err);
+    return -1;
+  }
+
+  free (err);
+  return 0;
+}