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.rst807
1 files changed, 807 insertions, 0 deletions
diff --git a/posix-users/process_environment.rst b/posix-users/process_environment.rst
new file mode 100644
index 0000000..0556d12
--- /dev/null
+++ b/posix-users/process_environment.rst
@@ -0,0 +1,807 @@
+.. comment SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. COMMENT: COPYRIGHT (c) 1988-2002.
+.. COMMENT: On-Line Applications Research Corporation (OAR).
+.. COMMENT: All rights reserved.
+
+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
+:file:`/etc/passwd` for user Id mapping and :file:`/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:
+
+getpid - Get Process ID
+-----------------------
+.. index:: getpid
+.. index:: get process id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int getpid( void );
+
+**STATUS CODES:**
+
+The process Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the process Id.
+
+**NOTES:**
+
+NONE
+
+.. _getppid:
+
+getppid - Get Parent Process ID
+-------------------------------
+.. index:: getppid
+.. index:: get parent process id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int getppid( void );
+
+**STATUS CODES:**
+
+The parent process Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the parent process Id.
+
+**NOTES:**
+
+NONE
+
+.. _getuid:
+
+getuid - Get User ID
+--------------------
+.. index:: getuid
+.. index:: get user id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int getuid( void );
+
+**STATUS CODES:**
+
+The effective user Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the effective user Id.
+
+**NOTES:**
+
+NONE
+
+.. _geteuid:
+
+geteuid - Get Effective User ID
+-------------------------------
+.. index:: geteuid
+.. index:: get effective user id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int geteuid( void );
+
+**STATUS CODES:**
+
+The effective group Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the effective group Id.
+
+**NOTES:**
+
+NONE
+
+.. _getgid:
+
+getgid - Get Real Group ID
+--------------------------
+.. index:: getgid
+.. index:: get real group id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int getgid( void );
+
+**STATUS CODES:**
+
+The group Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the group Id.
+
+**NOTES:**
+
+NONE
+
+.. _getegid:
+
+getegid - Get Effective Group ID
+--------------------------------
+.. index:: getegid
+.. index:: get effective group id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int getegid( void );
+
+**STATUS CODES:**
+
+The effective group Id is returned.
+
+**DESCRIPTION:**
+
+This service returns the effective group Id.
+
+**NOTES:**
+
+NONE
+
+.. _setuid:
+
+setuid - Set User ID
+--------------------
+.. index:: setuid
+.. index:: set user id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int setuid(
+ uid_t uid
+ );
+
+**STATUS CODES:**
+
+This service returns 0.
+
+**DESCRIPTION:**
+
+This service sets the user Id to ``uid``.
+
+**NOTES:**
+
+NONE
+
+.. _setgid:
+
+setgid - Set Group ID
+---------------------
+.. index:: setgid
+.. index:: set group id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int setgid(
+ gid_t gid
+ );
+
+**STATUS CODES:**
+
+This service returns 0.
+
+**DESCRIPTION:**
+
+This service sets the group Id to ``gid``.
+
+**NOTES:**
+
+NONE
+
+.. _getgroups:
+
+getgroups - Get Supplementary Group IDs
+---------------------------------------
+.. index:: getgroups
+.. index:: get supplementary group ids
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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:
+
+getlogin - Get User Name
+------------------------
+.. index:: getlogin
+.. index:: get user name
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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:
+
+getlogin_r - Reentrant Get User Name
+------------------------------------
+.. index:: getlogin_r
+.. index:: reentrant get user name
+.. index:: get user name, reentrant
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int getlogin_r(
+ char *name,
+ size_t namesize
+ );
+
+**STATUS CODES:**
+
+.. list-table::
+ :class: rtems-table
+
+ * - ``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:
+
+getpgrp - Get Process Group ID
+------------------------------
+.. index:: getpgrp
+.. index:: get process group id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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:
+
+setsid - Create Session and Set Process Group ID
+------------------------------------------------
+.. index:: setsid
+.. index:: create session and set process group id
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ pid_t setsid( void );
+
+**STATUS CODES:**
+
+.. list-table::
+ :class: rtems-table
+
+ * - ``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:
+
+setpgid - Set Process Group ID for Job Control
+----------------------------------------------
+.. index:: setpgid
+.. index:: set process group id for job control
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int setpgid(
+ pid_t pid,
+ pid_t pgid
+ );
+
+**STATUS CODES:**
+
+.. list-table::
+ :class: rtems-table
+
+ * - ``ENOSYS``
+ - The routine is not implemented.
+
+**DESCRIPTION:**
+
+This service is not implemented for RTEMS as process groups are not supported.
+
+**NOTES:**
+
+NONE
+
+.. _uname:
+
+uname - Get System Name
+-----------------------
+.. index:: uname
+.. index:: get system name
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int uname(
+ struct utsname *name
+ );
+
+**STATUS CODES:**
+
+.. list-table::
+ :class: rtems-table
+
+ * - ``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:
+
+times - Get process times
+-------------------------
+.. index:: times
+.. index:: get process times
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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:
+
+getenv - Get Environment Variables
+----------------------------------
+.. index:: getenv
+.. index:: get environment variables
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ char *getenv(
+ const char *name
+ );
+
+**STATUS CODES:**
+
+.. list-table::
+ :class: rtems-table
+
+ * - ``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:
+
+setenv - Set Environment Variables
+----------------------------------
+.. index:: setenv
+.. index:: set environment variables
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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:
+
+ctermid - Generate Terminal Pathname
+------------------------------------
+.. index:: ctermid
+.. index:: generate terminal pathname
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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 :file:`/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:
+
+ttyname - Determine Terminal Device Name
+----------------------------------------
+.. index:: ttyname
+.. index:: determine terminal device name
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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:
+
+ttyname_r - Reentrant Determine Terminal Device Name
+----------------------------------------------------
+.. index:: ttyname_r
+.. index:: reentrant determine terminal device name
+
+**CALLING SEQUENCE:**
+
+.. code-block:: c
+
+ int ttyname_r(
+ int fd,
+ char *name,
+ int namesize
+ );
+
+**STATUS CODES:**
+
+This routine returns -1 and sets ``errno`` as follows:
+
+.. list-table::
+ :class: rtems-table
+
+ * - ``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:
+
+isatty - Determine if File Descriptor is Terminal
+-------------------------------------------------
+.. index:: isatty
+.. index:: determine if file descriptor is terminal
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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:
+
+sysconf - Get Configurable System Variables
+-------------------------------------------
+.. index:: sysconf
+.. index:: get configurable system variables
+
+**CALLING SEQUENCE:**
+
+.. code-block:: 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.