flags for st_mode of stat system call

19,146

Solution 1

mode is a bitfield which is a common way to pack data. Think of each bit in the field as being a toggle switch which can be set to off or on. To check if the toggle is on, you check to see if the appropriate bit has been set using the & operator. You can set bits using | and clear them using ~ bitwise operations.

Solution 2

Well, the POSIX spec for <sys/stat.h> enumerates everything you can learn from the st_mode field of struct stat.

Is your question "What can this field tell me", or is it "How do I extract the information", or both?

Solution 3

It's common in operating system programing to use unsigned integers to hold a series of bits that describe something. In this case, mode has 9 bits of interest. One bit tells if the owner can read, one for owner write, one for owner execute, and similar bits for the group and others. The trick is in extracting whether a bit is set or not.

Here's an example. The S_IRUSR is a name for a bitmask that describes the "owner read" bit. It's defined in the specs as 0400 (octal) which translates to 100000000 in binary. When you take the binary and of this value with the mask, you get the value 100000000 (binary) if the 9th bit of the mask is set. Otherwise you get 0.

The if-statement evaluates to true if the large value is returned, and false otherwise. This way if the bit is set, 'r' is written into the string into position 1. The same technique applies to all of the other bits as well.

Share:
19,146
Christian Wagner
Author by

Christian Wagner

Updated on June 19, 2022

Comments

  • Christian Wagner
    Christian Wagner about 2 years

    I'm trying to understand the flags for the st_mode field of the stat structure of that stat command, but I'm having such a hard time! I found this example here, but I really don't understand this code fragment:

    if ( mode & S_IRUSR ) str[1] = 'r';    /* 3 bits for user  */
    if ( mode & S_IWUSR ) str[2] = 'w';
    if ( mode & S_IXUSR ) str[3] = 'x';
    
    if ( mode & S_IRGRP ) str[4] = 'r';    /* 3 bits for group */
    if ( mode & S_IWGRP ) str[5] = 'w';
    if ( mode & S_IXGRP ) str[6] = 'x';
    
    if ( mode & S_IROTH ) str[7] = 'r';    /* 3 bits for other */
    if ( mode & S_IWOTH ) str[8] = 'w';
    if ( mode & S_IXOTH ) str[9] = 'x';
    

    I know that "&" is the bitwise AND operator, but nothing else. I don't even know what to ask.

    PD: Sorry about the previous questions I asked. I don't know how to mark a question answered or anything like that :(

  • Gandaro
    Gandaro about 12 years
    Thanks, I did not know it was octal, so my program did not work! :-)