-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscsi.c
More file actions
117 lines (87 loc) · 2.84 KB
/
Copy pathscsi.c
File metadata and controls
117 lines (87 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "scsi.h"
#include "display.h"
TDevice *SCSIDeviceLoad(const char *Path)
{
TDevice *dev;
char *Tempstr=NULL, *Key=NULL;
const char *ptr;
glob_t Glob;
int val;
dev=(TDevice *) calloc(1, sizeof(TDevice));
dev->BusType=CopyStr(dev->BusType, "scsi");
dev->Address=CopyStr(dev->Address, GetBasename(Path));
dev->Vendor=ReadFile(dev->Vendor, Path, "vendor");
dev->Serial=ReadFile(dev->Serial, Path, "wwid");
dev->idClass=ReadFile(dev->idClass, Path, "type");
if (! dev->idClass) dev->idClass=CopyStr(dev->idClass, "");
LookupAnyDevNode(dev, Path);
Tempstr=MCopyStr(Tempstr, "/block/", dev->DevNode, "/size", NULL);
dev->Size=ReadUint64File(Path, Tempstr) * 512;
Tempstr=MCopyStr(Tempstr, "/block/", dev->DevNode, "/removable", NULL);
val=ReadIntegerFile(Path, Tempstr);
if (val) dev->Flags |= FLAG_REMOVABLE;
Tempstr=MCopyStr(Tempstr, "/block/", dev->DevNode, "/ro", NULL);
val=ReadIntegerFile(Path, Tempstr);
if (val) dev->Flags |= FLAG_READONLY;
if (dev->Flags & FLAG_REMOVABLE) dev->Class=CatStr(dev->Class, "removable ");
if (dev->Flags & FLAG_READONLY) dev->Class=CatStr(dev->Class, "read-only ");
switch (atoi(dev->idClass))
{
case 0:
Tempstr=MCopyStr(Tempstr, "/block/", dev->DevNode, "/queue/rotational", NULL);
val=ReadIntegerFile(Path, Tempstr);
if (val==0) dev->Class=CatStr(dev->Class, "SSD");
else dev->Class=CatStr(dev->Class, "HDD");
break;
case 1:
dev->Class=CatStr(dev->Class, "tape");
break;
case 3:
dev->Class=CatStr(dev->Class, "processor");
break;
case 4:
dev->Class=CatStr(dev->Class, "worm drive");
break;
case 5:
dev->Class=CatStr(dev->Class, "rom");
break;
case 6:
dev->Class=CatStr(dev->Class, "scanner");
break;
case 7:
dev->Class=CatStr(dev->Class, "dvd/cd");
break;
case 8:
dev->Class=CatStr(dev->Class, "changer");
break;
case 0xc:
dev->Class=CatStr(dev->Class, "raid controller");
break;
case 0xd:
dev->Class=CatStr(dev->Class, "enclosure");
break;
default:
if (StrValid(dev->idClass)) dev->Class=FormatStr(dev->Class, "class:%s", dev->idClass);
else dev->Class=CopyStr(dev->Class, "class:unknown");
break;
}
dev->Description=ReadFile(dev->Description, Path, "model");
Destroy(Tempstr);
Destroy(Key);
return(dev);
}
void SCSIShow(int Flags)
{
glob_t Glob;
char *Tempstr=NULL;
TDevice *dev;
int i;
glob("/sys/bus/scsi/devices/*", 0, 0, &Glob);
for (i=0; i < Glob.gl_pathc; i++)
{
dev=SCSIDeviceLoad(Glob.gl_pathv[i]);
if (StrLen(dev->Description)) DeviceDisplay(Flags, dev);
TDeviceDestroy(dev);
}
Destroy(Tempstr);
}