Re: Cross platform system information
- Posted by Michael J. Sabal <m_sabal at yahoo.co?> Jul 06, 2007
- 563 views
Anyway, here's the long code to do it. I have no idea how DOS would return anything meaningful, unless it were from a Watcom call to uname().
-- Returns a sequence (empty if there's an error): -- {sequence SYSNAME, -- sequence NODENAME, -- sequence RELEASE, -- sequence VERSION, -- sequence MACHINE, -- sequence USERNAME} include machine.e include dll.e include misc.e object dll_, uname_ if platform()=DOS32 then dll_ = -1 uname_ = -1 elsif platform()=WIN32 then dll_ = open_dll("kernel32.dll") uname_ = define_c_func(dll_,"GetVersionExA",{C_POINTER},C_UINT) elsif platform()=LINUX then dll_ = open_dll("libc.so") uname_ = define_c_func(dll_,"uname",{C_POINTER},C_UINT) end if function get_string(atom lpsz) atom ptr, c sequence s s = "" if lpsz = 0 then return s end if ptr = 0 c = peek(lpsz+ptr) while c != 0 do s = s & c ptr = ptr + 1 c = peek(lpsz+ptr) end while return s end function function windows_username() sequence username atom advapi_, getusername_ atom user_struct, status advapi_ = open_dll("advapi32.dll") getusername_ = define_c_func(advapi_,"GetUserNameA",{C_POINTER,C_POINTER},C_INT) user_struct = allocate(261) poke4(user_struct,256) status = c_func(getusername_,{user_struct+4,user_struct}) if not status then free(user_struct) return "" end if username = get_string(user_struct+4) free(user_struct) return username end function function linux_username() sequence username atom uid, pwptr, pwptr1 atom getuid_, getpwuid_ getuid_ = define_c_func(dll_,"getuid",{},C_UINT) getpwuid_ = define_c_func(dll_,"getpwuid",{C_UINT},C_POINTER) uid = c_func(getuid_,{}) pwptr = c_func(getpwuid_,{uid}) if pwptr > 0 then pwptr1 = peek4u(pwptr) -- Linux 2.4: pwptr = {username, password_hash, uid, gid, Real name, home dir, shell} username = get_string(pwptr1+0) free(pwptr1) return username end if return "" end function global function uname() atom utsname, getcompname_ atom compnameptr sequence compname integer status sequence rtn atom sizeof_utsnamestr if platform()=DOS32 then elsif platform()=WIN32 then getcompname_ = define_c_proc(dll_,"GetComputerNameExA",{C_UINT,C_POINTER,C_POINTER}) compnameptr = allocate(261) poke4(compnameptr,256) c_proc(getcompname_,{1,compnameptr+4,compnameptr}) compname = get_string(compnameptr+4) free(compnameptr) utsname = allocate((5*4)+128+8) poke4(utsname,156) status = c_func(uname_,{utsname}) if status = 0 then poke4(utsname,148) status = c_func(uname_,{utsname}) if status = 0 then return {} end if end if rtn = {"Microsoft Windows", compname, -- hostname sprintf("%d.%d.%d.%d",{peek4u(utsname+4),peek4u(utsname+8),peek(utsname+148)+(peek(utsname+149)*256), peek(utsname+150)+(peek(utsname+151)*256)}), sprintf("Build %d",peek4u(utsname+12)), sprintf("%d",peek4u(utsname+16)), windows_username()} free(utsname) return rtn elsif platform()=LINUX then sizeof_utsnamestr=65 utsname = allocate(sizeof_utsnamestr*6) status = c_func(uname_,{utsname}) if status < 0 then return {} end if rtn = {get_string(utsname+0), get_string(utsname+(sizeof_utsnamestr*1)), get_string(utsname+(sizeof_utsnamestr*2)), get_string(utsname+(sizeof_utsnamestr*3)), get_string(utsname+(sizeof_utsnamestr*4)), linux_username()} free(utsname) return rtn end if return {} end function