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

📄 uposixwin.c

📁 Scheme跨平台编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
static int C_fcallset_last_errno(){    set_errno(GetLastError());    return 0;}/* Functions for creating process with redirected I/O */static int C_fcallzero_handles(){    C_rd0 = C_wr0 = C_wr0_ = INVALID_HANDLE_VALUE;    C_rd1 = C_wr1 = C_rd1_ = INVALID_HANDLE_VALUE;    C_save0 = C_save1 = INVALID_HANDLE_VALUE;    return 1;}static int C_fcallclose_handles(){    if (C_rd0 != INVALID_HANDLE_VALUE)	CloseHandle(C_rd0);    if (C_rd1 != INVALID_HANDLE_VALUE)	CloseHandle(C_rd1);    if (C_wr0 != INVALID_HANDLE_VALUE)	CloseHandle(C_wr0);    if (C_wr1 != INVALID_HANDLE_VALUE)	CloseHandle(C_wr1);    if (C_rd1_ != INVALID_HANDLE_VALUE)	CloseHandle(C_rd1_);    if (C_wr0_ != INVALID_HANDLE_VALUE)	CloseHandle(C_wr0_);    if (C_save0 != INVALID_HANDLE_VALUE)    {	SetStdHandle(STD_INPUT_HANDLE, C_save0);	CloseHandle(C_save0);    }    if (C_save1 != INVALID_HANDLE_VALUE)    {	SetStdHandle(STD_OUTPUT_HANDLE, C_save1);	CloseHandle(C_save1);    }    return zero_handles();}static int C_fcallredir_io(){    SECURITY_ATTRIBUTES sa;    sa.nLength = sizeof(SECURITY_ATTRIBUTES);    sa.bInheritHandle = TRUE;    sa.lpSecurityDescriptor = NULL;    zero_handles();    C_save0 = GetStdHandle(STD_INPUT_HANDLE);    C_save1 = GetStdHandle(STD_OUTPUT_HANDLE);    if (!CreatePipe(&C_rd0, &C_wr0, &sa, 0)	    || !SetStdHandle(STD_INPUT_HANDLE, C_rd0)	    || !DuplicateHandle(GetCurrentProcess(), C_wr0, GetCurrentProcess(),		&C_wr0_, 0, FALSE, DUPLICATE_SAME_ACCESS)	    || !CreatePipe(&C_rd1, &C_wr1, &sa, 0)	    || !SetStdHandle(STD_OUTPUT_HANDLE, C_wr1)	    || !DuplicateHandle(GetCurrentProcess(), C_rd1, GetCurrentProcess(),		&C_rd1_, 0, FALSE, DUPLICATE_SAME_ACCESS))    {	set_last_errno();	close_handles();	return 0;    }    CloseHandle(C_wr0);    C_wr0 = INVALID_HANDLE_VALUE;    CloseHandle(C_rd1);    C_rd1 = INVALID_HANDLE_VALUE;    return 1;}static int C_fcallrun_process(char *cmdline){    PROCESS_INFORMATION pi;    STARTUPINFO si;    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));    ZeroMemory(&si, sizeof(STARTUPINFO));    si.cb = sizeof(STARTUPINFO);    C_wr0_ = C_rd1_ = INVALID_HANDLE_VALUE; /* these handles are saved */    if (CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 0, NULL,		      NULL, &si, &pi))    {	CloseHandle(pi.hThread);	SetStdHandle(STD_INPUT_HANDLE, C_save0);	SetStdHandle(STD_OUTPUT_HANDLE, C_save1);	C_save0 = C_save1 = INVALID_HANDLE_VALUE;	CloseHandle(C_rd0);	CloseHandle(C_wr1);	C_rd0 = C_wr1 = INVALID_HANDLE_VALUE;	return (int)pi.hProcess;    }    else	return set_last_errno();}static int C_fcallpipe_write(int hpipe, void* buf, int count){    DWORD done = 0;    if (WriteFile((HANDLE)hpipe, buf, count, &done, NULL))	return 1;    else	return set_last_errno();}static int C_fcallpipe_read(int hpipe){    DWORD done = 0;    /* TODO:    if (!pipe_ready(hpipe))	go_to_sleep;    */    if (ReadFile((HANDLE)hpipe, &C_rdbuf, 1, &done, NULL))    {	if (done > 0) /* not EOF yet */	    return 1;	else	    return -1;    }    return set_last_errno();}static int C_fcallpipe_ready(int hpipe){    DWORD avail = 0;    if (PeekNamedPipe((HANDLE)hpipe, NULL, 0, NULL, &avail, NULL) && avail)	return 1;    else    {	Sleep(0); /* give pipe a chance */	if (PeekNamedPipe((HANDLE)hpipe, NULL, 0, NULL, &avail, NULL))	    return (avail > 0);	else	    return 0;    }}#define C_zero_handles() C_fix(zero_handles())#define C_close_handles() C_fix(close_handles())#define C_redir_io() (redir_io() ? C_SCHEME_TRUE : C_SCHEME_FALSE)#define C_run_process(cmdline) C_fix(run_process(C_c_string(cmdline)))#define C_pipe_write(h, b, n) (pipe_write(C_unfix(h), C_c_string(b), C_unfix(n)) ? C_SCHEME_TRUE : C_SCHEME_FALSE)#define C_pipe_read(h) C_fix(pipe_read(C_unfix(h)))#define C_pipe_ready(h) (pipe_ready(C_unfix(h)) ? C_SCHEME_TRUE : C_SCHEME_FALSE)#define close_handle(h) CloseHandle((HANDLE)h)static int C_fcallprocess_wait(int h, int t){    if (WaitForSingleObject((HANDLE)h, (t ? 0 : INFINITE)) == WAIT_OBJECT_0)    {	DWORD ret;	if (GetExitCodeProcess((HANDLE)h, &ret))	{	    CloseHandle((HANDLE)h);	    C_exstatus = ret;	    return 1;	}    }    return set_last_errno();}#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.

⌨️ 快捷键说明

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