wmhdplop: Add version 0.9.9 to repository.
[dockapps.git] / wmhdplop / devnames.c
blobba7b8216efa4570728c699d98486c40f60ca497d
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <unistd.h>
8 #include <linux/major.h>
9 #include <ctype.h>
10 #include "global.h"
11 #include "devnames.h"
13 static DiskList *dlist = NULL;
15 const char *stripdev(const char *s) {
16 if (strncmp(s,"/dev",4) == 0) s+= 4;
17 if (s[0] == '/') s++;
18 return s;
21 DiskList *find_dev(unsigned major, unsigned minor) {
22 DiskList *dl;
23 for (dl = dlist; dl; dl = dl->next) {
24 if (dl->major == major && dl->minor == minor) return dl;
26 return NULL;
29 DiskList *find_id(int hd_id, int part_id) {
30 DiskList *dl;
31 for (dl = dlist; dl; dl = dl->next) {
32 if (((dl->hd_id == hd_id) || hd_id == -1) &&
33 ((dl->part_id == part_id) || part_id == -1)) return dl;
35 return NULL;
38 DiskList *find_dev_by_name(const char *name) {
39 DiskList *dl;
40 const char *sname = stripdev(name);
41 for (dl = dlist; dl; dl = dl->next) {
42 if (strcmp(sname, dl->name)==0) return dl;
44 return NULL;
45 }*/
47 DiskList *next_hd_in_list(DiskList *prev) {
48 DiskList *dl = (prev ? prev->next : dlist);
49 while (dl && IS_PARTITION(dl)) dl = dl->next;
50 return dl;
53 DiskList *first_hd_in_list() {
54 return next_hd_in_list(NULL);
57 DiskList *first_dev_in_list() {
58 return dlist;
61 int nb_hd_in_list() {
62 int i=0;
63 DiskList *dl;
64 for (dl = first_hd_in_list(); dl; dl = next_hd_in_list(dl)) ++i;
65 return i;
68 int nb_dev_in_list() {
69 int i=0;
70 DiskList *dl;
71 for (dl = dlist; dl; dl = dl->next) ++i;
72 return i;
75 /*int is_partition_name(const char *name) {
76 int l = strlen(name);
77 if (l && name[l-1] >= '0' && name[l-1] <= '9') return 1;
78 return 0;
82 static const char *to_num_(unsigned minor) {
83 static char id[16];
84 if (minor == 0) return "";
85 else snprintf(id,16,"%d",minor);
86 return id;
89 int device_info(unsigned major, unsigned minor, char *name, int *hd_id, int *part_id) {
90 switch(major) {
91 #ifdef SCSI_DISK0_MAJOR
92 case (SCSI_DISK0_MAJOR):
93 #else
94 case (SCSI_DISK_MAJOR):
95 #endif
96 if (name) sprintf(name, "sd%c%s", "abcdefghijklmnop"[(minor)/16], to_num_(minor%16));
97 if (hd_id) *hd_id = (minor)/16;
98 if (part_id) *part_id = minor%16;
99 return 1;
100 case IDE0_MAJOR:
101 if (name) sprintf(name, "hd%c%s", "ab"[(minor)/64], to_num_(minor%64));
102 if (hd_id) *hd_id = 100 + (minor)/64;
103 if (part_id) *part_id = minor%64;
104 return 2;
105 case IDE1_MAJOR:
106 if (name) sprintf(name, "hd%c%s", "cd"[(minor)/64], to_num_(minor%64));
107 if (hd_id) *hd_id = 200 + (minor)/64;
108 if (part_id) *part_id = minor%64;
109 return 3;
110 #ifdef IDE2_MAJOR
111 case IDE2_MAJOR:
112 if (name) sprintf(name, "hd%c%s", "ef"[(minor)/64], to_num_(minor%64));
113 if (hd_id) *hd_id = 300 + (minor)/64;
114 if (part_id) *part_id = minor%64;
115 return 4;
116 #endif
117 #ifdef IDE3_MAJOR
118 case IDE3_MAJOR:
119 if (name) sprintf(name, "hd%c%s", "gh"[(minor)/64], to_num_(minor%64));
120 if (hd_id) *hd_id = 400 + (minor)/64;
121 if (part_id) *part_id = minor%64;
122 return 5;
123 #endif
124 #ifdef IDE4_MAJOR
125 case IDE4_MAJOR:
126 if (name) sprintf(name, "hd%c%s", "ij"[(minor)/64], to_num_(minor%64));
127 if (hd_id) *hd_id = 400 + (minor)/64;
128 if (part_id) *part_id = minor%64;
129 return 6;
130 #endif
132 #ifdef IDE5_MAJOR
133 case IDE5_MAJOR:
134 if (name) sprintf(name, "hd%c%s", "kl"[(minor)/64], to_num_(minor%64));
135 if (hd_id) *hd_id = 400 + (minor)/64;
136 if (part_id) *part_id = minor%64;
137 return 7;
138 #endif
140 #ifdef IDE6_MAJOR
141 case IDE6_MAJOR:
142 if (name) sprintf(name, "hd%c%s", "mn"[(minor)/64], to_num_(minor%64));
143 if (hd_id) *hd_id = 400 + (minor)/64;
144 if (part_id) *part_id = minor%64;
145 return 8;
146 #endif
149 #ifdef MD_MAJOR
150 case (MD_MAJOR):
151 if (name) sprintf(name, "md%s", to_num_(minor));
152 if (hd_id) *hd_id = 400 + minor;
153 if (part_id) *part_id = 0;
154 return 9;
155 #endif
157 if (name) *name = 0;
158 if (hd_id) *hd_id = -1;
159 if (part_id) *part_id = -1;
160 return 0;
163 int short_name_for_device(unsigned major, unsigned minor, char *name) {
164 return device_info(major,minor,name,NULL,NULL);
167 int is_partition(unsigned major, unsigned minor) {
168 int part_id;
169 if (!device_info(major,minor,NULL,NULL,&part_id)) return 0;
170 return (part_id != 0);
173 int device_id_from_name(const char *devname__, unsigned *pmajor, unsigned *pminor) {
174 if (strlen(devname__)>=512) return -1;
175 char *devname_, devname[512];
177 devname_ = str_substitute(devname__, "/dev/mapper", "/dev");
179 struct stat stat_buf;
180 BLAHBLAH(1,printf("looking for %s in /dev..\n", devname_));
182 if (devname_[0] != '/') snprintf(devname,512,"/dev/%s", devname_);
183 else snprintf(devname,512,"%s",devname_);
185 free(devname_); devname_ = 0;
187 if (lstat(devname,&stat_buf)) { BLAHBLAH(1,perror(devname)); return -1; }
188 if (S_ISLNK(stat_buf.st_mode)) {
189 char lname[512];
190 int n = readlink(devname, lname, 511); lname[n] = 0;
191 snprintf(devname,512,"/dev/%s",stripdev(lname));
192 if (stat(devname,&stat_buf)) { BLAHBLAH(1,perror(devname)); return -1; }
194 if (!S_ISBLK(stat_buf.st_mode)) {
195 fprintf(stderr, "%s is not a block device..\n", devname);
196 return -2;
198 *pmajor = major(stat_buf.st_rdev);
199 *pminor = minor(stat_buf.st_rdev);
200 return 0;
205 /* add a hard-drive if it is a regular ide/scsi/md disk/partition, or return NULL */
206 static DiskList *create_device(unsigned major, unsigned minor, const char *mtab_name) {
207 DiskList *dl;
208 char dev_path[512];
209 ALLOC_OBJ(dl);
210 if (mtab_name && strlen(mtab_name)) dl->name = strdup(mtab_name);
211 else {
212 char s[512]; short_name_for_device(major,minor,s); dl->name = strdup(s);
214 BLAHBLAH(1, printf("create_device(major=%d, minor=%d, mtab_name=%s) : name=%s\n", major,minor,mtab_name,dl->name));
215 dl->major = major; dl->minor = minor;
216 if (device_info(major,minor,dev_path,&dl->hd_id,&dl->part_id) == 0) {
217 BLAHBLAH(1, printf("(%d,%d) is not a known disc type..\n", major,minor));
218 free(dl); return NULL;
220 dl->dev_path = malloc(strlen(dev_path)+6); assert(dl->dev_path);
221 sprintf(dl->dev_path, "/dev/%s", dev_path);
222 dl->next = NULL;
223 if (dl->part_id == 0)
224 dl->enable_hddtemp = 1;
225 return dl;
228 /* add a device (after checking that it is a known device type) */
229 int add_device_by_name(const char *devname, const char *mtab_name) {
230 unsigned major, minor;
232 BLAHBLAH(1,printf("add_device_by_name(%s,%s)\n", devname, mtab_name));
233 if (device_id_from_name(devname, &major, &minor) != 0) return -1;
235 return add_device_by_id(major,minor,mtab_name);
238 /* add a device (after checking that it is a known device type) */
239 int add_device_by_id(unsigned major, unsigned minor, const char *mtab_name) {
240 DiskList *dl, *next, *prev;
241 BLAHBLAH(1,printf("add_device_by_id(%d,%d,%s)\n", major, minor,mtab_name));
242 /* already known ? */
243 if (find_dev(major,minor)) return -1;
244 /* check for known ide/scsi/md disks and then create */
245 dl = create_device(major, minor, mtab_name); if (!dl) return -1;
247 for (next = dlist, prev = NULL; next; next=next->next) {
248 if (dl->hd_id > next->hd_id || (dl->hd_id == next->hd_id && dl->part_id > next->part_id)) break;
249 prev = next;
251 if (prev == NULL) {
252 dl->next = dlist; dlist = dl;
253 } else {
254 dl->next = prev->next; prev->next = dl;
256 return 0;
259 strlist *swaplst = NULL;
260 void add_swap(const char *swapdev) {
261 swaplst = strlist_ins(swaplst, swapdev);
263 strlist *swap_list() {
264 return swaplst;