Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset ef9dac04 in mainline


Ignore:
Timestamp:
2015-10-22T20:21:03Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
9854a8f
Parents:
21f1543
Message:

Confirm destructive actions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/fdisk/fdisk.c

    r21f1543 ref9dac04  
    6565} devac_t;
    6666
     67/** Confirm user selection. */
     68static int fdsk_confirm(const char *msg, bool *rconfirm)
     69{
     70        tinput_t *tinput = NULL;
     71        char *answer;
     72        int rc;
     73
     74        tinput = tinput_new();
     75        if (tinput == NULL) {
     76                rc = ENOMEM;
     77                goto error;
     78        }
     79
     80        rc = tinput_set_prompt(tinput, "y/n> ");
     81        if (rc != EOK)
     82                goto error;
     83
     84        while (true) {
     85                printf("%s\n", msg);
     86
     87                rc = tinput_read(tinput, &answer);
     88                if (rc == ENOENT) {
     89                        *rconfirm = false;
     90                        free(answer);
     91                        break;
     92                }
     93
     94                if (rc != EOK)
     95                        goto error;
     96
     97                if (str_cmp(answer, "y") == 0) {
     98                        *rconfirm = true;
     99                        free(answer);
     100                        break;
     101                } else if (str_cmp(answer, "n") == 0) {
     102                        *rconfirm = false;
     103                        free(answer);
     104                        break;
     105                }
     106        }
     107
     108        tinput_destroy(tinput);
     109        return EOK;
     110error:
     111        if (tinput != NULL)
     112                tinput_destroy(tinput);
     113        return rc;
     114}
     115
    67116/** Device selection */
    68117static int fdsk_dev_sel_choice(service_id_t *rsvcid)
     
    254303static int fdsk_delete_label(fdisk_dev_t *dev)
    255304{
     305        bool confirm;
    256306        int rc;
     307
     308        rc = fdsk_confirm("Warning. Any data on disk will be lost. "
     309            "Really delete label?", &confirm);
     310        if (rc != EOK) {
     311                printf("Error getting user confirmation.\n");
     312                return rc;
     313        }
     314
     315        if (!confirm)
     316                return EOK;
    257317
    258318        rc = fdisk_label_destroy(dev);
     
    267327static int fdsk_erase_disk(fdisk_dev_t *dev)
    268328{
     329        bool confirm;
    269330        int rc;
     331
     332        rc = fdsk_confirm("Warning. Any data on disk will be lost. "
     333            "Really erase disk?", &confirm);
     334        if (rc != EOK) {
     335                printf("Error getting user confirmation.\n");
     336                return rc;
     337        }
     338
     339        if (!confirm)
     340                return EOK;
    270341
    271342        rc = fdisk_dev_erase(dev);
     
    422493        char *sfstype = NULL;
    423494        char *sdesc = NULL;
     495        bool confirm;
    424496        void *sel;
    425497        int rc;
     
    507579
    508580        rc = nchoice_get(choice, &sel);
     581        if (rc == ENOENT)
     582                return EOK;
    509583        if (rc != EOK) {
    510584                printf("Error getting user selection.\n");
     
    512586        }
    513587
    514         if (sel != NULL) {
    515                 rc = fdisk_part_destroy((fdisk_part_t *)sel);
    516                 if (rc != EOK) {
    517                         printf("Error deleting partition.\n");
    518                         return rc;
    519                 }
    520         }
    521588
    522589        nchoice_destroy(choice);
     590        choice = NULL;
     591
     592        if (sel == NULL)
     593                return EOK;
     594
     595        rc = fdsk_confirm("Warning. Any data in partition will be lost. "
     596            "Really delete partition?", &confirm);
     597        if (rc != EOK) {
     598                printf("Error getting user confirmation.\n");
     599                goto error;
     600        }
     601
     602        if (!confirm)
     603                return EOK;
     604
     605        rc = fdisk_part_destroy((fdisk_part_t *)sel);
     606        if (rc != EOK) {
     607                printf("Error deleting partition.\n");
     608                return rc;
     609        }
     610
    523611        return EOK;
    524612error:
Note: See TracChangeset for help on using the changeset viewer.