- win32: more error handling for failed system-calls

- win32: prepare code for unicode compilation
This commit is contained in:
Stefan Gehn 2008-02-08 22:33:37 +00:00
parent 921ece54f9
commit 0db0b41476
1 changed files with 366 additions and 293 deletions

View File

@ -49,6 +49,14 @@
#include <ntdef.h> #include <ntdef.h>
#if defined(UNICODE) ^ defined(_UNICODE)
#error Inconsistent UNICODE and _UNICODE definition
#endif
#if !defined(ARRAYSIZE)
#define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
// *************************************************************************** // ***************************************************************************
// Needed to determine pagefile usage // Needed to determine pagefile usage
// definitions were taken from MinGW include/ddk/ntapi.h because you cannot // definitions were taken from MinGW include/ddk/ntapi.h because you cannot
@ -102,8 +110,8 @@ typedef enum PerfKey_T
static gint numCPUs; static gint numCPUs;
//static gulong swapin, swapout; //static gulong swapin, swapout;
static TCHAR netName[MAX_NET_ADAPTERS + 1][MAX_NET_NAME + 1]; static char netName[MAX_NET_ADAPTERS + 1][MAX_NET_NAME + 1];
static TCHAR diskName[MAX_DISKS + 1][MAX_DISK_NAME + 1]; static char diskName[MAX_DISKS + 1][MAX_DISK_NAME + 1];
static gint numAdapters = 0; static gint numAdapters = 0;
static int rx[MAX_NET_ADAPTERS + 1]; static int rx[MAX_NET_ADAPTERS + 1];
static int tx[MAX_NET_ADAPTERS + 1]; static int tx[MAX_NET_ADAPTERS + 1];
@ -127,6 +135,35 @@ static HCOUNTER netRecCounter[MAX_NET_ADAPTERS + 1];
static HCOUNTER netSendCounter[MAX_NET_ADAPTERS + 1]; static HCOUNTER netSendCounter[MAX_NET_ADAPTERS + 1];
static PDH_STATUS status; static PDH_STATUS status;
/* TODO: group static globals in structs
typedef struct _GK_DISC
{
gchar name[MAX_DISK_NAME + 1];
gulong read;
gulong written;
HCOUNTER read_counter;
HCOUNTER diskWriteCounter;
} GK_DISC;
static GK_DISC s_disk[MAX_DISKS + 1];
static guint s_disk_cnt = 0;
typedef struct _GK_NET
{
gchar name[MAX_NET_NAME + 1];
gulong rx, tx;
HCOUNTER recv_counter, send_counter;
} GK_NET;
static GK_NET s_net[MAX_NET_ADAPTERS + 1];
static guint s_net_cnt = 0;
*/
// ***************************************************************** // *****************************************************************
// local function protos // local function protos
@ -149,21 +186,21 @@ void gkrellm_sys_main_init(void)
int err; int err;
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Starting Winsock\n"); _tprintf(_T("Starting Winsock\n"));
err = WSAStartup(MAKEWORD(1,1), &wsdata); err = WSAStartup(MAKEWORD(1,1), &wsdata);
if (err != 0) if (err != 0)
{ {
printf("Starting Winsock failed with error code %i\n", err); _tprintf(_T("Starting Winsock failed with error code %i\n"), err);
return; return;
} }
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Opening Pdh\n"); _tprintf(_T("Opening pdh-query\n"));
status = PdhOpenQuery(NULL, 0, &pdhQueryHandle); status = PdhOpenQuery(NULL, 0, &pdhQueryHandle);
if (status != ERROR_SUCCESS || pdhQueryHandle == 0) if (status != ERROR_SUCCESS || pdhQueryHandle == 0)
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Opening Pdh failed with error code %ld\n", status); _tprintf(_T("Opening pdh-query failed with error code %lu\n"), status);
pdhQueryHandle = 0; pdhQueryHandle = 0;
} }
// get perflib localized key names // get perflib localized key names
@ -194,7 +231,7 @@ void gkrellm_sys_main_cleanup(void)
#endif // WIN32_CLIENT #endif // WIN32_CLIENT
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Waiting for mail checking thread to end.\n"); _tprintf(_T("Waiting for mail checking thread to end.\n"));
while (gkrellm_mail_get_active_thread() != NULL) while (gkrellm_mail_get_active_thread() != NULL)
{ {
@ -205,7 +242,7 @@ void gkrellm_sys_main_cleanup(void)
// Close PDH query-handle // Close PDH query-handle
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Closing Pdh\n"); _tprintf(_T("Closing Pdh\n"));
PdhCloseQuery(pdhQueryHandle); PdhCloseQuery(pdhQueryHandle);
// free up these strings // free up these strings
@ -217,7 +254,7 @@ void gkrellm_sys_main_cleanup(void)
// stop winsock // stop winsock
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Closing Winsock\n"); _tprintf(_T("Closing Winsock\n"));
WSACleanup(); WSACleanup();
} }
@ -233,14 +270,13 @@ static void win32_read_proc_stat(void)
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
{ {
printf("Collecting PDH query data\n"); _tprintf(_T("Collecting PDH query data\n"));
} }
status = PdhCollectQueryData(pdhQueryHandle); status = PdhCollectQueryData(pdhQueryHandle);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Collecting PDH query data failed with status %ld\n", _tprintf(_T("Collecting PDH query data failed with status %lu\n"), status);
status);
} }
} }
@ -370,7 +406,7 @@ static gboolean ReadSharedData(void)
sens_data_read_tick = gkrellm_get_timer_ticks(); sens_data_read_tick = gkrellm_get_timer_ticks();
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Reading MBM or SpeedFan data\n"); _tprintf(_T("Reading MBM or SpeedFan data\n"));
// Try getting data from MBM // Try getting data from MBM
sens_data_valid = ReadMBMSharedData(); sens_data_valid = ReadMBMSharedData();
@ -391,7 +427,7 @@ static gboolean ReadMBMSharedData(void)
int i, j; int i, j;
int totalCount; int totalCount;
hSData=OpenFileMapping(FILE_MAP_READ, FALSE, "$M$B$M$5$S$D$"); hSData=OpenFileMapping(FILE_MAP_READ, FALSE, _T("$M$B$M$5$S$D$"));
if (hSData == 0) if (hSData == 0)
return FALSE; return FALSE;
@ -543,7 +579,7 @@ gboolean gkrellm_sys_sensors_init(void)
int i; int i;
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initializing sensors.\n"); _tprintf(_T("INIT sensors\n"));
//TODO: determine number of sensors at startup? This could cause //TODO: determine number of sensors at startup? This could cause
// user confusion in case mbm/speedfan is started after gkrellm // user confusion in case mbm/speedfan is started after gkrellm
@ -617,7 +653,7 @@ void gkrellm_sys_cpu_read_data(void)
status = PdhGetFormattedCounterValue(cpuUserCounter[i], PDH_FMT_LONG, &type, &value); status = PdhGetFormattedCounterValue(cpuUserCounter[i], PDH_FMT_LONG, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (cpu user time) failed with status %ld\n", status); _tprintf(_T("Getting PDH-counter (cpu user time) failed with status %lu\n"), status);
return; return;
} }
else else
@ -628,7 +664,7 @@ void gkrellm_sys_cpu_read_data(void)
status = PdhGetFormattedCounterValue(cpuSysCounter[i], PDH_FMT_LONG, &type, &value); status = PdhGetFormattedCounterValue(cpuSysCounter[i], PDH_FMT_LONG, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (cpu sys time) failed with status %ld\n", status); _tprintf(_T("Getting PDH-counter (cpu sys time) failed with status %lu\n"), status);
return; return;
} }
else else
@ -658,7 +694,7 @@ gboolean gkrellm_sys_cpu_init(void)
TCHAR buf2[10]; TCHAR buf2[10];
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initializing CPU monitor.\n"); _tprintf(_T("INIT cpu monitoring\n"));
gkrellm_cpu_nice_time_unsupported(); gkrellm_cpu_nice_time_unsupported();
@ -678,21 +714,21 @@ gboolean gkrellm_sys_cpu_init(void)
_itot(i, buf2, 10); _itot(i, buf2, 10);
_tcscat(buf, buf2); _tcscat(buf, buf2);
_tcscat(buf, perfKeyList[CpuTime]); _tcscat(buf, perfKeyList[CpuTime]);
status = PdhAddCounter(pdhQueryHandle, buf, 0, &cpuUserCounter[i]); status = PdhAddCounter(pdhQueryHandle, buf, 0, &cpuUserCounter[i]);
if (status != ERROR_SUCCESS)
if (_GK.debug_level & DEBUG_SYSDEP) _tprintf(_T("Failed adding cpu user-time pdh-counter for path '%s', status %ld\n"), buf, status);
printf("Initialized cpu %i user portion (%s) with error code %ld\n", i, buf, status); else if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("Added cpu user-time pdh-counter for path '%s'\n"), buf);
_tcscpy(buf, perfKeyList[CpuStart]); _tcscpy(buf, perfKeyList[CpuStart]);
_itot(i, buf2, 10); _itot(i, buf2, 10);
_tcscat(buf, buf2); _tcscat(buf, buf2);
_tcscat(buf, perfKeyList[CpuSysTime]); _tcscat(buf, perfKeyList[CpuSysTime]);
status = PdhAddCounter(pdhQueryHandle, buf, 0, &cpuSysCounter[i]); status = PdhAddCounter(pdhQueryHandle, buf, 0, &cpuSysCounter[i]);
if (status != ERROR_SUCCESS)
if (_GK.debug_level & DEBUG_SYSDEP) _tprintf(_T("Failed adding cpu sys-time pdh-counter for path '%s', status %ld\n"), buf, status);
printf("Initialized cpu %i system portion (%s) with error code %ld\n", i, buf, status); else if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("Added cpu sys-time pdh-counter for path '%s'\n"), buf);
} }
} }
@ -723,7 +759,7 @@ void gkrellm_sys_net_read_data(void)
status = PdhGetFormattedCounterValue(netRecCounter[i], PDH_FMT_LONG, &type, &value); status = PdhGetFormattedCounterValue(netRecCounter[i], PDH_FMT_LONG, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (net recv counter) failed with status %ld\n", status); _tprintf(_T("Getting pdh-counter (net recv counter) failed with status %lu\n"), status);
return; return;
} }
else else
@ -734,7 +770,7 @@ void gkrellm_sys_net_read_data(void)
status = PdhGetFormattedCounterValue(netSendCounter[i], PDH_FMT_LONG, &type, &value); status = PdhGetFormattedCounterValue(netSendCounter[i], PDH_FMT_LONG, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (net send counter) failed with status %ld\n", status); _tprintf(_T("Getting pdh-counter (net send counter) failed with status %lu\n"), status);
return; return;
} }
else else
@ -759,24 +795,17 @@ gboolean gkrellm_sys_net_isdn_online(void)
gboolean gkrellm_sys_net_init(void) gboolean gkrellm_sys_net_init(void)
{ {
DWORD size = 0; DWORD objectSize = 0;
DWORD isize = 0; DWORD instanceSize = 0;
LPTSTR objects = NULL;
LPTSTR instances = NULL;
LPTSTR instance = NULL;
TCHAR buf[1024];
int strSize; int strSize;
int i; int i;
int adapter = -1; int adapter = -1;
// turn off for now
// gkrellm_net_add_timer_type_ppp("ppp0");
// gkrellm_net_add_timer_type_ippp("ippp0");
numAdapters = 0; numAdapters = 0;
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initializing network monitor.\n"); _tprintf(_T("INIT network monitoring\n"));
if (pdhQueryHandle != 0) if (pdhQueryHandle != 0)
{ {
@ -786,27 +815,29 @@ gboolean gkrellm_sys_net_init(void)
stat = PdhLookupPerfNameByIndex(NULL, 510, pdhIface, &pdhIfaceSz); stat = PdhLookupPerfNameByIndex(NULL, 510, pdhIface, &pdhIfaceSz);
if (stat != ERROR_SUCCESS) // fall back to non-translated pdh string if (stat != ERROR_SUCCESS) // fall back to non-translated pdh string
_tcscpy(pdhIface, TEXT("Network Interface")); _tcscpy(pdhIface, _T("Network Interface"));
PdhEnumObjectItems(NULL, NULL, pdhIface, NULL, &size, NULL, &isize, PERF_DETAIL_WIZARD, 0); stat = PdhEnumObjectItems(NULL, NULL, pdhIface, NULL, &objectSize, NULL,
if (_GK.debug_level & DEBUG_SYSDEP) &instanceSize, PERF_DETAIL_WIZARD, 0);
if (stat != PDH_MORE_DATA && stat != ERROR_SUCCESS)
{ {
printf("Found %ld network objects and %ld network instances.\n", size, isize); _tprintf(_T("Could not enumerate net pdh-counters for path '%s', error %lu\n"), pdhIface, stat);
} }
else if (instanceSize > 0)
if (size > 0)
{ {
++isize; TCHAR buf[1024];
++size; LPTSTR objects = NULL;
LPTSTR instances = NULL;
LPTSTR instance = NULL;
objects = (LPTSTR) malloc(sizeof(TCHAR) * size); ++instanceSize;
instances = (LPTSTR) malloc(sizeof(TCHAR) * isize); ++objectSize;
PdhEnumObjectItems(NULL, NULL, pdhIface, objects, &size, instances, &isize, PERF_DETAIL_WIZARD, 0); objects = (LPTSTR) malloc(sizeof(TCHAR) * objectSize);
if (_GK.debug_level & DEBUG_SYSDEP) instances = (LPTSTR) malloc(sizeof(TCHAR) * instanceSize);
{
printf("Enumerated %ld network objects and %ld network instances.\n", size, isize); PdhEnumObjectItems(NULL, NULL, pdhIface, objects, &objectSize,
} instances, &instanceSize, PERF_DETAIL_WIZARD, 0);
for (instance = instances; *instance != 0; instance += lstrlen(instance) + 1) for (instance = instances; *instance != 0; instance += lstrlen(instance) + 1)
{ {
@ -814,7 +845,7 @@ gboolean gkrellm_sys_net_init(void)
if (adapter >= MAX_NET_ADAPTERS) if (adapter >= MAX_NET_ADAPTERS)
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Hit maximum number of network adapters.\n"); _tprintf(_T("Hit maximum number of network adapters.\n"));
break; break;
} }
@ -833,37 +864,40 @@ gboolean gkrellm_sys_net_init(void)
} }
netName[adapter][strSize] = _T('\0'); netName[adapter][strSize] = _T('\0');
/* TODO: determine network type */
gkrellm_net_add_timer_type_ppp(netName[adapter]); gkrellm_net_add_timer_type_ppp(netName[adapter]);
_tcscpy(buf, perfKeyList[NetDevStart]); _tcscpy(buf, perfKeyList[NetDevStart]);
_tcscat(buf, instance); _tcscat(buf, instance);
_tcscat(buf, perfKeyList[NetDevRecv]); _tcscat(buf, perfKeyList[NetDevRecv]);
rx[adapter] = 0;
status = PdhAddCounter(pdhQueryHandle, buf, 0, &(netRecCounter[adapter])); status = PdhAddCounter(pdhQueryHandle, buf, 0, &(netRecCounter[adapter]));
if (_GK.debug_level & DEBUG_SYSDEP) if (status != ERROR_SUCCESS)
printf("Added network receive for '%s' interface with status %ld.\n", buf, status); _tprintf(_T("Failed adding net recv pdh-counter for path '%s', status %ld\n"), buf, status);
else if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("Added net recv pdh-counter for path '%s'\n"), buf);
rx[adapter] = 0;
_tcscpy(buf, perfKeyList[NetDevStart]); _tcscpy(buf, perfKeyList[NetDevStart]);
_tcscat(buf, instance); _tcscat(buf, instance);
_tcscat(buf, perfKeyList[NetDevSend]); _tcscat(buf, perfKeyList[NetDevSend]);
status = PdhAddCounter(pdhQueryHandle, buf, 0, &(netSendCounter[adapter])); status = PdhAddCounter(pdhQueryHandle, buf, 0, &(netSendCounter[adapter]));
if (status != ERROR_SUCCESS)
_tprintf(_T("Failed adding net send pdh-counter for path '%s', status %ld\n"), buf, status);
else if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("Added net send pdh-counter for path '%s'\n"), buf);
tx[adapter] = 0; tx[adapter] = 0;
if (_GK.debug_level & DEBUG_SYSDEP)
printf("Added network transmit for '%s' interface with status %ld.\n", buf, status);
} }
/* Final number of network adapters */
numAdapters = adapter + 1; numAdapters = adapter + 1;
}
if (objects != NULL)
free(objects); free(objects);
if (instances != NULL)
free(instances); free(instances);
} }
}
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Found %i interfaces for monitoring.\n", numAdapters); _tprintf(_T("Found %i interfaces for monitoring.\n"), numAdapters);
return (numAdapters == 0 ? FALSE : TRUE); return (numAdapters == 0 ? FALSE : TRUE);
} }
@ -882,7 +916,7 @@ gchar * gkrellm_sys_disk_name_from_device(gint device_number, gint unit_number,
static gchar name[32]; static gchar name[32];
//TODO: i18n? //TODO: i18n?
sprintf(name, "Disk%s", diskName[device_number]); snprintf(name, sizeof(name), "Disk%s", diskName[device_number]);
*order = device_number; *order = device_number;
return name; return name;
} }
@ -913,7 +947,7 @@ void gkrellm_sys_disk_read_data(void)
status = PdhGetFormattedCounterValue(diskReadCounter[i], PDH_FMT_DOUBLE, &type, &value); status = PdhGetFormattedCounterValue(diskReadCounter[i], PDH_FMT_DOUBLE, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (disk read cnt) failed with status %ld\n", status); _tprintf(_T("Getting PDH-counter (disk read cnt) failed with status %lu\n"), status);
return; return;
} }
readInt = value.doubleValue / _GK.update_HZ; readInt = value.doubleValue / _GK.update_HZ;
@ -921,7 +955,7 @@ void gkrellm_sys_disk_read_data(void)
status = PdhGetFormattedCounterValue(diskWriteCounter[i], PDH_FMT_DOUBLE, &type, &value); status = PdhGetFormattedCounterValue(diskWriteCounter[i], PDH_FMT_DOUBLE, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (disk write cnt) failed with status %ld\n", status); _tprintf(_T("Getting PDH-counter (disk write cnt) failed with status %lu\n"), status);
return; return;
} }
writeInt = value.doubleValue / _GK.update_HZ; writeInt = value.doubleValue / _GK.update_HZ;
@ -945,12 +979,12 @@ gboolean gkrellm_sys_disk_init(void)
TCHAR buf[1024]; TCHAR buf[1024];
int strSize; int strSize;
int i; int i;
int disk = -1; int diskIndex = -1;
numDisks = 0; numDisks = 0;
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initializing disk monitor.\n"); _tprintf(_T("INIT disk monitoring\n"));
if (pdhQueryHandle != 0) if (pdhQueryHandle != 0)
{ {
@ -959,12 +993,16 @@ gboolean gkrellm_sys_disk_init(void)
PDH_STATUS stat; PDH_STATUS stat;
stat = PdhLookupPerfNameByIndex(NULL, 234, pdhDisk, &pdhDiskSz); stat = PdhLookupPerfNameByIndex(NULL, 234, pdhDisk, &pdhDiskSz);
if (stat != ERROR_SUCCESS) // fall back to non-translated pdh string if (stat != ERROR_SUCCESS) // Fall back to non-translated pdh string
_tcscpy(pdhDisk, TEXT("PhysicalDisk")); _tcscpy(pdhDisk, TEXT("PhysicalDisk"));
// get number of disks that can be queried // Get number of disks that can be queried
PdhEnumObjectItems(NULL, NULL, pdhDisk, NULL, &size, NULL, &isize, PERF_DETAIL_WIZARD, 0); stat = PdhEnumObjectItems(NULL, NULL, pdhDisk, NULL, &size, NULL, &isize, PERF_DETAIL_WIZARD, 0);
if (size > 0) if (stat != PDH_MORE_DATA && stat != ERROR_SUCCESS)
{
_tprintf(_T("Could not enumerate disk pdh-counters for path '%s', error %lu\n"), pdhDisk, stat);
}
else if (size > 0)
{ {
LPTSTR objects = NULL; LPTSTR objects = NULL;
LPTSTR instances = NULL; LPTSTR instances = NULL;
@ -978,11 +1016,14 @@ gboolean gkrellm_sys_disk_init(void)
// get information about disks // get information about disks
PdhEnumObjectItems(NULL, NULL, pdhDisk, objects, &size, instances, &isize, PERF_DETAIL_WIZARD, 0); PdhEnumObjectItems(NULL, NULL, pdhDisk, objects, &size, instances, &isize, PERF_DETAIL_WIZARD, 0);
for (instance = instances; *instance != 0; instance += lstrlen(instance) + 1) for (instance = instances; *instance != 0; instance += lstrlen(instance) + 1)
{ {
++disk; // Ignore total counter, gkrellm provides that functionality
if (disk >= MAX_DISKS) if (_strnicmp(_T("_Total"), instance, 6) == 0)
continue;
++diskIndex;
if (diskIndex >= MAX_DISKS)
break; break;
strSize = min(_tcsclen(instance), MAX_DISK_NAME); strSize = min(_tcsclen(instance), MAX_DISK_NAME);
@ -990,44 +1031,46 @@ gboolean gkrellm_sys_disk_init(void)
for (i = 0; i < strSize; i++) for (i = 0; i < strSize; i++)
{ {
if (instance[i] == _T(' ')) if (instance[i] == _T(' '))
diskName[disk][i] = _T('_'); diskName[diskIndex][i] = _T('_');
else else
diskName[disk][i] = instance[i]; diskName[diskIndex][i] = instance[i];
} }
diskName[disk][strSize] = _T('\0'); diskName[diskIndex][strSize] = _T('\0');
// assemble object name to pdhQueryHandle // assemble object name to pdhQueryHandle
_tcscpy(buf, perfKeyList[DiskStart]); _tcscpy(buf, perfKeyList[DiskStart]);
_tcscat(buf, instance); _tcscat(buf, instance);
_tcscat(buf, perfKeyList[DiskRead]); _tcscat(buf, perfKeyList[DiskRead]);
status = PdhAddCounter(pdhQueryHandle, buf, 0, &(diskReadCounter[disk])); status = PdhAddCounter(pdhQueryHandle, buf, 0, &(diskReadCounter[diskIndex]));
diskread[disk] = 0; if (status != ERROR_SUCCESS)
if (_GK.debug_level & DEBUG_SYSDEP) _tprintf(_T("Failed adding disk read pdh-counter for path '%s', status %ld\n"), buf, status);
printf("Adding disk %s for read monitoring with status code %ld\n", buf, status); else if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("Added disk read pdh-counter for path '%s'\n"), buf);
diskread[diskIndex] = 0;
_tcscpy(buf, perfKeyList[DiskStart]); _tcscpy(buf, perfKeyList[DiskStart]);
_tcscat(buf, instance); _tcscat(buf, instance);
_tcscat(buf, perfKeyList[DiskWrite]); _tcscat(buf, perfKeyList[DiskWrite]);
status = PdhAddCounter(pdhQueryHandle, buf, 0, &(diskWriteCounter[disk])); status = PdhAddCounter(pdhQueryHandle, buf, 0, &(diskWriteCounter[diskIndex]));
diskwrite[disk] = 0; if (status != ERROR_SUCCESS)
if (_GK.debug_level & DEBUG_SYSDEP) _tprintf(_T("Failed adding disk write pdh-counter for path '%s', status %ld\n"), buf, status);
printf("Adding disk %s for write monitoring with status code %ld\n", buf, status); else if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("Added disk write pdh-counter for path '%s'\n"), buf);
diskwrite[diskIndex] = 0;
} }
numDisks = diskIndex + 1;
numDisks = disk + 1;
if (objects != NULL)
free(objects); free(objects);
if (instances != NULL)
free(instances); free(instances);
} }
} }
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Found %i disks for monitoring.\n", numDisks); _tprintf(_T("Found %i disks for monitoring\n"), numDisks);
return (numDisks == 0 ? FALSE : TRUE); return (numDisks == 0 ? FALSE : TRUE);
} }
/* ===================================================================== */ /* ===================================================================== */
/* Proc monitor interface */ /* Proc monitor interface */
@ -1053,7 +1096,7 @@ void gkrellm_sys_proc_read_data(void)
status = PdhGetFormattedCounterValue(processCounter, PDH_FMT_LONG, &type, &value); status = PdhGetFormattedCounterValue(processCounter, PDH_FMT_LONG, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (process cnt) failed with status %ld\n", status); _tprintf(_T("Getting PDH-counter (process cnt) failed with status %ld\n"), status);
return; return;
} }
n_processes = value.longValue; n_processes = value.longValue;
@ -1061,7 +1104,7 @@ void gkrellm_sys_proc_read_data(void)
status = PdhGetFormattedCounterValue(threadCounter, PDH_FMT_LONG, &type, &value); status = PdhGetFormattedCounterValue(threadCounter, PDH_FMT_LONG, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (thread cnt) failed with status %ld\n", status); _tprintf(_T("Getting PDH-counter (thread cnt) failed with status %ld\n"), status);
return; return;
} }
n_forks = value.longValue; n_forks = value.longValue;
@ -1103,7 +1146,7 @@ void gkrellm_sys_proc_read_users(void)
NET_API_STATUS nerr; NET_API_STATUS nerr;
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Getting number of logged in users.\n"); _tprintf(_T("Getting number of logged in users.\n"));
nerr = NetWkstaUserEnum(NULL, 0, &ptr, MAX_PREFERRED_LENGTH, &entriesRead, nerr = NetWkstaUserEnum(NULL, 0, &ptr, MAX_PREFERRED_LENGTH, &entriesRead,
&totalEntries, NULL); &totalEntries, NULL);
@ -1119,18 +1162,22 @@ void gkrellm_sys_proc_read_users(void)
gboolean gkrellm_sys_proc_init(void) gboolean gkrellm_sys_proc_init(void)
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initializing process monitor.\n"); _tprintf(_T("INIT process monitoring\n"));
if (pdhQueryHandle == 0) if (pdhQueryHandle == 0)
return FALSE; return FALSE;
if (_GK.debug_level & DEBUG_SYSDEP)
printf("Adding '%s' as process monitor.\n", perfKeyList[NumProcesses]);
status = PdhAddCounter(pdhQueryHandle, perfKeyList[NumProcesses], 0, &processCounter); status = PdhAddCounter(pdhQueryHandle, perfKeyList[NumProcesses], 0, &processCounter);
if (status != ERROR_SUCCESS)
_tprintf(_T("Failed adding process pdh-counter for path '%s', status %ld\n"), perfKeyList[NumProcesses], status);
else if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("Added process pdh-counter for path '%s'\n"), perfKeyList[NumProcesses]);
if (_GK.debug_level & DEBUG_SYSDEP)
printf("Adding '%s' as thread monitor.\n", perfKeyList[NumThreads]);
status = PdhAddCounter(pdhQueryHandle, perfKeyList[NumThreads], 0, &threadCounter); status = PdhAddCounter(pdhQueryHandle, perfKeyList[NumThreads], 0, &threadCounter);
if (status != ERROR_SUCCESS)
_tprintf(_T("Failed adding thread pdh-counter for path '%s', status %ld\n"), perfKeyList[NumThreads], status);
else if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("Added thread pdh-counter for path '%s'\n"), perfKeyList[NumThreads]);
return TRUE; return TRUE;
} }
@ -1228,7 +1275,7 @@ void gkrellm_sys_swap_read_data(void)
gboolean gkrellm_sys_mem_init(void) gboolean gkrellm_sys_mem_init(void)
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initialized Memory monitor.\n"); _tprintf(_T("INIT memory monitoring\n"));
return TRUE; return TRUE;
} }
@ -1273,7 +1320,7 @@ void gkrellm_sys_battery_read_data(void)
gboolean gkrellm_sys_battery_init() gboolean gkrellm_sys_battery_init()
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initialized Battery monitor.\n"); _tprintf(_T("INIT battery monitoring\n"));
return TRUE; return TRUE;
} }
@ -1283,22 +1330,28 @@ gboolean gkrellm_sys_battery_init()
/* ===================================================================== */ /* ===================================================================== */
gboolean gkrellm_sys_fs_fstab_modified(void) gboolean gkrellm_sys_fs_fstab_modified(void)
{ {
return FALSE; return FALSE;
} }
void eject_win32_cdrom(gchar *device) void eject_win32_cdrom(gchar *device)
{ {
HANDLE hFile; HANDLE hFile;
BOOL err; BOOL err;
char buf[25]; TCHAR devPath[MAX_PATH];
DWORD numBytes; DWORD numBytes;
if (!device || strlen(device) == 0) if (!device || device[0] == 0)
return; return;
sprintf(buf, "\\\\.\\%c:", device[0]); /* FIXME: This assumes device names like "D:" */
hFile = CreateFile(buf, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, NULL); _sntprintf(devPath, ARRAYSIZE(devPath), _T("\\\\.\\%c:"), device[0]);
devPath[ARRAYSIZE(devPath) - 1] = 0;
hFile = CreateFile(devPath, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0,
NULL);
if (hFile != 0 && hFile != INVALID_HANDLE_VALUE) if (hFile != 0 && hFile != INVALID_HANDLE_VALUE)
{ {
// this should be safe for non-removable drives // this should be safe for non-removable drives
@ -1317,7 +1370,7 @@ void eject_win32_cdrom(gchar *device)
gboolean gkrellm_sys_fs_init(void) gboolean gkrellm_sys_fs_init(void)
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initializing file system monitor.\n"); _tprintf(_T("INIT filesystem monitoring\n"));
gkrellm_fs_mounting_unsupported(); gkrellm_fs_mounting_unsupported();
gkrellm_fs_setup_eject(NULL, NULL, eject_win32_cdrom, NULL); gkrellm_fs_setup_eject(NULL, NULL, eject_win32_cdrom, NULL);
return TRUE; return TRUE;
@ -1328,7 +1381,7 @@ void gkrellm_sys_fs_get_fsusage(gpointer fs, gchar *dir)
{ {
BOOL err = 0; BOOL err = 0;
if (!dir || strlen(dir) <= 0) if (!dir || dir[0] == 0)
return; return;
ULARGE_INTEGER freeAvailableToCaller; ULARGE_INTEGER freeAvailableToCaller;
@ -1336,7 +1389,8 @@ void gkrellm_sys_fs_get_fsusage(gpointer fs, gchar *dir)
ULARGE_INTEGER freeBytes; ULARGE_INTEGER freeBytes;
gulong total, freeCaller, free; gulong total, freeCaller, free;
err = GetDiskFreeSpaceEx(dir, &freeAvailableToCaller, &totalBytes, &freeBytes); /* TODO: Unicode support? */
err = GetDiskFreeSpaceExA(dir, &freeAvailableToCaller, &totalBytes, &freeBytes);
if (err != 0) if (err != 0)
{ {
total = EnlargedUnsignedDivide(totalBytes, 1024, 0); total = EnlargedUnsignedDivide(totalBytes, 1024, 0);
@ -1347,46 +1401,62 @@ void gkrellm_sys_fs_get_fsusage(gpointer fs, gchar *dir)
} }
else else
{ {
// may happen on cd/dvd drives, ignore for now /* TODO: This may happen on cd/dvd drives, ignore for now */
//printf("GetDiskFreeSpaceEx() failed on drive %c:, error %d\n", *dir, err); /*
_tprintf(_T("GetDiskFreeSpaceEx() failed on drive %c:, error %d\n"),
*dir, err);
*/
} }
} }
void gkrellm_sys_fs_get_mounts_list(void) void gkrellm_sys_fs_get_mounts_list(void)
{ {
char buf[1024]; char driveStrings[512];
char* drive; char *drive;
GetLogicalDriveStrings(1024, buf); DWORD ret;
for (drive = buf; *drive != 0; drive += lstrlen(drive) + 1) /* TODO: Unicode support? */
ret = GetLogicalDriveStringsA(ARRAYSIZE(driveStrings) - 1, driveStrings);
if (ret > 0)
{ {
if (strcmp("A:\\", drive) != 0 && strcmp("a:\\", drive) != 0 && for (drive = driveStrings; *drive != 0; drive += lstrlenA(drive) + 1)
strcmp("B:\\", drive) != 0 && strcmp("b:\\", drive) != 0 {
if (_strnicmp("A:\\", drive, 3) != 0
&& _strnicmp("B:\\", drive, 3) != 0
) )
{ {
if (_GK.debug_level & DEBUG_SYSDEP)
printf(("Found mounted drive '%s'\n"), drive);
gkrellm_fs_add_to_mounts_list(drive, drive, ""); gkrellm_fs_add_to_mounts_list(drive, drive, "");
} }
} }
} }
}
void gkrellm_sys_fs_get_fstab_list(void) void gkrellm_sys_fs_get_fstab_list(void)
{ {
char buf[1024]; char driveStrings[512];
char* drive; char *drive;
GetLogicalDriveStrings(1024, buf); DWORD ret;
for (drive = buf; *drive != 0; drive += lstrlen(drive) + 1) /* TODO: Unicode support? */
ret = GetLogicalDriveStringsA(ARRAYSIZE(driveStrings) - 1, driveStrings);
if (ret > 0)
{ {
if (strcmp("A:\\", drive) != 0 && strcmp("a:\\", drive) != 0 && for (drive = driveStrings; *drive != 0; drive += lstrlenA(drive) + 1)
strcmp("B:\\", drive) != 0 && strcmp("b:\\", drive) != 0 {
if (_strnicmp("A:\\", drive, 3) != 0
&& _strnicmp("B:\\", drive, 3) != 0
) )
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Adding fstab %s\n", drive); printf(("Found fstab drive '%s'\n"), drive);
gkrellm_fs_add_to_fstab_list(drive, drive, "", ""); gkrellm_fs_add_to_fstab_list(drive, drive, "", "");
} }
} }
} }
}
/* ===================================================================== */ /* ===================================================================== */
/* INET monitor interfaces */ /* INET monitor interfaces */
@ -1394,6 +1464,8 @@ void gkrellm_sys_fs_get_fstab_list(void)
gboolean gkrellm_sys_inet_init(void) gboolean gkrellm_sys_inet_init(void)
{ {
if (_GK.debug_level & DEBUG_SYSDEP)
_tprintf(_T("INIT inet port monitoring\n"));
return TRUE; return TRUE;
} }
@ -1454,7 +1526,7 @@ time_t gkrellm_sys_uptime_read_uptime(void)
status = PdhGetFormattedCounterValue(uptimeCounter, PDH_FMT_LONG, &type, &value); status = PdhGetFormattedCounterValue(uptimeCounter, PDH_FMT_LONG, &type, &value);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
printf("Getting PDH-counter (uptime) failed with status %ld\n", status); _tprintf(_T("Getting uptime pdh-counter failed, status %ld\n"), status);
return (time_t)0; return (time_t)0;
} }
l = value.longValue; l = value.longValue;
@ -1467,19 +1539,18 @@ time_t gkrellm_sys_uptime_read_uptime(void)
gboolean gkrellm_sys_uptime_init(void) gboolean gkrellm_sys_uptime_init(void)
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Initializing uptime monitor.\n"); _tprintf(_T("INIT uptime monitoring\n"));
if (pdhQueryHandle == 0) if (pdhQueryHandle == 0)
return FALSE; return FALSE;
status = PdhAddCounter(pdhQueryHandle, perfKeyList[Uptime], 0, &uptimeCounter); status = PdhAddCounter(pdhQueryHandle, perfKeyList[Uptime], 0, &uptimeCounter);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ _tprintf(_T("Failed adding uptime pdh-counter for path '%s', status %ld\n"), perfKeyList[Uptime], status);
printf("Adding PDH-counter (uptime) failed with status %ld\n", status); else if (_GK.debug_level & DEBUG_SYSDEP)
return FALSE; _tprintf(_T("Added uptime pdh-counter for path '%s'\n"), perfKeyList[Uptime]);
}
return TRUE; return (status == ERROR_SUCCESS ? TRUE : FALSE);
} }
@ -1497,10 +1568,11 @@ gchar *gkrellm_sys_get_host_name(void)
int err; int err;
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Retrieving host name.\n"); _tprintf(_T("Retrieving host name.\n"));
err = gethostname(buf, sizeof(buf)); err = gethostname(buf, sizeof(buf));
/* TODO: i18n */
if (err != 0) if (err != 0)
hostname = g_strdup("Unknown"); hostname = g_strdup("Unknown");
else else
@ -1517,17 +1589,15 @@ gchar *gkrellm_sys_get_host_name(void)
/* ===================================================================== */ /* ===================================================================== */
gchar *gkrellm_sys_get_system_name(void) gchar *gkrellm_sys_get_system_name(void)
{ {
static gboolean have_it = FALSE; static gboolean system_name_fetched = FALSE;
char osName[64]; char osName[64];
if (!have_it) if (!system_name_fetched)
{ {
if (_GK.debug_level & DEBUG_SYSDEP) if (_GK.debug_level & DEBUG_SYSDEP)
printf("Retrieving system name.\n"); _tprintf(_T("Retrieving system name.\n"));
strcpy(osName, "Unknown"); strcpy(osName, "Unknown");
if (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) if (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{ {
if (info.dwMinorVersion == 0) if (info.dwMinorVersion == 0)
@ -1557,13 +1627,11 @@ gchar *gkrellm_sys_get_system_name(void)
strcpy(osName, "Windows XP"); strcpy(osName, "Windows XP");
} }
} }
sname = g_strdup(osName); sname = g_strdup(osName);
have_it = TRUE; system_name_fetched = TRUE;
} }
return sname; return sname;
} }
/* ===================================================================== */ /* ===================================================================== */
@ -1586,8 +1654,9 @@ gboolean gkrellm_sys_sensors_mbmon_supported(void)
/* ===================================================================== */ /* ===================================================================== */
static void initPerfKeyList(void) static void
{ initPerfKeyList(void)
{
int i; int i;
for (i = 0; i < PerfKeysSize; i++) for (i = 0; i < PerfKeysSize; i++)
{ {
@ -1610,10 +1679,11 @@ static void initPerfKeyList(void)
placePerfKeyFromReg(DiskStart , 234, _T("\\") , _T("(")); placePerfKeyFromReg(DiskStart , 234, _T("\\") , _T("("));
placePerfKeyFromReg(DiskRead , 220, _T(")\\"), NULL); placePerfKeyFromReg(DiskRead , 220, _T(")\\"), NULL);
placePerfKeyFromReg(DiskWrite , 222, _T(")\\"), NULL); placePerfKeyFromReg(DiskWrite , 222, _T(")\\"), NULL);
} }
static void placePerfKeysFromReg(const PerfKey key, unsigned int index1, unsigned int index2) static void
placePerfKeysFromReg(const PerfKey key, unsigned int index1, unsigned int index2)
{ {
TCHAR buf[512]; TCHAR buf[512];
TCHAR perfName[512]; TCHAR perfName[512];
@ -1636,19 +1706,21 @@ static void placePerfKeysFromReg(const PerfKey key, unsigned int index1, unsigne
} }
else else
{ {
printf("could not find perflib index %d in registry\n", index2); _tprintf(_T("could not find perflib index %d in registry\n"), index2);
placePerfKey(key, NULL); placePerfKey(key, NULL);
} }
} }
else else
{ {
printf("Could not find perflib index %d in registry\n", index1); _tprintf(_T("Could not find perflib index %d in registry\n"), index1);
placePerfKey(key, NULL); placePerfKey(key, NULL);
} }
} }
static void placePerfKeyFromReg(const PerfKey key, unsigned int index,
const TCHAR* prefix, const TCHAR* suffix) static void
placePerfKeyFromReg(const PerfKey key, unsigned int index, const TCHAR* prefix,
const TCHAR* suffix)
{ {
TCHAR buf[512]; TCHAR buf[512];
TCHAR perfName[512]; TCHAR perfName[512];
@ -1676,13 +1748,14 @@ static void placePerfKeyFromReg(const PerfKey key, unsigned int index,
} }
else else
{ {
printf("could not find index %d in registry\n", index); _tprintf(_T("could not find index %d in registry\n"), index);
placePerfKey(key, NULL); placePerfKey(key, NULL);
} }
} }
static void placePerfKey(const PerfKey key, const TCHAR* value) static void
placePerfKey(const PerfKey key, const TCHAR* value)
{ {
size_t strSize; size_t strSize;
if (((int)key > -1) && ((int)key < PerfKeysSize)) if (((int)key > -1) && ((int)key < PerfKeysSize))
@ -1698,11 +1771,11 @@ static void placePerfKey(const PerfKey key, const TCHAR* value)
{ {
perfKeyList[key] = NULL; perfKeyList[key] = NULL;
} }
//printf("perfKeyList[ %d ] = '%s'\n", key, perfKeyList[key]); //_tprintf(_T("perfKeyList[ %d ] = '%s'\n"), key, perfKeyList[key]);
} }
else else
{ {
printf("Invalid placement for key %d; value was '%s'\n", key, value); _tprintf(_T("Invalid placement for key %d; value was '%s'\n"), key, value);
} }
} }