⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posixwin.c

📁 Scheme跨平台编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
}#define C_process_wait(p, t) (process_wait(C_unfix(p), C_truep(t)) ? C_SCHEME_TRUE : C_SCHEME_FALSE)#define C_sleep(t) (Sleep(C_unfix(t) * 1000), C_SCHEME_UNDEFINED)static int C_fcallget_hostname(){    /* Do we already have hostname? */    if (strlen(C_hostname))    {	return 1;    }    else    {	WSADATA wsa;	if (WSAStartup(MAKEWORD(1, 1), &wsa) == 0)	{	    int nok = gethostname(C_hostname, sizeof(C_hostname));	    WSACleanup();	    return !nok;	}	return 0;    }}static int C_fcallsysinfo(){    /* Do we need to build the sysinfo? */    if (!strlen(C_osrel))    {	OSVERSIONINFO ovf;	ZeroMemory(&ovf, sizeof(ovf));	ovf.dwOSVersionInfoSize = sizeof(ovf);	if (get_hostname() && GetVersionEx(&ovf))	{	    SYSTEM_INFO si;	    _snprintf(C_osver, sizeof(C_osver) - 1, "%d.%d.%d",			ovf.dwMajorVersion, ovf.dwMinorVersion, ovf.dwBuildNumber);	    strncpy(C_osrel, "Win", sizeof(C_osrel) - 1);	    switch (ovf.dwPlatformId)	    {	    case VER_PLATFORM_WIN32s:		strncpy(C_osrel, "Win32s", sizeof(C_osrel) - 1);		break;	    case VER_PLATFORM_WIN32_WINDOWS:		if (ovf.dwMajorVersion == 4)		{		    if (ovf.dwMinorVersion == 0)			strncpy(C_osrel, "Win95", sizeof(C_osrel) - 1);		    else if (ovf.dwMinorVersion == 10)			strncpy(C_osrel, "Win98", sizeof(C_osrel) - 1);		    else if (ovf.dwMinorVersion == 90)			strncpy(C_osrel, "WinMe", sizeof(C_osrel) - 1);		}		break;	    case VER_PLATFORM_WIN32_NT:		C_isNT = 1;		if (ovf.dwMajorVersion == 6)		    strncpy(C_osrel, "WinVista", sizeof(C_osrel) - 1);		else if (ovf.dwMajorVersion == 5)		{		    if (ovf.dwMinorVersion == 2)			strncpy(C_osrel, "WinServer2003", sizeof(C_osrel) - 1);		    else if (ovf.dwMinorVersion == 1)			strncpy(C_osrel, "WinXP", sizeof(C_osrel) - 1);		    else if ( ovf.dwMinorVersion == 0)			strncpy(C_osrel, "Win2000", sizeof(C_osrel) - 1);		}		else if (ovf.dwMajorVersion <= 4)		   strncpy(C_osrel, "WinNT", sizeof(C_osrel) - 1);		break;	    }	    GetSystemInfo(&si);	    strncpy(C_processor, "Unknown", sizeof(C_processor) - 1);	    switch (si.wProcessorArchitecture)	    {	    case PROCESSOR_ARCHITECTURE_INTEL:		strncpy(C_processor, "x86", sizeof(C_processor) - 1);		break;#	    ifdef PROCESSOR_ARCHITECTURE_IA64	    case PROCESSOR_ARCHITECTURE_IA64:		strncpy(C_processor, "IA64", sizeof(C_processor) - 1);		break;#	    endif#	    ifdef PROCESSOR_ARCHITECTURE_AMD64	    case PROCESSOR_ARCHITECTURE_AMD64:		strncpy(C_processor, "x64", sizeof(C_processor) - 1);		break;#	    endif#	    ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64	    case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:		strncpy(C_processor, "WOW64", sizeof(C_processor) - 1);		break;#	    endif	    }	}	else	    return set_last_errno();    }    return 1;}static int C_fcallget_shlcmd(){    /* Do we need to build the shell command pathname? */    if (!strlen(C_shlcmd))    {	if (sysinfo())	{	    char *cmdnam = C_isNT ? "\\cmd.exe" : "\\command.com";	    UINT len = GetSystemDirectory(C_shlcmd, sizeof(C_shlcmd) - strlen(cmdnam));	    if (len)		strcpy(C_shlcmd + len, cmdnam);	    else		return set_last_errno();	}	else	    return 0;    }    return 1;}#define C_get_hostname() (get_hostname() ? C_SCHEME_TRUE : C_SCHEME_FALSE)#define C_sysinfo() (sysinfo() ? C_SCHEME_TRUE : C_SCHEME_FALSE)#define C_get_shlcmd() (get_shlcmd() ? C_SCHEME_TRUE : C_SCHEME_FALSE)/* GetUserName */static int C_fcallget_user_name(){    if (!strlen(C_username))    {	DWORD bufCharCount = sizeof(C_username) / sizeof(C_username[0]);	if (!GetUserName(C_username, &bufCharCount))	    return set_last_errno();    }    return 1;}#define C_get_user_name() (get_user_name() ? C_SCHEME_TRUE : C_SCHEME_FALSE)/* User Information */#if 0static int C_fcallget_netinfo(){    HINSTANCE hNet = 0,	      hLoc = 0;    if (isNT)	hNet = LoadLibrary("netapi32.dll");    else    {	hLoc = LoadLibrary("rlocal32.dll");	hNet = LoadLibrary("radmin32.dll");	//hNet = LoadLibrary("netapi.dll");    }    if (!hNet)	return 0;    }#endif/*    Spawn a process directly.    Params:    app		Command to execute.    cmdlin	Command line (arguments).    env		Environment for the new process (may be NULL).    handle, stdin, stdout, stderr		Spawned process info are returned in integers.		When spawned process shares standard io stream with the parent		process the respective value in handle, stdin, stdout, stderr		is -1.    params	A bitmask controling operation.		Bit 1: Child & parent share standard input if this bit is set.		Bit 2: Share standard output if bit is set.		Bit 3: Share standard error if bit is set.    Returns: zero return value indicates failure.*/static int C_fcallC_process(const char * app, const char * cmdlin, const char ** env,	  int * phandle,	  int * pstdin_fd, int * pstdout_fd, int * pstderr_fd,	  int params){    int i;    int success = TRUE;    const int f_share_io[3] = { params & 1, params & 2, params & 4};    int io_fds[3] = { -1, -1, -1 };    HANDLE	child_io_handles[3] = { NULL, NULL, NULL },	standard_io_handles[3] = {	    GetStdHandle(STD_INPUT_HANDLE),	    GetStdHandle(STD_OUTPUT_HANDLE),	    GetStdHandle(STD_ERROR_HANDLE)};    const char modes[3] = "rww";    HANDLE cur_process = GetCurrentProcess(), child_process = NULL;    void* envblk = NULL;    /****** create io handles & fds ***/    for (i=0; i<3 && success; ++i)    {	if (f_share_io[i])	{	    success = DuplicateHandle(		cur_process, standard_io_handles[i],		cur_process, &child_io_handles[i],		0, FALSE, DUPLICATE_SAME_ACCESS);	}	else	{	    HANDLE a, b;	    success = CreatePipe(&a,&b,NULL,0);	    if(success)	    {		HANDLE parent_end;		if (modes[i]=='r') { child_io_handles[i]=a; parent_end=b; }		else		   { parent_end=a; child_io_handles[i]=b; }		success = (io_fds[i] = _open_osfhandle((long)parent_end,0)) >= 0;	    }	}    }    /****** make handles inheritable */    for (i=0; i<3 && success; ++i)	success = SetHandleInformation(child_io_handles[i], HANDLE_FLAG_INHERIT, -1);#if 0 /* Requires a sorted list by key! */    /****** create environment block if necessary ****/    if (env && success)    {	char** p;	int len = 0;	for (p = env; *p; ++p) len += strlen(*p) + 1;	if (envblk = C_malloc(len + 1))	{	    char* pb = (char*)envblk;	    for (p = env; *p; ++p)	    {		strcpy(pb, *p);		pb += strlen(*p) + 1;	    }	    *pb = '\0';	}	else	    success = FALSE;    }#endif    /****** finally spawn process ****/    if (success)    {	PROCESS_INFORMATION pi;	STARTUPINFO si;

⌨️ 快捷键说明

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