diff options
Diffstat (limited to 'doc/posix_users/procenv.t')
-rw-r--r-- | doc/posix_users/procenv.t | 964 |
1 files changed, 964 insertions, 0 deletions
diff --git a/doc/posix_users/procenv.t b/doc/posix_users/procenv.t new file mode 100644 index 0000000000..db3f8936d8 --- /dev/null +++ b/doc/posix_users/procenv.t @@ -0,0 +1,964 @@ +@c +@c COPYRIGHT (c) 1988-2002. +@c On-Line Applications Research Corporation (OAR). +@c All rights reserved. +@c +@c $Id$ +@c + +@chapter Process Environment Manager + +@section Introduction + +The process environment manager is responsible for providing the +functions related to user and group Id management. + +The directives provided by the process environment manager are: + +@itemize @bullet +@item @code{getpid} - Get Process ID +@item @code{getppid} - Get Parent Process ID +@item @code{getuid} - Get User ID +@item @code{geteuid} - Get Effective User ID +@item @code{getgid} - Get Real Group ID +@item @code{getegid} - Get Effective Group ID +@item @code{setuid} - Set User ID +@item @code{setgid} - Set Group ID +@item @code{getgroups} - Get Supplementary Group IDs +@item @code{getlogin} - Get User Name +@item @code{getlogin_r} - Reentrant Get User Name +@item @code{getpgrp} - Get Process Group ID +@item @code{setsid} - Create Session and Set Process Group ID +@item @code{setpgid} - Set Process Group ID for Job Control +@item @code{uname} - Get System Name +@item @code{times} - Get Process Times +@item @code{getenv} - Get Environment Variables +@item @code{setenv} - Set Environment Variables +@item @code{ctermid} - Generate Terminal Pathname +@item @code{ttyname} - Determine Terminal Device Name +@item @code{ttyname_r} - Reentrant Determine Terminal Device Name +@item @code{isatty} - Determine if File Descriptor is Terminal +@item @code{sysconf} - Get Configurable System Variables +@end itemize + +@section Background + +@subsection Users and Groups + +RTEMS provides a single process, multi-threaded execution environment. +In this light, the notion of user and group is somewhat without meaning. +But RTEMS does provide services to provide a synthetic version of +user and group. By default, a single user and group is associated +with the application. Thus unless special actions are taken, +every thread in the application shares the same user and group Id. +The initial rationale for providing user and group Id functionality +in RTEMS was for the filesystem infrastructure to implement +file permission checks. The effective user/group Id capability +has since been used to implement permissions checking by +the @code{ftpd} server. + +In addition to the "real" user and group Ids, a process may +have an effective user/group Id. This allows a process to +function using a more limited permission set for certain operations. + +@subsection User and Group Names + +POSIX considers user and group Ids to be a unique integer that +may be associated with a name. This is usually accomplished +via a file named @code{/etc/passwd} for user Id mapping and +@code{/etc/groups} for group Id mapping. Again, although +RTEMS is effectively a single process and thus single user +system, it provides limited support for user and group +names. When configured with an appropriate filesystem, RTEMS +will access the appropriate files to map user and group Ids +to names. + +If these files do not exist, then RTEMS will synthesize +a minimal version so this family of services return without +error. It is important to remember that a design goal of +the RTEMS POSIX services is to provide useable and +meaningful results even though a full process model +is not available. + +@subsection Environment Variables + +POSIX allows for variables in the run-time environment. These are +name/value pairs that make be dynamically set and obtained by +programs. In a full POSIX environment with command line shell +and multiple processes, environment variables may be set in +one process -- such as the shell -- and inherited by child +processes. In RTEMS, there is only one process and thus +only one set of environment variables across all processes. + + +@section Operations + +@subsection Accessing User and Group Ids + +The user Id associated with the current thread may be obtain +using the @code{getuid()} service. Similarly, the group Id +may be obtained using the @code{getgid()} service. + +@subsection Accessing Environment Variables + +The value associated with an environment variable may be +obtained using the @code{getenv()} service and set using +the @code{putenv()} service. + +@section Directives + +This section details the process environment manager's directives. +A subsection is dedicated to each of this manager's directives +and describes the calling sequence, related constants, usage, +and status codes. + +@c +@c +@c +@page +@subsection getpid - Get Process ID + +@findex getpid +@cindex get process id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int getpid( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +The process Id is returned. + +@subheading DESCRIPTION: + +This service returns the process Id. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection getppid - Get Parent Process ID + +@findex getppid +@cindex get parent process id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int getppid( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +The parent process Id is returned. + +@subheading DESCRIPTION: + +This service returns the parent process Id. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection getuid - Get User ID + +@findex getuid +@cindex get user id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int getuid( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +The effective user Id is returned. + +@subheading DESCRIPTION: + +This service returns the effective user Id. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection geteuid - Get Effective User ID + +@findex geteuid +@cindex get effective user id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int geteuid( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +The effective group Id is returned. + +@subheading DESCRIPTION: + +This service returns the effective group Id. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection getgid - Get Real Group ID + +@findex getgid +@cindex get real group id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int getgid( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +The group Id is returned. + +@subheading DESCRIPTION: + +This service returns the group Id. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection getegid - Get Effective Group ID + +@findex getegid +@cindex get effective group id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int getegid( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +The effective group Id is returned. + +@subheading DESCRIPTION: + +This service returns the effective group Id. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection setuid - Set User ID + +@findex setuid +@cindex set user id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int setuid( + uid_t uid +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +This service returns 0. + +@subheading DESCRIPTION: + +This service sets the user Id to @code{uid}. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection setgid - Set Group ID + +@findex setgid +@cindex set group id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int setgid( + gid_t gid +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +This service returns 0. + +@subheading DESCRIPTION: + +This service sets the group Id to @code{gid}. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection getgroups - Get Supplementary Group IDs + +@findex getgroups +@cindex get supplementary group ids + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int getgroups( + int gidsetsize, + gid_t grouplist[] +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +NA + +@subheading DESCRIPTION: + +This service is not implemented as RTEMS has no notion of +supplemental groups. + +@subheading NOTES: + +If supported, this routine would only be allowed for +the super-user. + +@c +@c +@c +@page +@subsection getlogin - Get User Name + +@findex getlogin +@cindex get user name + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +char *getlogin( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +Returns a pointer to a string containing the name of the +current user. + +@subheading DESCRIPTION: + +This routine returns the name of the current user. + +@subheading NOTES: + +This routine is not reentrant and subsequent calls to +@code{getlogin()} will overwrite the same buffer. + +@c +@c +@c +@page +@subsection getlogin_r - Reentrant Get User Name + +@findex getlogin_r +@cindex reentrant get user name +@cindex get user name, reentrant + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int getlogin_r( + char *name, + size_t namesize +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +@table @b +@item EINVAL +The arguments were invalid. + +@end table + +@subheading DESCRIPTION: + +This is a reentrant version of the @code{getlogin()} service. The +caller specified their own buffer, @code{name}, as well as the +length of this buffer, @code{namesize}. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection getpgrp - Get Process Group ID + +@findex getpgrp +@cindex get process group id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +pid_t getpgrp( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +The procress group Id is returned. + +@subheading DESCRIPTION: + +This service returns the current progress group Id. + +@subheading NOTES: + +This routine is implemented in a somewhat meaningful +way for RTEMS but is truly not functional. + +@c +@c +@c +@page +@subsection setsid - Create Session and Set Process Group ID + +@findex setsid +@cindex create session and set process group id + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +pid_t setsid( void ); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +@table @b +@item EPERM +The application does not have permission to create a process group. + +@end table + +@subheading DESCRIPTION: + +This routine always returns @code{EPERM} as RTEMS has no way +to create new processes and thus no way to create a new process +group. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection setpgid - Set Process Group ID for Job Control + +@findex setpgid +@cindex set process group id for job control + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int setpgid( + pid_t pid, + pid_t pgid +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +@table @b +@item ENOSYS +The routine is not implemented. + +@end table + +@subheading DESCRIPTION: + +This service is not implemented for RTEMS as process groups are not +supported. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection uname - Get System Name + +@findex uname +@cindex get system name + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int uname( + struct utsname *name +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +@table @b +@item EPERM +The provided structure pointer is invalid. + +@end table + +@subheading DESCRIPTION: + +This service returns system information to the caller. It does this +by filling in the @code{struct utsname} format structure for the +caller. + +@subheading NOTES: + +The information provided includes the operating system (RTEMS in +all configurations), the node number, the release as the RTEMS +version, and the CPU family and model. The CPU model name +will indicate the multilib executive variant being used. + +@c +@c +@c +@page +@subsection times - Get process times + +@findex times +@cindex get process times + +@subheading CALLING SEQUENCE: + +@example +#include <sys/time.h> + +clock_t times( + struct tms *ptms +); +@end example + +@subheading STATUS CODES: + +This routine returns the number of clock ticks that have elapsed +since the system was initialized (e.g. the application was +started). + +@subheading DESCRIPTION: + +@code{times} stores the current process times in @code{ptms}. The +format of @code{struct tms} is as defined in +@code{<sys/times.h>}. RTEMS fills in the field @code{tms_utime} +with the number of ticks that the calling thread has executed +and the field @code{tms_stime} with the number of clock ticks +since system boot (also returned). All other fields in the +@code{ptms} are left zero. + +@subheading NOTES: + +RTEMS has no way to distinguish between user and system time +so this routine returns the most meaningful information +possible. + +@c +@c +@c +@page +@subsection getenv - Get Environment Variables + +@findex getenv +@cindex get environment variables + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +char *getenv( + const char *name +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +@table @b +@item NULL +when no match + +@item pointer to value +when successful + +@end table + +@subheading DESCRIPTION: + +This service searches the set of environment variables for +a string that matches the specified @code{name}. If found, +it returns the associated value. + +@subheading NOTES: + +The environment list consists of name value pairs that +are of the form @i{name = value}. + +@c +@c +@c +@page +@subsection setenv - Set Environment Variables + +@findex setenv +@cindex set environment variables + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int setenv( + const char *name, + const char *value, + int overwrite +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +Returns 0 if successful and -1 otherwise. + +@subheading DESCRIPTION: + +This service adds the variable @code{name} to the environment with +@code{value}. If @code{name} is not already exist, then it is +created. If @code{name} exists and @code{overwrite} is zero, then +the previous value is not overwritten. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection ctermid - Generate Terminal Pathname + +@findex ctermid +@cindex generate terminal pathname + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +char *ctermid( + char *s +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +Returns a pointer to a string indicating the pathname for the controlling +terminal. + +@subheading DESCRIPTION: + +This service returns the name of the terminal device associated with +this process. If @code{s} is NULL, then a pointer to a static buffer +is returned. Otherwise, @code{s} is assumed to have a buffer of +sufficient size to contain the name of the controlling terminal. + +@subheading NOTES: + +By default on RTEMS systems, the controlling terminal is @code{/dev/console}. +Again this implementation is of limited meaning, but it provides +true and useful results which should be sufficient to ease porting +applications from a full POSIX implementation to the reduced +profile supported by RTEMS. + +@c +@c +@c +@page +@subsection ttyname - Determine Terminal Device Name + +@findex ttyname +@cindex determine terminal device name + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +char *ttyname( + int fd +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +Pointer to a string containing the terminal device name or +NULL is returned on any error. + +@subheading DESCRIPTION: + +This service returns a pointer to the pathname of the terminal +device that is open on the file descriptor @code{fd}. If +@code{fd} is not a valid descriptor for a terminal device, +then NULL is returned. + +@subheading NOTES: + +This routine uses a static buffer. + +@c +@c +@c +@page +@subsection ttyname_r - Reentrant Determine Terminal Device Name + +@findex ttyname_r +@cindex reentrant determine terminal device name + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int ttyname_r( + int fd, + char *name, + int namesize +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +This routine returns -1 and sets @code{errno} as follows: + +@table @b +@item EBADF +If not a valid descriptor for a terminal device. + +@item EINVAL +If @code{name} is NULL or @code{namesize} are insufficient. + +@end table + +@subheading DESCRIPTION: + +This service the pathname of the terminal device that is open +on the file descriptor @code{fd}. + +@subheading NOTES: + +NONE + +@c +@c +@c +@page +@subsection isatty - Determine if File Descriptor is Terminal + +@findex isatty +@cindex determine if file descriptor is terminal + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +int isatty( + int fd +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +Returns 1 if @code{fd} is a terminal device and 0 otherwise. + +@subheading DESCRIPTION: + +This service returns 1 if @code{fd} is an open file descriptor +connected to a terminal and 0 otherwise. + +@subheading NOTES: + +@c +@c +@c +@page +@subsection sysconf - Get Configurable System Variables + +@findex sysconf +@cindex get configurable system variables + +@subheading CALLING SEQUENCE: + +@ifset is-C +@example +long sysconf( + int name +); +@end example +@end ifset + +@ifset is-Ada +@end ifset + +@subheading STATUS CODES: + +The value returned is the actual value of the system resource. +If the requested configuration name is a feature flag, then +1 is returned if the available and 0 if it is not. On any +other error condition, -1 is returned. + +@subheading DESCRIPTION: + +This service is the mechanism by which an application determines +values for system limits or options at runtime. + +@subheading NOTES: + +Much of the information that may be obtained via @code{sysconf} +has equivalent macros in @code{<unistd.h}. However, those +macros reflect conservative limits which may have been altered +by application configuration. |