📄 posixwin.c
字号:
}#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 + -