From: Karel Zak Date: Wed, 23 May 2012 09:24:04 +0000 (+0200) Subject: fdisk: add readonly option to fdisk_new_context_from_filename() X-Git-Tag: v2.22-rc1~369 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7657d3e217edd89f220fef4008aafd4a7a970193;p=thirdparty%2Futil-linux.git fdisk: add readonly option to fdisk_new_context_from_filename() Signed-off-by: Karel Zak --- diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c index aac41a1ed4..e5cc90ede0 100644 --- a/fdisk/fdisk.c +++ b/fdisk/fdisk.c @@ -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]); } diff --git a/fdisk/fdisk.h b/fdisk/fdisk.h index bb210514cd..fab2a3a1f0 100644 --- a/fdisk/fdisk.h +++ b/fdisk/fdisk.h @@ -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 */ diff --git a/fdisk/utils.c b/fdisk/utils.c index 058fc64c5f..3a12e2e289 100644 --- a/fdisk/utils.c +++ b/fdisk/utils.c @@ -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);