0004-libfdisk-add-fdisk_set_disklabel_id_from_string.patch 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. From e5f31446166de7212213c62a019945afb8e197ef Mon Sep 17 00:00:00 2001
  2. From: Karel Zak <kzak@redhat.com>
  3. Date: Tue, 14 Jan 2020 11:43:24 +0100
  4. Subject: [PATCH] libfdisk: add fdisk_set_disklabel_id_from_string()
  5. We have fdisk_set_disklabel_id(), but it's old ask-API based function.
  6. It's not comfortable if you want to avoid dialog or template.
  7. Addresses: https://github.com/karelzak/util-linux/issues/916
  8. Signed-off-by: Karel Zak <kzak@redhat.com>
  9. ---
  10. libfdisk/docs/libfdisk-sections.txt | 1 +
  11. libfdisk/src/dos.c | 29 ++++++++++++++++++-----------
  12. libfdisk/src/fdiskP.h | 2 +-
  13. libfdisk/src/gpt.c | 18 ++++++++++--------
  14. libfdisk/src/label.c | 19 ++++++++++++++++++-
  15. libfdisk/src/libfdisk.h.in | 1 +
  16. libfdisk/src/libfdisk.sym | 3 +++
  17. 7 files changed, 52 insertions(+), 21 deletions(-)
  18. diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt
  19. index f148da527..6675c1100 100644
  20. --- a/libfdisk/docs/libfdisk-sections.txt
  21. +++ b/libfdisk/docs/libfdisk-sections.txt
  22. @@ -81,6 +81,7 @@ fdisk_list_disklabel
  23. fdisk_locate_disklabel
  24. fdisk_reorder_partitions
  25. fdisk_set_disklabel_id
  26. +fdisk_set_disklabel_id_from_string
  27. fdisk_set_partition_type
  28. fdisk_toggle_partition_flag
  29. fdisk_verify_disklabel
  30. diff --git a/libfdisk/src/dos.c b/libfdisk/src/dos.c
  31. index 53713ec5f..98314dfa6 100644
  32. --- a/libfdisk/src/dos.c
  33. +++ b/libfdisk/src/dos.c
  34. @@ -707,12 +707,12 @@ static int dos_create_disklabel(struct fdisk_context *cxt)
  35. return 0;
  36. }
  37. -static int dos_set_disklabel_id(struct fdisk_context *cxt)
  38. +static int dos_set_disklabel_id(struct fdisk_context *cxt, const char *str)
  39. {
  40. - char *end = NULL, *str = NULL;
  41. + char *str0 = str;
  42. unsigned int id, old;
  43. struct fdisk_dos_label *l;
  44. - int rc;
  45. + int rc = 0;
  46. assert(cxt);
  47. assert(cxt->label);
  48. @@ -722,18 +722,25 @@ static int dos_set_disklabel_id(struct fdisk_context *cxt)
  49. l = self_label(cxt);
  50. old = mbr_get_id(cxt->firstsector);
  51. - rc = fdisk_ask_string(cxt,
  52. +
  53. + if (!str)
  54. + rc = fdisk_ask_string(cxt,
  55. _("Enter the new disk identifier"), &str);
  56. - if (rc)
  57. - return rc;
  58. + if (!rc) {
  59. + char *end = NULL;
  60. - errno = 0;
  61. - id = strtoul(str, &end, 0);
  62. - if (errno || str == end || (end && *end)) {
  63. - fdisk_warnx(cxt, _("Incorrect value."));
  64. - return -EINVAL;
  65. + errno = 0;
  66. + id = strtoul(str, &end, 0);
  67. + if (errno || str == end || (end && *end)) {
  68. + fdisk_warnx(cxt, _("Incorrect value."));
  69. + rc = -EINVAL;
  70. + }
  71. }
  72. + if (!str0)
  73. + free(str);
  74. + if (rc)
  75. + return -EINVAL;
  76. mbr_set_id(cxt->firstsector, id);
  77. l->non_pt_changed = 1;
  78. diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
  79. index fefebae2a..0487466e3 100644
  80. --- a/libfdisk/src/fdiskP.h
  81. +++ b/libfdisk/src/fdiskP.h
  82. @@ -220,7 +220,7 @@ struct fdisk_label_operations {
  83. /* get details from label */
  84. int (*get_item)(struct fdisk_context *cxt, struct fdisk_labelitem *item);
  85. /* set disk label ID */
  86. - int (*set_id)(struct fdisk_context *cxt);
  87. + int (*set_id)(struct fdisk_context *cxt, const char *str);
  88. /* new partition */
  89. diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c
  90. index f50bb4441..9608053a2 100644
  91. --- a/libfdisk/src/gpt.c
  92. +++ b/libfdisk/src/gpt.c
  93. @@ -2502,11 +2502,11 @@ done:
  94. return rc;
  95. }
  96. -static int gpt_set_disklabel_id(struct fdisk_context *cxt)
  97. +static int gpt_set_disklabel_id(struct fdisk_context *cxt, const char *str)
  98. {
  99. struct fdisk_gpt_label *gpt;
  100. struct gpt_guid uuid;
  101. - char *str, *old, *new;
  102. + char *old, *new;
  103. int rc;
  104. assert(cxt);
  105. @@ -2514,12 +2514,14 @@ static int gpt_set_disklabel_id(struct fdisk_context *cxt)
  106. assert(fdisk_is_label(cxt, GPT));
  107. gpt = self_label(cxt);
  108. - if (fdisk_ask_string(cxt,
  109. - _("Enter new disk UUID (in 8-4-4-4-12 format)"), &str))
  110. - return -EINVAL;
  111. -
  112. - rc = string_to_guid(str, &uuid);
  113. - free(str);
  114. + if (!str) {
  115. + if (fdisk_ask_string(cxt,
  116. + _("Enter new disk UUID (in 8-4-4-4-12 format)"), &str))
  117. + return -EINVAL;
  118. + rc = string_to_guid(str, &uuid);
  119. + free(str);
  120. + } else
  121. + rc = string_to_guid(str, &uuid);
  122. if (rc) {
  123. fdisk_warnx(cxt, _("Failed to parse your UUID."));
  124. diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c
  125. index a18cdeaff..fd4555de2 100644
  126. --- a/libfdisk/src/label.c
  127. +++ b/libfdisk/src/label.c
  128. @@ -481,7 +481,24 @@ int fdisk_set_disklabel_id(struct fdisk_context *cxt)
  129. return -ENOSYS;
  130. DBG(CXT, ul_debugobj(cxt, "setting %s disk ID", cxt->label->name));
  131. - return cxt->label->op->set_id(cxt);
  132. + return cxt->label->op->set_id(cxt, NULL);
  133. +}
  134. +
  135. +/**
  136. + * fdisk_set_disklabel_id_from_string
  137. + * @cxt: fdisk context
  138. + *
  139. + * Returns: 0 on success, otherwise, a corresponding error.
  140. + */
  141. +int fdisk_set_disklabel_id_from_string(struct fdisk_context *cxt, const char *str)
  142. +{
  143. + if (!cxt || !cxt->label || !str)
  144. + return -EINVAL;
  145. + if (!cxt->label->op->set_id)
  146. + return -ENOSYS;
  147. +
  148. + DBG(CXT, ul_debugobj(cxt, "setting %s disk ID from '%s'", cxt->label->name, str));
  149. + return cxt->label->op->set_id(cxt, str);
  150. }
  151. /**
  152. diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in
  153. index 0669c0a7c..2ba34dc0a 100644
  154. --- a/libfdisk/src/libfdisk.h.in
  155. +++ b/libfdisk/src/libfdisk.h.in
  156. @@ -399,6 +399,7 @@ extern int fdisk_get_disklabel_item(struct fdisk_context *cxt, int id, struct fd
  157. extern int fdisk_get_disklabel_id(struct fdisk_context *cxt, char **id);
  158. extern int fdisk_set_disklabel_id(struct fdisk_context *cxt);
  159. +extern int fdisk_set_disklabel_id_from_string(struct fdisk_context *cxt, const char *str);
  160. extern int fdisk_get_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition **pa);
  161. extern int fdisk_set_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition *pa);
  162. diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym
  163. index 96fcadd71..eee2d6bda 100644
  164. --- a/libfdisk/src/libfdisk.sym
  165. +++ b/libfdisk/src/libfdisk.sym
  166. @@ -308,3 +308,6 @@ FDISK_2.35 {
  167. fdisk_script_set_table;
  168. fdisk_assign_device_by_fd;
  169. } FDISK_2.33;
  170. +FDISK_2.36 {
  171. + fdisk_set_disklabel_id_from_string;
  172. +} FDISK_2.35;
  173. --
  174. 2.18.2