apply a structure to memory data

Just starting out? Need help? Post your questions and find answers here.
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Post by srod »

Fred wrote:The first time ever i've seen a structure like that...
I agree, very strange.

@frederick: your hex dump suggests fixed length character arrays padded with zeros A rough count suggests 65 bytes.

Could your documentation be incorrect?
I may look like a mule, but I'm not a complete ass.
frederic
User
User
Posts: 56
Joined: Thu Jan 05, 2006 11:22 pm

Post by frederic »

some info in french about the length

Code: Select all

       À cette fin, Linux utilise les appels système sethostname(2) et  setdo‐
       mainname(2).  Notez qu’aucun standard ne dit que le nom d’hôte fixé par
       sethostname(2) représente la même chaîne que le champ  nodename  de  la
       structure  renvoyée  par uname() (de fait, certains systèmes autorisent
       un nom d’hôte de 256 octets et un nom de  noeud  sur  8  octets),  mais
       c’est  le cas sous Linux. La même chose est vraie pour setdomainname(2)
       et le champ domainname.

       La longueur  des  champs  de  la  structure  varie.  Certains  systèmes
       d’exploitation  ou bibliothèques utilisent des valeurs en dur de 9, 33,
       65, ou 257. D’autres systèmes utilisent SYS_NMLN, _SYS_NMLN, UTSLEN  ou
       _UTSNAME_LENGTH.  Clairement, il faut éviter d’utiliser ces constantes,
       employez plutôt sizeof(...). On choisit souvent la valeur 257 qui  per‐
       met de stocker un nom d’hôte Internet entier.

       Il y a eu trois appels système uname() sous Linux. Le premier utilisait
       une longueur de 9, le second de 65 et le troisième utilise également 65
       mais ajoute le champ domainname.
Fred
Administrator
Administrator
Posts: 18247
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

Yes, on my linux box (debian), it's defined like that:

Code: Select all

struct old_utsname {
        char sysname[65];
        char nodename[65];
        char release[65];
        char version[65];
        char machine[65];
};
Just replace that with FixedString.s{65} and you're done.
frederic
User
User
Posts: 56
Joined: Thu Jan 05, 2006 11:22 pm

Post by frederic »

Great, i'm done :)

Code: Select all

Structure  old_utsname 
       sysname.s{65}
       nodename.s{65}
       release.s{65}
       version.s{65}
       machine.s{65}
EndStructure

Global *test.old_utsname=AllocateMemory(SizeOf(old_utsname)) 

If uname_(*test) = 0
        With *test
          Debug \sysname
          Debug \nodename
          Debug \release
          Debug \version
          Debug \machine
        EndWith 
Else
        Debug "error"
EndIf
Dare
Addict
Addict
Posts: 1965
Joined: Mon May 29, 2006 1:01 am
Location: Outback

Post by Dare »

Looks like each field is a fixed string, left justified, right zero filled (an old method) and 65 bytes long. This would allow for strings of up to 64 characters.

So if you know the number of fields you can just step through.


Edit:

Whup - didn't read page 2 of the thread! Ignore this! :oops:
Dare2 cut down to size
Kale
PureBasic Expert
PureBasic Expert
Posts: 3000
Joined: Fri Apr 25, 2003 6:03 pm
Location: Lincoln, UK
Contact:

Post by Kale »

srod wrote:Not sure you've followed the thread correctly kale. uname_() is an external function.
Woah, i think ur right, none of these post were here when i hit reply. :)
--Kale

Image
Fred
Administrator
Administrator
Posts: 18247
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

BTW, you don't need to use AllocateMemory() for that:

Code: Select all

Structure  old_utsname
       sysname.s{65}
       nodename.s{65}
       release.s{65}
       version.s{65}
       machine.s{65}
EndStructure

Global test.old_utsname

If uname_(@test) = 0
        With test
          Debug \sysname
          Debug \nodename
          Debug \release
          Debug \version
          Debug \machine
        EndWith
Else
        Debug "error"
EndIf
Post Reply