AG_User — agar
    user account information interface
AG_User provides a cross-platform method
    for accessing information about user accounts. Different backends may be
    implemented (see INTERNAL API below).
    Agar provides the following backends:
  - agUserOps_dummy
- No-op, returns no useful information.
- agUserOps_getenv
- Use the USER, UID,
      EUID, HOME and (optional)
      TMPDIR environment variables. Only
      USER can be queried.
- agUserOps_posix
- On Unix, use
      getpwent(3)
      or
      getpwnam_r(3).
      Since accessing the password database incurs startup overhead,
      "getenv" is the default (unless
      AG_InitCore(3)
      was called with the AG_POSIX_USERSflag
    option).
- agUserOps_win32
- On Windows, use CSIDL to locate a preferred
      AppData directory, and return it in the
      home field. Also return the preferred temporary
      directory in the tmp field. Other fields will
      contain no useful data.
- agUserOps_xbox
- On the Xbox console, check which drives are mounted and use either T:\ or
      D:\ as home.
AG_UserNew *
  
  AG_UserNew(void);
  
  AG_User *
  
  AG_GetUserByName(const
    char *name);
  
  AG_User *
  
  AG_GetUserByUID(Uint32
    uid);
  
  AG_User *
  
  AG_GetRealUser(void);
  
  AG_User *
  
  AG_GetEffectiveUser(void);
  
  void
  
  AG_UserFree(AG_User
    *);
  
  void
  
  AG_SetUserOps(const
    AG_UserOps *ops);
The
    AG_UserNew()
    function returns a newly-allocated AG_User
    structure. This structure is defined as:
typedef struct ag_user {
	char   name[AG_USER_NAME_MAX];  /* User name */
	Uint   flags;
#define AG_USER_NO_ACCOUNT 0x01 /* Not a real account */
	char  *passwd;          /* Encrypted password */
	Uint32 uid;             /* User ID */
	Uint32 gid;             /* Group ID */
	char  *loginClass;      /* Login class */
	char  *gecos;           /* Honeywell login info */
	char  *home;            /* Home directory */
	char  *shell;           /* Default shell */
	char  *tmp;             /* Temp. directory */
	AG_TAILQ_ENTRY(ag_user) users;
} AG_User;
 
The
    AG_GetUserByName()
    and AG_GetUserByUID() functions look up a user
    account by name string, or numerical identifier.
The
    AG_GetRealUser()
    and AG_GetEffectiveUser() functions return account
    information for the user corresponding to the real or effective UID of the
    calling process (if available).
The
    AG_UserFree()
    routine releases the specified AG_User
  structure.
The AG_User backend
    in use by default is determined in a platform-specific way. To register or
    select a specific backend,
    AG_SetUserOps()
    may be used.
The argument to AG_SetUserOps() should
    point to the following structure:
typedef struct ag_user_ops {
	const char *name;           /* Backend name */
	void (*init)(void);
	void (*destroy)(void);
	int  (*getUserByName)(AG_User *, const char *);
	int  (*getUserByUID)(AG_User *, Uint32);
	int  (*getRealUser)(AG_User *);
	int  (*getEffectiveUser)(AG_User *);
} AG_UserOps;
 
The
    init() method
    performs any necessary initialization. The
    destroy()
    method cleans up any allocated resources.
On success the
    getUserByName(),
    getUserByUID(),
    getRealUser()
    and
    getEffectiveUser()
    methods should set the fields of the AG_User argument
    and return 0. On error, they should return -1.
The AG_User interface first appeared in
    Agar 1.5.0. The "getenv" module was added in Agar 1.6.0.