GETPROJENT(3PROJECT) Project Database Access Library Functions
NAME
getprojent, getprojbyname, getprojbyid, getdefaultproj, inproj,
getprojidbyname, setprojent, endprojent, fgetprojent - project
database entry operations
SYNOPSIS
cc [
flag... ]
file... -lproject [
library... ]
#include <project.h>
struct project *getprojent(
struct project *proj,
void *buffer,
size_t bufsize);
struct project *getprojbyname(
const char *name,
struct project *proj,
void *buffer,
size_t bufsize);
struct project *getprojbyid(
projid_t projid,
struct project *proj,
void *buffer,
size_t bufsize);
struct project *getdefaultproj(
const char *username,
struct project *proj,
void *buffer,
size_t bufsize);
int inproj(
const char *username,
const char *projname,
void *buffer,
size_t bufsize);
projid_t getprojidbyname(
const char *name);
void setprojent(
void);
void endprojent(
void);
struct project *fgetprojent(
FILE *f,
struct project *proj,
void *buffer,
size_t bufsize);
DESCRIPTION
These functions are used to obtain entries describing user projects.
Entries can come from any of the sources for a project specified in
the
/etc/nsswitch.conf file (see
nsswitch.conf(5)).
The
setprojent(),
getprojent(), and
endprojent() functions are used
to enumerate project entries from the database.
The
setprojent() function effectively rewinds the project database to
allow repeated searches. It sets (or resets) the enumeration to the
beginning of the set of project entries. This function should be
called before the first call to
getprojent().
The
getprojent() function returns a pointer to a structure containing
the broken-out fields of an entry in the project database. When first
called,
getprojent() returns a pointer to a project structure
containing the first project structure in the project database.
Successive calls can be used to read the entire database.
The
endprojent() function closes the project database and deallocates
resources when processing is complete. It is permissible, though
possibly less efficient, for the process to call more project
functions after calling
endprojent().
The
getprojbyname() function searches the project database for an
entry with the project name specified by the character string
name.
The
getprojbyid() function searches the project database for an entry
with the (numeric) project
ID specified by
projid.
The
getdefaultproj() function first looks up the project key word in
the
user_attr database used to define user attributes in restricted
Solaris environments. If the database is available and the keyword is
present, the function looks up the named project, returning
NULL if
it cannot be found or if the user is not a member of the named
project. If absent, the function looks for a match in the project
database for the special project
user.
username. If no match is found,
or if the user is excluded from project
user.
username, the function
looks at the default group entry of the
passwd database for the user,
and looks for a match in the project database for the special name
group.
groupname, where
groupname is the default group associated with
the password entry corresponding to the given
username. If no match
is found, or if the user is excluded from project
group.
groupname,
the function returns
NULL. A special project entry called 'default'
can be looked up and used as a last resort, unless the user is
excluded from project 'default'. On successful lookup, this function
returns a pointer to the valid
project structure. By convention, the
user must have a default project defined on a system to be able to
log on to that system.
The
inproj() function checks if the user specified by
username is
able to use the project specified by
projname. This function returns
1 if the user belongs to the list of project's users, if there is a
project's group that contains the specified user, if project is a
user's default project, or if project's user or group list contains
"*" wildcard. In all other cases it returns 0.
The
getprojidbyname() function searches the project database for an
entry with the project name specified by the character string name.
This function returns the project ID if the requested entry is found;
otherwise it returns -1.
The
fgetprojent() function, unlike the other functions described
above, does not use
nsswitch.conf; it reads and parses the next line
from the stream
f, which is assumed to have the format of the
project(5) file. This function returns the same values as
getprojent().
The
getprojent(),
getprojbyname(),
getprojbyid(),
getdefaultproj(),
and
inproj() functions are reentrant interfaces for operations with
the
project database. These functions use buffers supplied by the
caller to store returned results and are safe for use in both single-
threaded and multithreaded applications.
Reentrant interfaces require the additional arguments
proj,
buffer,
and
bufsize. The
proj argument must be a pointer to a
struct project structure allocated by the caller. On successful completion, the
function returns the project entry in this structure. Storage
referenced by the
project structure is allocated from the memory
provided with the
buffer argument, which is
bufsize bytes in size.
The content of the memory buffer could be lost in cases when these
functions return errors.
For enumeration in multithreaded applications, the position within
the enumeration is a process-wide property shared by all threads. The
setprojent() function can be used in a multithreaded application but
resets the enumeration position for all threads. If multiple threads
interleave calls to
getprojent(), the threads will enumerate disjoint
subsets of the project database. The
inproj(),
getprojbyname(),
getprojbyid(), and
getdefaultproj() functions leave the enumeration
position in an indeterminate state.
RETURN VALUES
Project entries are represented by the
struct project structure
defined in <
project.h>.
struct project {
char *pj_name; /* name of the project */
projid_t pj_projid; /* numerical project id */
char *pj_comment; /* project comment */
char **pj_users; /* vector of pointers to
project user names */
char **pj_groups; /* vector of pointers to
project group names */
char *pj_attr; /* project attributes */
};
The
getprojbyname() and
getprojbyid() functions each return a pointer
to a
struct project if they successfully locate the requested entry;
otherwise they return
NULL.
The
getprojent() function returns a pointer to a
struct project if it
successfully enumerates an entry; otherwise it returns
NULL,
indicating the end of the enumeration.
The
getprojidbyname() function returns the project ID if the
requested entry is found; otherwise it returns -1 and sets errno to
indicate the error.
When the pointer returned by the reentrant functions
getprojbyname(),
getprojbyid(), and
getprojent() is non-null, it is always equal to
the
proj pointer that was supplied by the caller.
Upon failure,
NULL is returned and errno is set to indicate the
error.
ERRORS
The
getprojent(),
getprojbyname(),
getprojbyid(),
inproj(),
getprojidbyname(),
fgetprojent(), and
getdefaultproj() functions will
fail if:
EINTR A signal was caught during the operation.
EIO An I/O error has occurred.
EMFILE There are
OPEN_MAX file descriptors currently open in the
calling process.
ENFILE The maximum allowable number of files is currently open in
the system.
ERANGE Insufficient storage was supplied by
buffer and
bufsize to
contain the data to be referenced by the resulting
project structure.
These functions can also fail if the name service switch does not
specify valid
project(5) name service sources. In the case of an
incompletely configured name service switch configuration,
getprojbyid() and other functions can return error values other than
those documented above. These conditions usually occur when the
nsswitch.conf file indicates that one or more name services is
providing entries for the project database when that name service
does not actually make a project table available.
USAGE
When compiling multithreaded applications, see
Intro(3), Notes On
Multithreaded Applications.
Use of the enumeration interface
getprojent() is discouraged.
Enumeration is supported for the project file, NIS, and LDAP but in
general is not efficient. The semantics of enumeration are discussed
further in
nsswitch.conf(5).
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+------------------+
|Interface Stability | Evolving |
+--------------------+------------------+
|MT-Level | See Description. |
+--------------------+------------------+
SEE ALSO
Intro(3),
sysconf(3C),
libproject(3LIB),
project_walk(3PROJECT),
nsswitch.conf(5),
project(5),
attributes(7) April 5, 2004 GETPROJENT(3PROJECT)