]> git.ipfire.org Git - thirdparty/util-linux.git/blob - libfdisk/src/utils.c
libfdisk: use new debug functions
[thirdparty/util-linux.git] / libfdisk / src / utils.c
1
2 #include "fdiskP.h"
3 #include "pathnames.h"
4
5 #include <ctype.h>
6
7
8 /*
9 * Zeros in-memory first sector buffer
10 */
11 void fdisk_zeroize_firstsector(struct fdisk_context *cxt)
12 {
13 if (!cxt || !cxt->firstsector)
14 return;
15
16 DBG(CONTEXT, ul_debug("zeroize in-memory first sector buffer"));
17 memset(cxt->firstsector, 0, cxt->sector_size);
18 }
19
20 int fdisk_read_firstsector(struct fdisk_context *cxt)
21 {
22 ssize_t r;
23
24 assert(cxt);
25 assert(cxt->sector_size);
26
27 DBG(TOPOLOGY, ul_debug("initialize first sector "
28 "buffer [sector_size=%lu]", cxt->sector_size));
29
30 if (!cxt->firstsector) {
31 cxt->firstsector = calloc(1, cxt->sector_size);
32 if (!cxt->firstsector)
33 return -ENOMEM;
34 } else
35 fdisk_zeroize_firstsector(cxt);
36
37 r = read(cxt->dev_fd, cxt->firstsector, cxt->sector_size);
38
39 if (r != cxt->sector_size) {
40 if (!errno)
41 errno = EINVAL; /* probably too small file/device */
42 DBG(TOPOLOGY, ul_debug("failed to read first sector %m"));
43 return -errno;
44 }
45
46 return 0;
47 }
48
49 /*
50 * Return allocated buffer with partition name
51 */
52 char *fdisk_partname(const char *dev, size_t partno)
53 {
54 char *res = NULL;
55 const char *p = "";
56 int w = 0;
57
58 if (!dev || !*dev) {
59 if (asprintf(&res, "%zd", partno) > 0)
60 return res;
61 return NULL;
62 }
63
64 w = strlen(dev);
65 if (isdigit(dev[w - 1]))
66 p = "p";
67
68 /* devfs kludge - note: fdisk partition names are not supposed
69 to equal kernel names, so there is no reason to do this */
70 if (strcmp(dev + w - 4, "disc") == 0) {
71 w -= 4;
72 p = "part";
73 }
74
75 /* udev names partitions by appending -partN
76 e.g. ata-SAMSUNG_SV8004H_0357J1FT712448-part1 */
77 if ((strncmp(dev, _PATH_DEV_BYID, sizeof(_PATH_DEV_BYID) - 1) == 0) ||
78 strncmp(dev, _PATH_DEV_BYPATH, sizeof(_PATH_DEV_BYPATH) - 1) == 0) {
79 p = "-part";
80 }
81
82 if (asprintf(&res, "%.*s%s%zu", w, dev, p, partno) > 0)
83 return res;
84
85 return NULL;
86 }
87
88 #ifdef TEST_PROGRAM
89 struct fdisk_label *fdisk_new_dos_label(struct fdisk_context *cxt) { return NULL; }
90 struct fdisk_label *fdisk_new_bsd_label(struct fdisk_context *cxt) { return NULL; }
91
92 int test_partnames(struct fdisk_test *ts, int argc, char *argv[])
93 {
94 size_t i;
95 const char *disk = argv[1];
96
97 for (i = 0; i < 5; i++) {
98 char *p = fdisk_partname(disk, i + 1);
99 if (p)
100 printf("%zu: '%s'\n", i + 1, p);
101 free(p);
102 }
103
104 return 0;
105 }
106
107 int main(int argc, char *argv[])
108 {
109 struct fdisk_test tss[] = {
110 { "--partnames", test_partnames, "<diskname>" },
111 { NULL }
112 };
113
114 return fdisk_run_test(tss, argc, argv);
115 }
116
117 #endif