Hello Charles,

On Friday, April 2, 2004 at 6:21:55 AM you wrote (at least in part):

>>> I hope this isn't some kind of bitmasking thing, because that just
>>> makes my head spin.
>> That is exactly what it is...

> So how does one deal with that?

Carefully.

> How does this work?

Good.

:-)

OK, an example: PW_GID is set to 44 (0x2C), that's 0x04 + 0x08 + 0x20,
means NO_WEBMAIL, NO_IMAP & NO_RELAY.

To figure if the user is set to NO_DIALUP check:

PW_GID & 64 (0x40 for NO_DIALUP):

  44 &   64 = 0
0x2C & 0x40 = 0

Or in binary notation:
  00101100
& 01000000
==========
  00000000 = 0x00 == 0 decimal.

So this user has not NO_DIALUP set.

No imagine a user set to NO_DIALUP, NO_WEBMAIL and NO_RELAY:

0x04 + 0x20 + 0x40 = 0x64
   4 +   32 +   64 =  100 (decimal)

PW_GID & 64 (0x40 for NO_DIALUP):

 100 &   64 =   64 (decimal)
0x64 & 0x40 = 0x40

  01100100
& 01000000
==========
  01000000 = 0x40 == 64 decimal.

So to see if a flag is set AND operate on PW_GID and FLAG and see if
the result is different from zero. As every flag gets a different bit
assigned this bit, and only this bit, will be set when you AND operate
and this bit was set in PW_GID's value.

In cat it is really quite easy to handle and most programming
languages should be able to bit-operate with integer values too. So
you wouldn't even have to convert PW_GID into a "real bitmask", in
fact the integer already is one: just use an arbitrary calculator to
translate an arbitrary decimal value into binary representation.
No "translate" all the hex values for different flags into binary and
you'll see: they all have /exactly/ one bit set to 1. Not more, not
less. And this is all about how it works :-)

HTH
-- 
Best regards
Peter Palmreuther

Once a job is fouled up, anything done to improve it only makes it
worse.

Reply via email to