9 static char *mount_base;
15 #define DEVICE_MAP_SIZE 32
16 static struct device_map device_map[DEVICE_MAP_SIZE];
18 char *encode_label(const char *label)
23 /* the label can be expanded by up to four times */
24 str = malloc(strlen(label) * 4 + 1);
27 for (i = 0; i < strlen(label); i++) {
29 if (label[i] == '/' || label[i] == '\\') {
30 sprintf(c, "\\x%02x", label[i]);
43 char *parse_device_path(const char *dev_str, const char *cur_dev)
45 char *dev, tmp[256], *enc;
47 if (!strncasecmp(dev_str, "uuid=", 5)) {
48 asprintf(&dev, "/dev/disk/by-uuid/%s", dev_str + 5);
52 if (!strncasecmp(dev_str, "label=", 6)) {
53 enc = encode_label(dev_str + 6);
54 asprintf(&dev, "/dev/disk/by-label/%s", enc);
59 /* normalise '/dev/foo' to 'foo' for easy comparisons, we'll expand
60 * back before returning.
62 if (!strncmp(dev_str, "/dev/", 5))
65 /* PS3 hack: if we're reading from a ps3dx device, and we refer to
66 * a sdx device, remap to ps3dx */
67 if (cur_dev && !strncmp(cur_dev, "/dev/ps3d", 9)
68 && !strncmp(dev_str, "sd", 2)) {
69 snprintf(tmp, 255, "ps3d%s", dev_str + 2);
73 return join_paths("/dev", dev_str);
76 const char *mountpoint_for_device(const char *dev)
80 if (!strncmp(dev, "/dev/", 5))
83 /* check existing entries in the map */
84 for (i = 0; (i < DEVICE_MAP_SIZE) && device_map[i].dev; i++)
85 if (!strcmp(device_map[i].dev, dev))
86 return device_map[i].mnt;
88 if (i == DEVICE_MAP_SIZE)
91 device_map[i].dev = strdup(dev);
92 device_map[i].mnt = join_paths(mount_base, dev);
93 return device_map[i].mnt;
96 char *resolve_path(const char *path, const char *current_dev)
99 const char *devpath, *sep;
101 sep = strchr(path, ':');
103 devpath = mountpoint_for_device(current_dev);
104 ret = join_paths(devpath, path);
106 /* parse just the device name into dev */
108 tmp = strndup(path, sep - path);
109 dev = parse_device_path(tmp, current_dev);
111 devpath = mountpoint_for_device(dev);
112 ret = join_paths(devpath, sep + 1);
121 void set_mount_base(const char *path)
125 mount_base = strdup(path);
128 char *join_paths(const char *a, const char *b)
132 full_path = malloc(strlen(a) + strlen(b) + 2);
134 strcpy(full_path, a);
135 if (b[0] != '/' && a[strlen(a) - 1] != '/')
136 strcat(full_path, "/");
137 strcat(full_path, b);