#### 29.12.3 Logging In and Out

These functions, derived from BSD, are available in the separate `libutil` library, and declared in `utmp.h`. Note that the `ut_user` member of `struct utmp` is called `ut_name` in BSD. Therefore, `ut_name` is defined as an alias for `ut_user` in `utmp.h`.

— Function: int login_tty (int filedes)

> This function makes filedes the controlling terminal of the current process, redirects standard input, standard output and standard error output to this terminal, and closes filedes.

> This function returns `0` on successful completion, and `-1` on error.

— Function: void login (const struct utmp *entry)

> The `login` functions inserts an entry into the user accounting database. The `ut_line` member is set to the name of the terminal on standard input. If standard input is not a terminal `login` uses standard output or standard error output to determine the name of the terminal. If `struct utmp` has a `ut_type` member, `login` sets it to `USER_PROCESS`, and if there is an `ut_pid` member, it will be set to the process ID of the current process. The remaining entries are copied from entry.

> A copy of the entry is written to the user accounting log file.

— Function: int logout (const char *ut_line)

> This function modifies the user accounting database to indicate that the user on ut_line has logged out.

> The `logout` function returns `1` if the entry was successfully written to the database, or `0` on error.

— Function: void logwtmp (const char *ut_line, const char *ut_name, const char *ut_host)

> The `logwtmp` function appends an entry to the user accounting log file, for the current time and the information provided in the ut_line, ut_name and ut_host arguments.

Portability Note: The BSD `struct utmp` only has the `ut_line`, `ut_name`, `ut_host` and `ut_time` members. Older systems do not even have the `ut_host` member.