• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/fstools/libblkid-tiny/libblkid-tiny.c

  1 #include <stdio.h>
  2 #include <sys/utsname.h>
  3 
  4 #include "libblkid-tiny.h"
  5 #include "superblocks.h"
  6 #include "linux_version.h"
  7 
  8 #if 0
  9 #define DEBUG(fmt, ...) printf(fmt, __VA_ARGS__)
 10 #else
 11 #define DEBUG(fmt, ...)
 12 #endif
 13 
 14 int blkid_debug_mask = 0;
 15 
 16 int get_linux_version (void)
 17 {
 18         static int kver = -1;
 19         struct utsname uts;
 20         int major = 0;
 21         int minor = 0;
 22         int teeny = 0;
 23         int n;
 24 
 25         if (kver != -1)
 26                 return kver;
 27         if (uname (&uts))
 28                 return kver = 0;
 29 
 30         n = sscanf(uts.release, "%d.%d.%d", &major, &minor, &teeny);
 31         if (n < 1 || n > 3)
 32                 return kver = 0;
 33 
 34         return kver = KERNEL_VERSION(major, minor, teeny);
 35 }
 36 
 37 int blkid_probe_is_tiny(blkid_probe pr)
 38 {
 39         /* never true ? */
 40         return 0;
 41 }
 42 
 43 int blkid_probe_set_value(blkid_probe pr, const char *name,
 44                 unsigned char *data, size_t len)
 45 {
 46         /* empty stub */
 47         return 0;
 48 }
 49 
 50 int blkid_probe_set_version(blkid_probe pr, const char *version)
 51 {
 52         int len = strlen(version);
 53         if (len > (sizeof(pr->version) - 1)) {
 54                 fprintf(stderr, "version buffer too small %d\n", len);
 55                 return -1;
 56         }
 57 
 58         strncpy(pr->version, version, sizeof(pr->version));
 59 
 60         return 0;
 61 }
 62 
 63 int blkid_probe_sprintf_version(blkid_probe pr, const char *fmt, ...)
 64 {
 65         va_list ap;
 66         int n;
 67 
 68         va_start(ap, fmt);
 69         n = vsnprintf(pr->version, sizeof(pr->version), fmt, ap);
 70         va_end(ap);
 71 
 72         if (n >= sizeof(pr->version))
 73                 fprintf(stderr, "version buffer too small %d\n", n);
 74 
 75         return 0;
 76 }
 77 
 78 unsigned char *blkid_probe_get_buffer(blkid_probe pr,
 79                                 blkid_loff_t off, blkid_loff_t len)
 80 {
 81         struct blkid_bufinfo *bf;
 82         int ret;
 83 
 84         bf = malloc(sizeof(*bf) + len);
 85         if (!bf)
 86                 return NULL;
 87         memset(bf, 0, sizeof(*bf));
 88         bf->data = ((unsigned char *)bf) + sizeof(*bf);
 89 
 90         if (lseek(pr->fd, off, SEEK_SET) < 0) {
 91                 fprintf(stderr, "failed to seek\n");
 92                 free(bf);
 93                 return NULL;
 94         }
 95         ret = read(pr->fd, bf->data, len);
 96 
 97         if (ret != len) {
 98                 fprintf(stderr, "failed to read blkid\n");
 99                 free(bf);
100                 return NULL;
101         }
102 
103         list_add_tail(&bf->bufs, &pr->buffers);
104 
105         return bf->data;
106 }
107 
108 int blkid_probe_set_id_label(blkid_probe pr, const char *name,
109                              const unsigned char *data, size_t len)
110 {
111         return -ENOTSUP;
112 }
113 
114 int blkid_probe_set_label(blkid_probe pr, unsigned char *label, size_t len)
115 {
116         if (len > (sizeof(pr->label) - 1)) {
117                 fprintf(stderr, "label buffer too small %d > %d\n",
118                         (int) len, (int) sizeof(pr->label) - 1);
119                 return -1;
120         }
121         memcpy(pr->label, label, len + 1);
122 
123         return 0;
124 }
125 
126 int blkid_probe_set_utf8label(blkid_probe pr, unsigned char *label,
127                                 size_t len, int enc)
128 {
129         if (len > (sizeof(pr->label) - 1)) {
130                 fprintf(stderr, "label buffer too small %d > %d\n",
131                         (int) len, (int) sizeof(pr->label) - 1);
132                 return -1;
133         }
134 
135         blkid_encode_to_utf8(enc,(unsigned char*) pr->label, len,
136                         label, len+1);
137 
138         return 0;
139 }
140 
141 int blkid_probe_set_uuid_as(blkid_probe pr, unsigned char *uuid, const char *name)
142 {
143         short unsigned int*u = (short unsigned int*) uuid;
144 
145         if (u[0] && (!name || !strcmp(name, "UUID"))) {
146                 sprintf(pr->uuid,
147                         "%04x%04x-%04x-%04x-%04x-%04x%04x%04x",
148                         be16_to_cpu(u[0]), be16_to_cpu(u[1]), be16_to_cpu(u[2]), be16_to_cpu(u[3]),
149                         be16_to_cpu(u[4]), be16_to_cpu(u[5]), be16_to_cpu(u[6]), be16_to_cpu(u[7]));
150         }
151 
152         return 0;
153 }
154 
155 int blkid_probe_set_uuid(blkid_probe pr, unsigned char *uuid)
156 {
157         return blkid_probe_set_uuid_as(pr, uuid, NULL);
158 }
159 
160 int blkid_probe_sprintf_uuid(blkid_probe pr, unsigned char *uuid,
161                              size_t len, const char *fmt, ...)
162 {
163         va_list ap;
164 
165         va_start(ap, fmt);
166         vsnprintf(pr->uuid, sizeof(pr->uuid), fmt, ap);
167         va_end(ap);
168 
169         return 0;
170 }
171 
172 static const struct blkid_idinfo *idinfos[] =
173 {
174         &vfat_idinfo,
175         &swsuspend_idinfo,
176         &swap_idinfo,
177         &exfat_idinfo,
178         &ext4dev_idinfo,
179         &ext4_idinfo,
180         &ext3_idinfo,
181         &ext2_idinfo,
182         &jbd_idinfo,
183         &ntfs_idinfo,
184         &squashfs_idinfo,
185         &ubi_idinfo,
186         &ubifs_idinfo,
187         &jffs2_idinfo,
188         &hfsplus_idinfo,
189         &hfs_idinfo,
190         &btrfs_idinfo,
191         &f2fs_idinfo,
192 };
193 
194 int probe_block(char *block, struct blkid_struct_probe *pr)
195 {
196         struct stat s;
197         int i;
198 
199         if (stat(block, &s) || (!S_ISBLK(s.st_mode) && !S_ISREG(s.st_mode) && !strncmp(block, "ubi", 3)))
200                 return -1;
201 
202         pr->err = -1;
203         pr->fd = open(block, O_RDONLY);
204         if (pr->fd == -1)
205                 return -1;
206 
207         for (i = 0; i < ARRAY_SIZE(idinfos); i++) {
208                 /* loop over all magic handlers */
209                 const struct blkid_idmag *mag;
210 
211                 /* loop over all probe handlers */
212                 DEBUG("scanning %s\n", idinfos[i]->name);
213 
214                 mag = &idinfos[i]->magics[0];
215 
216                 while (mag->magic) {
217                         int off = (mag->kboff * 1024) + mag->sboff;
218                         char magic[32] = { 0 };
219 
220                         if (lseek(pr->fd, off, SEEK_SET) < 0) {
221                                 close(pr->fd);
222                                 return -1;
223                         }
224                         if (read(pr->fd, magic, mag->len) < 0) {
225                                 close(pr->fd);
226                                 return -1;
227                         }
228                         DEBUG("magic: %s %s %d\n", mag->magic, magic, mag->len);
229                         if (!memcmp(mag->magic, magic, mag->len))
230                                 break;
231                         mag++;
232                 }
233 
234                 if (mag && mag->magic) {
235                         DEBUG("probing %s\n", idinfos[i]->name);
236                         pr->err = idinfos[i]->probefunc(pr, mag);
237                         pr->id = idinfos[i];
238                         if (!pr->err)
239                                 break;
240                 }
241         }
242 
243         close(pr->fd);
244 
245         return 0;
246 }
247 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt