]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: add readonly option to fdisk_new_context_from_filename()
authorKarel Zak <kzak@redhat.com>
Wed, 23 May 2012 09:24:04 +0000 (11:24 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 23 May 2012 09:24:04 +0000 (11:24 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisk/fdisk.c
fdisk/fdisk.h
fdisk/utils.c

index aac41a1ed4fe0f3b6c214e8be1d39f2fe2af90a3..e5cc90ede0580a807c0ac3693663516e8f69955d 100644 (file)
@@ -1927,7 +1927,7 @@ print_partition_table_from_option(char *device)
 {
        int gb;
 
-       cxt = fdisk_new_context_from_filename(device);
+       cxt = fdisk_new_context_from_filename(device, 1);       /* read-only */
        if (!cxt)
                err(EXIT_FAILURE, _("unable to open %s"), device);
 
@@ -1941,6 +1941,7 @@ print_partition_table_from_option(char *device)
        else if (!gb)
                list_table(0);
        fdisk_free_context(cxt);
+       cxt = NULL;
 }
 
 /*
@@ -2203,7 +2204,7 @@ int main(int argc, char **argv)
        }
 
        if (argc-optind == 1) {
-               cxt = fdisk_new_context_from_filename(argv[optind]);
+               cxt = fdisk_new_context_from_filename(argv[optind], 0);
                if (!cxt)
                        err(EXIT_FAILURE, _("unable to open %s"), argv[optind]);
        }
index bb210514cdd35649e253f299f85ebfdcae71ee33..fab2a3a1f0836508f34389b90af2f692ad33f538 100644 (file)
@@ -106,7 +106,8 @@ struct fdisk_context {
 };
 
 extern struct fdisk_context *cxt;
-extern struct fdisk_context *fdisk_new_context_from_filename(const char *fname);
+
+extern struct fdisk_context *fdisk_new_context_from_filename(const char *fname, int readonly);
 extern void fdisk_free_context(struct fdisk_context *cxt);
 
 /* prototypes for fdisk.c */
index 058fc64c5fcee39f8914024bc36756d44adb27ba..3a12e2e2895ee38aef78750163ccd596f2a5ea53 100644 (file)
@@ -58,7 +58,7 @@ void fdisk_init_debug(int mask)
  *
  * Returns: newly allocated fdisk context
  */
-struct fdisk_context *fdisk_new_context_from_filename(const char *fname)
+struct fdisk_context *fdisk_new_context_from_filename(const char *fname, int readonly)
 {
        int fd, errsv = 0;
        struct fdisk_context *cxt = NULL;
@@ -67,10 +67,10 @@ struct fdisk_context *fdisk_new_context_from_filename(const char *fname)
         * Attempt to open the device with r-w permissions
         * by default, otherwise try read-only.
         */
-       if ((fd = open(fname, O_RDWR)) < 0) {
+       if (readonly == 1 || (fd = open(fname, O_RDWR)) < 0) {
                if ((fd = open(fname, O_RDONLY)) < 0)
                        return NULL;
-               DBG(CONTEXT, printf("opened %s as read-only\n", fname));
+               readonly = 1;
        }
 
        cxt = calloc(1, sizeof(*cxt));
@@ -82,11 +82,15 @@ struct fdisk_context *fdisk_new_context_from_filename(const char *fname)
        if (!cxt->dev_path)
                goto fail;
 
+       DBG(CONTEXT, dbgprint("context initialized for %s [%s]",
+                       fname, readonly ? "READ-ONLY" : "READ-WRITE"));
        return cxt;
 fail:
        errsv = errno;
        fdisk_free_context(cxt);
        errno = errsv;
+
+       DBG(CONTEXT, dbgprint("failed to initialize context for %s: %m", fname));
        return NULL;
 }
 
@@ -101,6 +105,7 @@ void fdisk_free_context(struct fdisk_context *cxt)
        if (!cxt)
                return;
 
+       DBG(CONTEXT, dbgprint("freeing context for %s", cxt->dev_path));
        close(cxt->dev_fd);
        free(cxt->dev_path);
        free(cxt);