summaryrefslogtreecommitdiffstats
path: root/posix_users/process_environment.rst
diff options
context:
space:
mode:
Diffstat (limited to 'posix_users/process_environment.rst')
-rw-r--r--posix_users/process_environment.rst765
1 files changed, 765 insertions, 0 deletions
diff --git a/posix_users/process_environment.rst b/posix_users/process_environment.rst
new file mode 100644
index 0000000..0deee9d
--- /dev/null
+++ b/posix_users/process_environment.rst
@@ -0,0 +1,765 @@
+Process Environment Manager
+###########################
+
+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:
+
+- ``getpid`` - Get Process ID
+
+- ``getppid`` - Get Parent Process ID
+
+- ``getuid`` - Get User ID
+
+- ``geteuid`` - Get Effective User ID
+
+- ``getgid`` - Get Real Group ID
+
+- ``getegid`` - Get Effective Group ID
+
+- ``setuid`` - Set User ID
+
+- ``setgid`` - Set Group ID
+
+- ``getgroups`` - Get Supplementary Group IDs
+
+- ``getlogin`` - Get User Name
+
+- ``getlogin_r`` - Reentrant Get User Name
+
+- ``getpgrp`` - Get Process Group ID
+
+- ``setsid`` - Create Session and Set Process Group ID
+
+- ``setpgid`` - Set Process Group ID for Job Control
+
+- ``uname`` - Get System Name
+
+- ``times`` - Get Process Times
+
+- ``getenv`` - Get Environment Variables
+
+- ``setenv`` - Set Environment Variables
+
+- ``ctermid`` - Generate Terminal Pathname
+
+- ``ttyname`` - Determine Terminal Device Name
+
+- ``ttyname_r`` - Reentrant Determine Terminal Device Name
+
+- ``isatty`` - Determine if File Descriptor is Terminal
+
+- ``sysconf`` - Get Configurable System Variables
+
+Background
+==========
+
+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 ``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.
+
+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 ``/etc/passwd`` for user Id mapping and``/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.
+
+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.
+
+Operations
+==========
+
+Accessing User and Group Ids
+----------------------------
+
+The user Id associated with the current thread may be obtain
+using the ``getuid()`` service. Similarly, the group Id
+may be obtained using the ``getgid()`` service.
+
+Accessing Environment Variables
+-------------------------------
+
+The value associated with an environment variable may be
+obtained using the ``getenv()`` service and set using
+the ``putenv()`` service.
+
+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.
+
+getpid - Get Process ID
+-----------------------
+.. index:: getpid
+.. index:: get process id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int getpid( void );
+
+**STATUS CODES:**
+
+The process Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the process Id.
+
+**NOTES:**
+
+NONE
+
+getppid - Get Parent Process ID
+-------------------------------
+.. index:: getppid
+.. index:: get parent process id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int getppid( void );
+
+**STATUS CODES:**
+
+The parent process Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the parent process Id.
+
+**NOTES:**
+
+NONE
+
+getuid - Get User ID
+--------------------
+.. index:: getuid
+.. index:: get user id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int getuid( void );
+
+**STATUS CODES:**
+
+The effective user Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the effective user Id.
+
+**NOTES:**
+
+NONE
+
+geteuid - Get Effective User ID
+-------------------------------
+.. index:: geteuid
+.. index:: get effective user id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int geteuid( void );
+
+**STATUS CODES:**
+
+The effective group Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the effective group Id.
+
+**NOTES:**
+
+NONE
+
+getgid - Get Real Group ID
+--------------------------
+.. index:: getgid
+.. index:: get real group id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int getgid( void );
+
+**STATUS CODES:**
+
+The group Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the group Id.
+
+**NOTES:**
+
+NONE
+
+getegid - Get Effective Group ID
+--------------------------------
+.. index:: getegid
+.. index:: get effective group id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int getegid( void );
+
+**STATUS CODES:**
+
+The effective group Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the effective group Id.
+
+**NOTES:**
+
+NONE
+
+setuid - Set User ID
+--------------------
+.. index:: setuid
+.. index:: set user id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int setuid(
+ uid_t uid
+ );
+
+**STATUS CODES:**
+
+This service returns 0.
+
+**DESCRIPTION:**
+
+This service sets the user Id to ``uid``.
+
+**NOTES:**
+
+NONE
+
+setgid - Set Group ID
+---------------------
+.. index:: setgid
+.. index:: set group id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int setgid(
+ gid_t gid
+ );
+
+**STATUS CODES:**
+
+This service returns 0.
+
+**DESCRIPTION:**
+
+This service sets the group Id to ``gid``.
+
+**NOTES:**
+
+NONE
+
+getgroups - Get Supplementary Group IDs
+---------------------------------------
+.. index:: getgroups
+.. index:: get supplementary group ids
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int getgroups(
+ int gidsetsize,
+ gid_t grouplist[]
+ );
+
+**STATUS CODES:**
+
+NA
+
+**DESCRIPTION:**
+
+This service is not implemented as RTEMS has no notion of
+supplemental groups.
+
+**NOTES:**
+
+If supported, this routine would only be allowed for
+the super-user.
+
+getlogin - Get User Name
+------------------------
+.. index:: getlogin
+.. index:: get user name
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ char \*getlogin( void );
+
+**STATUS CODES:**
+
+Returns a pointer to a string containing the name of the
+current user.
+
+**DESCRIPTION:**
+
+This routine returns the name of the current user.
+
+**NOTES:**
+
+This routine is not reentrant and subsequent calls to``getlogin()`` will overwrite the same buffer.
+
+getlogin_r - Reentrant Get User Name
+------------------------------------
+.. index:: getlogin_r
+.. index:: reentrant get user name
+.. index:: get user name, reentrant
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int getlogin_r(
+ char \*name,
+ size_t namesize
+ );
+
+**STATUS CODES:**
+
+*EINVAL*
+ The arguments were invalid.
+
+**DESCRIPTION:**
+
+This is a reentrant version of the ``getlogin()`` service. The
+caller specified their own buffer, ``name``, as well as the
+length of this buffer, ``namesize``.
+
+**NOTES:**
+
+NONE
+
+getpgrp - Get Process Group ID
+------------------------------
+.. index:: getpgrp
+.. index:: get process group id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ pid_t getpgrp( void );
+
+**STATUS CODES:**
+
+The procress group Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the current progress group Id.
+
+**NOTES:**
+
+This routine is implemented in a somewhat meaningful
+way for RTEMS but is truly not functional.
+
+setsid - Create Session and Set Process Group ID
+------------------------------------------------
+.. index:: setsid
+.. index:: create session and set process group id
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ pid_t setsid( void );
+
+**STATUS CODES:**
+
+*EPERM*
+ The application does not have permission to create a process group.
+
+**DESCRIPTION:**
+
+This routine always returns ``EPERM`` as RTEMS has no way
+to create new processes and thus no way to create a new process
+group.
+
+**NOTES:**
+
+NONE
+
+setpgid - Set Process Group ID for Job Control
+----------------------------------------------
+.. index:: setpgid
+.. index:: set process group id for job control
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int setpgid(
+ pid_t pid,
+ pid_t pgid
+ );
+
+**STATUS CODES:**
+
+*ENOSYS*
+ The routine is not implemented.
+
+**DESCRIPTION:**
+
+This service is not implemented for RTEMS as process groups are not
+supported.
+
+**NOTES:**
+
+NONE
+
+uname - Get System Name
+-----------------------
+.. index:: uname
+.. index:: get system name
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int uname(
+ struct utsname \*name
+ );
+
+**STATUS CODES:**
+
+*EPERM*
+ The provided structure pointer is invalid.
+
+**DESCRIPTION:**
+
+This service returns system information to the caller. It does this
+by filling in the ``struct utsname`` format structure for the
+caller.
+
+**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.
+
+times - Get process times
+-------------------------
+.. index:: times
+.. index:: get process times
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ #include <sys/time.h>
+ clock_t times(
+ struct tms \*ptms
+ );
+
+**STATUS CODES:**
+
+This routine returns the number of clock ticks that have elapsed
+since the system was initialized (e.g. the application was
+started).
+
+**DESCRIPTION:**
+
+``times`` stores the current process times in ``ptms``. The
+format of ``struct tms`` is as defined in``<sys/times.h>``. RTEMS fills in the field ``tms_utime``
+with the number of ticks that the calling thread has executed
+and the field ``tms_stime`` with the number of clock ticks
+since system boot (also returned). All other fields in the``ptms`` are left zero.
+
+**NOTES:**
+
+RTEMS has no way to distinguish between user and system time
+so this routine returns the most meaningful information
+possible.
+
+getenv - Get Environment Variables
+----------------------------------
+.. index:: getenv
+.. index:: get environment variables
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ char \*getenv(
+ const char \*name
+ );
+
+**STATUS CODES:**
+
+*NULL*
+ when no match
+
+*pointer to value*
+ when successful
+
+**DESCRIPTION:**
+
+This service searches the set of environment variables for
+a string that matches the specified ``name``. If found,
+it returns the associated value.
+
+**NOTES:**
+
+The environment list consists of name value pairs that
+are of the form *name = value*.
+
+setenv - Set Environment Variables
+----------------------------------
+.. index:: setenv
+.. index:: set environment variables
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int setenv(
+ const char \*name,
+ const char \*value,
+ int overwrite
+ );
+
+**STATUS CODES:**
+
+Returns 0 if successful and -1 otherwise.
+
+**DESCRIPTION:**
+
+This service adds the variable ``name`` to the environment with``value``. If ``name`` is not already exist, then it is
+created. If ``name`` exists and ``overwrite`` is zero, then
+the previous value is not overwritten.
+
+**NOTES:**
+
+NONE
+
+ctermid - Generate Terminal Pathname
+------------------------------------
+.. index:: ctermid
+.. index:: generate terminal pathname
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ char \*ctermid(
+ char \*s
+ );
+
+**STATUS CODES:**
+
+Returns a pointer to a string indicating the pathname for the controlling
+terminal.
+
+**DESCRIPTION:**
+
+This service returns the name of the terminal device associated with
+this process. If ``s`` is NULL, then a pointer to a static buffer
+is returned. Otherwise, ``s`` is assumed to have a buffer of
+sufficient size to contain the name of the controlling terminal.
+
+**NOTES:**
+
+By default on RTEMS systems, the controlling terminal is ``/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.
+
+ttyname - Determine Terminal Device Name
+----------------------------------------
+.. index:: ttyname
+.. index:: determine terminal device name
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ char \*ttyname(
+ int fd
+ );
+
+**STATUS CODES:**
+
+Pointer to a string containing the terminal device name or
+NULL is returned on any error.
+
+**DESCRIPTION:**
+
+This service returns a pointer to the pathname of the terminal
+device that is open on the file descriptor ``fd``. If``fd`` is not a valid descriptor for a terminal device,
+then NULL is returned.
+
+**NOTES:**
+
+This routine uses a static buffer.
+
+ttyname_r - Reentrant Determine Terminal Device Name
+----------------------------------------------------
+.. index:: ttyname_r
+.. index:: reentrant determine terminal device name
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int ttyname_r(
+ int fd,
+ char \*name,
+ int namesize
+ );
+
+**STATUS CODES:**
+
+This routine returns -1 and sets ``errno`` as follows:
+
+*EBADF*
+ If not a valid descriptor for a terminal device.
+
+*EINVAL*
+ If ``name`` is NULL or ``namesize`` are insufficient.
+
+**DESCRIPTION:**
+
+This service the pathname of the terminal device that is open
+on the file descriptor ``fd``.
+
+**NOTES:**
+
+NONE
+
+isatty - Determine if File Descriptor is Terminal
+-------------------------------------------------
+.. index:: isatty
+.. index:: determine if file descriptor is terminal
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ int isatty(
+ int fd
+ );
+
+**STATUS CODES:**
+
+Returns 1 if ``fd`` is a terminal device and 0 otherwise.
+
+**DESCRIPTION:**
+
+This service returns 1 if ``fd`` is an open file descriptor
+connected to a terminal and 0 otherwise.
+
+**NOTES:**
+
+sysconf - Get Configurable System Variables
+-------------------------------------------
+.. index:: sysconf
+.. index:: get configurable system variables
+
+**CALLING SEQUENCE:**
+
+.. code:: c
+
+ long sysconf(
+ int name
+ );
+
+**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.
+
+**DESCRIPTION:**
+
+This service is the mechanism by which an application determines
+values for system limits or options at runtime.
+
+**NOTES:**
+
+Much of the information that may be obtained via ``sysconf``
+has equivalent macros in ``<unistd.h``. However, those
+macros reflect conservative limits which may have been altered
+by application configuration.
+
+.. COMMENT: COPYRIGHT (c) 1988-2002.
+
+.. COMMENT: On-Line Applications Research Corporation (OAR).
+
+.. COMMENT: All rights reserved.
+