Re: Cross platform system information
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
|
Not Categorized, Please Help
|
|