win32sysinfo.c

来自「OTP是开放电信平台的简称」· C语言 代码 · 共 317 行

C
317
字号
/* ``The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in * compliance with the License. You should have received a copy of the * Erlang Public License along with this software. If not, it can be * retrieved via the world wide web at http://www.erlang.org/. *  * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. *  * The Initial Developer of the Original Code is Ericsson Utvecklings AB. * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings * AB. All Rights Reserved.'' *  *     $Id$ *//** *  win32sysinfo.c * *  File:     win32sysinfo.c *  Purpose:  Portprogram for supervision of disk and memory usage. * *  Synopsis: win32sysinfo * *  PURPOSE OF THIS PROGRAM * *  This program supervises the reports the memory status or disk status *  on request from the Erlang system *   * *  SPAWNING FROM ERLANG * *  This program is started from Erlang as follows, * *       Port = open_port({spawn, 'memsup'}, [{packet,1}]) for UNIX * *  COMMUNICATION * *    WIN32 *  * get_disk_info 'd' (request info about all drives) *      The result is returned as one packet per logical drive with the  *      following format: *      Drive Type AvailableBytes TotalBytes TotalBytesFree *      END * *      Example:  *      A:\ DRIVE_REMOVABLE 0 0 0 *      C:\ DRIVE_FIXED 10000000 20000000 10000000 *      END * get_disk_info 'd'Driveroot (where Driveroot is a string like this "A:\\" *      (request info of specific drive) *      The result is returned with the same format as above exept that  *      Type will be DRIVE_NOT_EXIST if the drive does not exist. * * get_mem_info 'm' (request info about memory) *  *      The result is returned as one packet with the following format *       *       *       *       * */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <windows.h>#include "winbase.h"#define MEM_INFO 'm'#define DISK_INFO 'd'#define OK "o"#define ERLIN_FD      0#define ERLOUT_FD     1typedef BOOL (WINAPI *tfpGetDiskFreeSpaceEx)(LPCTSTR, PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);static  tfpGetDiskFreeSpaceEx fpGetDiskFreeSpaceEx;static voidreturn_answer(char* value){    int left, bytes, res;    bytes = strlen(value); /* Skip trailing zero */    res = write(1,(char*) &bytes,1);    if (res != 1) {	fprintf(stderr,"win32sysinfo:Error writing to pipe");	exit(1);    }    left = bytes;    while (left > 0)    {	res = write(1, value+bytes-left, left);	if (res <= 0)	{	    fprintf(stderr,"win32sysinfo:Error writing to pipe");	    exit(1);	}	left -= res;    }}void output_drive_info(char* drive){    ULARGE_INTEGER availbytes,totbytesfree,totbytes;    OSVERSIONINFO osinfo;    char answer[512];    osinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);    GetVersionEx(&osinfo);    switch (GetDriveType(drive)) {    case DRIVE_UNKNOWN:	sprintf(answer,"%s DRIVE_UNKNOWN 0 0 0\n",drive);	return_answer(answer);	break;    case DRIVE_NO_ROOT_DIR:	sprintf(answer,"%s DRIVE_NO_ROOT_DIR 0 0 0\n",drive);	return_answer(answer);	break;    case DRIVE_REMOVABLE:	sprintf(answer,"%s DRIVE_REMOVABLE 0 0 0\n",drive);	return_answer(answer);	break;    case DRIVE_FIXED:	/*		if ((osinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&			(LOWORD(osinfo.dwBuildNumber) <= 1000)) {			sprintf(answer,"%s API_NOT_SUPPORTED 0 0 0\n",drive);			return_answer(answer);			}			else			*/	    if (fpGetDiskFreeSpaceEx == NULL){		sprintf(answer,"%s API_NOT_SUPPORTED 0 0 0\n",drive);		return_answer(answer);	    }	    else		if (fpGetDiskFreeSpaceEx(drive,&availbytes,&totbytes,&totbytesfree)){		    sprintf(answer,"%s DRIVE_FIXED %I64u %I64u %I64u\n",drive,availbytes,totbytes,totbytesfree);		    return_answer(answer);		}		else {		    sprintf(answer,"%s API_ERROR 0 0 0\n",drive);		    return_answer(answer);		}	break;    case DRIVE_REMOTE:	sprintf(answer,"%s DRIVE_REMOTE 0 0 0\n",drive);	return_answer(answer);	break;    case DRIVE_CDROM:	sprintf(answer,"%s DRIVE_CDROM 0 0 0\n",drive);	return_answer(answer);	break;    case DRIVE_RAMDISK:	sprintf(answer,"%s DRIVE_RAMDISK 0 0 0\n",drive);	return_answer(answer);	break;    default:	sprintf(answer,"%s DRIVE_NOT_EXIST 0 0 0\n",drive);	return_answer(answer);    } /* switch */}    int load_if_possible() {    HINSTANCE lh;    if((lh = LoadLibrary("KERNEL32")) ==NULL)	return 0;		/* error */    if ((fpGetDiskFreeSpaceEx = 	 (tfpGetDiskFreeSpaceEx) GetProcAddress(lh,"GetDiskFreeSpaceExA")) ==NULL)	return GetLastError(); /* error */    return 1;}void get_disk_info_all(){    DWORD dwNumBytesForDriveStrings;    char DriveStrings[255];    char* dp = DriveStrings;        dwNumBytesForDriveStrings = GetLogicalDriveStrings(254,dp);    if (dwNumBytesForDriveStrings != 0) {	/* GetLogicalDriveStringsIs supported on this platform */	while (*dp != 0) {	    output_drive_info(dp);	    dp = strchr(dp,0) +1;	}    }    else {	/* GetLogicalDriveStrings is not supported (some old W95) */	DWORD dwDriveMask = GetLogicalDrives();	int nDriveNum;	char drivename[]="A:\\";	/*printf("DriveName95 DriveType BytesAvail BytesTotal BytesTotalFree\n");*/	for (nDriveNum = 0; dwDriveMask != 0;nDriveNum++) {	    if (dwDriveMask & 1) {		drivename[0]='A'+ nDriveNum;		output_drive_info(drivename);	    }	    dwDriveMask = dwDriveMask >> 1;	}    }}void get_avail_mem() {    char answer[512];    MEMORYSTATUS ms;    ms.dwLength=sizeof(MEMORYSTATUS);    GlobalMemoryStatus(&ms);    sprintf(answer,"%d %d %d %d %d %d %d\n",	    ms.dwMemoryLoad,	    ms.dwTotalPhys,	    ms.dwAvailPhys,	    ms.dwTotalPageFile,	    ms.dwAvailPageFile,	    ms.dwTotalVirtual,	    ms.dwAvailVirtual	    );    return_answer(answer);    /*           MemoryLoad;    percent of memory in use        TotalPhys;     // bytes of physical memory       AvailPhys;     // free physical memory bytes       TotalPageFile; // bytes of paging file       AvailPageFile; // free bytes of paging file       TotalVirtual;  // user bytes of address space       AvailVirtual;  // free user bytes              */}static voidmessage_loop(){    char cmdLen;    char cmd[512];    int res;        fprintf(stderr,"in message_loop\n");    /* Startup ACK. */    return_answer(OK);    while (1)    {	/*	 *  Wait for command from Erlang	 */	if ((res = read(0, &cmdLen, 1)) < 0) {	    fprintf(stderr,"win32sysinfo:Error reading from Erlang.");	    return;	}		if (res != 1){	/* Exactly one byte read ? */ 	    fprintf(stderr,"win32sysinfo:Erlang has closed.");	    return;	}	if ((res = read(0, &cmd, cmdLen)) == cmdLen){	    if (cmdLen == 1) {		switch (cmd[0]) {		case MEM_INFO:		    get_avail_mem();		    return_answer(OK);		    break;		case DISK_INFO:		    get_disk_info_all();		    return_answer(OK);		    break;		default:	/* ignore all other messages */		    break;		} /* switch */	    }	    else 		if ((res > 0) && (cmd[0]==DISK_INFO)) {		    cmd[cmdLen] = 0;		    output_drive_info(&cmd[1]);		    return_answer("OK");		    return;		}		else		    return_answer("xEND");	}    	else if (res == 0) {	    fprintf(stderr,"win32sysinfo:Erlang has closed.");	    return;	}	else {	    fprintf(stderr,"win32sysinfo:Error reading from Erlang.");	    return;	}     }}int main(int argc, char ** argv){    _setmode(0, _O_BINARY);    _setmode(1, _O_BINARY);    load_if_possible();    message_loop();    return 0;    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?