/** * slibc — Yet another C library * Copyright © 2015 Mattias Andrée (maandree@member.fsf.org) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _UNISTD_H #define _UNISTD_H #include #include #define __NEED_size_t #define __NEED_ssize_t #define __NEED_uid_t #define __NEED_gid_t #define __NEED_off_t #define __NEED_pid_t #define __NEED_ptrdiff_t #define __NEED_intptr_t #define __NEED_useconds_t #include /** * `NULL`'s canonical header is . */ #ifndef NULL # define NULL ((void*)0) #endif /** * The file descriptor for stdin. * The file with input. * * @etymology (St)andar(d) (in)put (file)descriptor (number). * * @since Always. */ #define STDIN_FILENO 0 /** * The file descriptor for stdout. * The file for output. * * @etymology (St)andar(d) (out)put (file)descriptor (number). * * @since Always. */ #define STDOUT_FILENO 1 /** * The file descriptor for stderr. * The file for error messages and warnings. * * @etymology (St)andar(d) (err)or output (file)descriptor (number). * * @since Always. */ #define STDERR_FILENO 2 /** * Used in `access` and `faccessat`, to check * weather a file appears to exists for the * current user. It is impled for `X_OK`, * `W_OK` and `R_OK`. * * Its value, 0, comes from that this check * is always performed. * * @etymology This constant is named in symmetry with * `X_OK`, `W_OK`, and `R_OK`. The 'F' comes * from "(f)ile exists", and '_OK' comes * from the name of the other '?(_OK)' * constants. * * @since Always. */ #define F_OK 0 /** * Used in `access` and `faccessat`, to check * weather a file is executable (for directories: * its content can be listed) for the current * user. Implies `F_OK`. * * Its value, 1, comes from that for each user-octet * in the permission bits, the bit 1 signifies that * the file is executable. * * @etymology Is e(x)ecute (ok)ay? * * @since Always. */ #define X_OK 1 /** * Used in `access` and `faccessat`, to check * weather a file is writable for the current * user. Implies `F_OK`. * * Its value, 2, comes from that for each user-octet * in the permission bits, the bit 2 signifies that * the file is writable. * * @since Always. * @etymology Is (w)rite (ok)ay? */ #define W_OK 2 /** * Used in `access` and `faccessat`, to check * weather a file is readable for the current * user. Implies `F_OK`. * * Its value, 4, comes from that for each user-octet * in the permission bits, the bit 4 signifies that * the file is readable. * * @etymology Is (r)ead (ok)ay? * * @since Always. */ #define R_OK 4 /** * Set the high end of the calling process's * data segment. * * The high end is defined as the last byte * in the segment plus 1. * * Using `brk` is highly discouraged. `malloc`, * `calloc` and `free`, and its related functions, * fall be used instead as they are much more * conformable. Use of `brk` can couse errors * when using `malloc`, `free`, &c. Thus, `brk` * shall (bascially) only be used if you are * writting an alterantive malloc-implementation. * * `brk` was marked LEGACY in SUSv2, and it * was removed from the POSIX standard in revision * POSIX.1-2001. It is however fundamental in * implementing a fast `malloc`-implementation. * * @etymology Set (br)ea(k). * * @param address The process's new high end of its data segment. * If lower than the current low end, nothing will * happen and the function will return with a success * status. * @return Zero on succes, -1 on error. On error, `errno` * is set to indicate the error. * * @throws ENOMEM The process can allocate the requested amount * of memory. Either the process store limit would * have been exceeded, RAM and swap memory would * have been exhausted, or the request would cause * the data segment to overlap another segment. * * @since Always. */ int brk(void*) /* TODO implement brk */ __GCC_ONLY(__attribute__((__warn_unused_result__))); /** * Set and get the current high end of the calling * process's data segment. * * There is some documents that state that the new, * rather than the previous, high end is returned. * Additionally, some documentions do not document * possible failure. Thus only `sbrk(0)` is guaranteed * to be portable. The return type differs between * implementations; common return types are `int`, * `ssize_t`, `ptrdiff_t`, `ptrdiff_t`, `intptr_t`, * and `void*`. Note that `int` is * microarchitecture-portable. * * `sbrk` was marked LEGACY in SUSv2, and it * was removed from the POSIX standard in revision * POSIX.1-2001. It is however fundamental in * implementing a fast `malloc`-implementation. * * @etymology Shift (br)ea(k). * * @param delta The incremant of the size of the data segment, * zero means that the high end shall not be moved * (thus the current high end is returned,) a * positive value will cause the segment to grow, * a negative value will cause the segment to shrink. * @return The previous high end. `(void*)-1` is returned on error. * * @throws ENOMEM The process can allocate the requested amount * of memory. Either the process store limit would * have been exceeded, RAM and swap memory would * have been exhausted, or the request would cause * the data segment to overlap another segment. * * @since Always. */ void* sbrk(ptrdiff_t) /* TODO implement sbrk */ __GCC_ONLY(__attribute__((__warn_unused_result__))); /* TODO implement exit-functions */ __noreturn void _exit(int); /* TODO implement I/O */ int isatty(int); /** * Replace the current process image with a new process image. * * @param path The pathname of the file to execute. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int execl(const char*, ... /*, NULL */) __GCC_ONLY(__attribute__((__sentinel__(0), __nonnull__(1)))); /** * Replace the current process image with a new process image. * * @param file The pathname of the file to execute, * or the filename of a file in $PATH, * to execute. If $PATH is not set, the current * working directory (yes, you read that right,) * and a default value for $PATH will be used. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int execlp(const char*, ... /*, NULL */) __GCC_ONLY(__attribute__((__sentinel__(0), __nonnull__(1)))); /** * Replace the current process image with a new process image. * * @param path The pathname of the file to execute. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int execle(const char*, ... /*, NULL, char* const[] */) __GCC_ONLY(__attribute__((__sentinel__(1), __nonnull__(1)))); #if defined(__SLIBC_SOURCE) /** * Replace the current process image with a new process image. * * This is a slibc extension, added for completeness. * * @param file The pathname of the file to execute, * or the filename of a file in $PATH, * to execute. If $PATH is not set, the current * working directory (yes, you read that right,) * and a default value for $PATH will be used. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int execlpe(const char*, ... /*, NULL, char* const[] */) __GCC_ONLY(__attribute__((__sentinel__(1), __nonnull__(1)))); #endif /** * Replace the current process image with a new process image. * * @param path The pathname of the file to execute. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int execv(const char*, char* const[]) __GCC_ONLY(__attribute__((__nonnull__(1)))); /** * Replace the current process image with a new process image. * * @param file The pathname of the file to execute, * or the filename of a file in $PATH, * to execute. If $PATH is not set, the current * working directory (yes, you read that right,) * and a default value for $PATH will be used. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int execvp(const char*, char* const[]) __GCC_ONLY(__attribute__((__nonnull__(1)))); /** * Replace the current process image with a new process image. * * @param path The pathname of the file to execute. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int execve(const char*, char* const[], char* const[]) __GCC_ONLY(__attribute__((__nonnull__(1)))); #if defined(__GNU_SOURCE) || defined(__SLIBC_SOURCE) /** * Replace the current process image with a new process image. * * This is a GNU-compliant slibc extension. * * @param file The pathname of the file to execute, * or the filename of a file in $PATH, * to execute. If $PATH is not set, the current * working directory (yes, you read that right,) * and a default value for $PATH will be used. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int execvpe(const char*, char* const[], char* const[]) __GCC_ONLY(__attribute__((__nonnull__(1)))); #endif #if defined(__SLIBC_SOURCE) /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param dirfd File descriptor for a directory (opened with * with the open(2) `O_PATH` flag,) that will * act as the current working directory. * If `AT_FDCWD`, the current working directory * will be used. * @param path The pathname of the file to execute. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @param flags Bit mask that can include zero or more of the * following flags: * AT_EMPTY_PATH: * If `path` is an empty string, operate on the * file (not directory) referred to by `dirfd`. * AT_SYMLINK_NOFOLLOW: * If `path` is relative is a symbolic link, * fail with `errno` set to `ELOOP`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execveat(2). * * @since Always. */ int execlat(int, const char*, ... /*, NULL, int */) __GCC_ONLY(__attribute__((__sentinel__(1), __nonnull__(2)))); /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param dirfd File descriptor for a directory (opened with * with the open(2) `O_PATH` flag,) that will * act as the current working directory. * If `AT_FDCWD`, the current working directory * will be used. * @param file The pathname of the file to execute, * or the filename of a file in $PATH, * to execute. If $PATH is not set, the current * working directory (yes, you read that right,) * and a default value for $PATH will be used. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @param flags Bit mask that can include zero or more of the * following flags: * AT_EMPTY_PATH: * If `file` is an empty string, operate on the * file (not directory) referred to by `dirfd`. * AT_SYMLINK_NOFOLLOW: * If `file` is relative is a symbolic link, * fail with `errno` set to `ELOOP`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execveat(2). * * @since Always. */ int execlpat(int, const char*, ... /*, NULL, int */) __GCC_ONLY(__attribute__((__sentinel__(1), __nonnull__(2)))); /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param dirfd File descriptor for a directory (opened with * with the open(2) `O_PATH` flag,) that will * act as the current working directory. * If `AT_FDCWD`, the current working directory * will be used. * @param path The pathname of the file to execute. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @param flags Bit mask that can include zero or more of the * following flags: * AT_EMPTY_PATH: * If `path` is an empty string, operate on the * file (not directory) referred to by `dirfd`. * AT_SYMLINK_NOFOLLOW: * If `path` is relative is a symbolic link, * fail with `errno` set to `ELOOP`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execveat(2). * * @since Always. */ int execleat(int, const char*, ... /*, NULL, char* const[], int */) __GCC_ONLY(__attribute__((__sentinel__(2), __nonnull__(2)))); /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param dirfd File descriptor for a directory (opened with * with the open(2) `O_PATH` flag,) that will * act as the current working directory. * If `AT_FDCWD`, the current working directory * will be used. * @param file The pathname of the file to execute, * or the filename of a file in $PATH, * to execute. If $PATH is not set, the current * working directory (yes, you read that right,) * and a default value for $PATH will be used. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @param flags Bit mask that can include zero or more of the * following flags: * AT_EMPTY_PATH: * If `file` is an empty string, operate on the * file (not directory) referred to by `dirfd`. * AT_SYMLINK_NOFOLLOW: * If `file` is relative is a symbolic link, * fail with `errno` set to `ELOOP`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execveat(2). * * @since Always. */ int execlpeat(int, const char*, ... /*, NULL, char* const[], int */) __GCC_ONLY(__attribute__((__sentinel__(2), __nonnull__(2)))); /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param dirfd File descriptor for a directory (opened with * with the open(2) `O_PATH` flag,) that will * act as the current working directory. * If `AT_FDCWD`, the current working directory * will be used. * @param path The pathname of the file to execute. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @param flags Bit mask that can include zero or more of the * following flags: * AT_EMPTY_PATH: * If `path` is an empty string, operate on the * file (not directory) referred to by `dirfd`. * AT_SYMLINK_NOFOLLOW: * If `path` is relative is a symbolic link, * fail with `errno` set to `ELOOP`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execveat(2). * * @since Always. */ int execvat(int, const char*, char* const[], int) __GCC_ONLY(__attribute__((__nonnull__(2)))); /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param dirfd File descriptor for a directory (opened with * with the open(2) `O_PATH` flag,) that will * act as the current working directory. * If `AT_FDCWD`, the current working directory * will be used. * @param file The pathname of the file to execute, * or the filename of a file in $PATH, * to execute. If $PATH is not set, the current * working directory (yes, you read that right,) * and a default value for $PATH will be used. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @param flags Bit mask that can include zero or more of the * following flags: * AT_EMPTY_PATH: * If `file` is an empty string, operate on the * file (not directory) referred to by `dirfd`. * AT_SYMLINK_NOFOLLOW: * If `file` is relative is a symbolic link, * fail with `errno` set to `ELOOP`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execveat(2). * * @since Always. */ int execvpat(int, const char*, char* const[], int) __GCC_ONLY(__attribute__((__nonnull__(2)))); #endif /** * Replace the current process image with a new process image. * * @param dirfd File descriptor for a directory (opened with * with the open(2) `O_PATH` flag,) that will * act as the current working directory. * If `AT_FDCWD`, the current working directory * will be used. * @param path The pathname of the file to execute. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @param flags Bit mask that can include zero or more of the * following flags: * AT_EMPTY_PATH: * If `path` is an empty string, operate on the * file (not directory) referred to by `dirfd`. * AT_SYMLINK_NOFOLLOW: * If `path` is relative is a symbolic link, * fail with `errno` set to `ELOOP`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execveat(2). * * @since Always. */ int execveat(int, const char*, char* const[], char* const[], int) __GCC_ONLY(__attribute__((__nonnull__(2)))); #if defined(__SLIBC_SOURCE) /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param dirfd File descriptor for a directory (opened with * with the open(2) `O_PATH` flag,) that will * act as the current working directory. * If `AT_FDCWD`, the current working directory * will be used. * @param file The pathname of the file to execute, * or the filename of a file in $PATH, * to execute. If $PATH is not set, the current * working directory (yes, you read that right,) * and a default value for $PATH will be used. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @param flags Bit mask that can include zero or more of the * following flags: * AT_EMPTY_PATH: * If `file` is an empty string, operate on the * file (not directory) referred to by `dirfd`. * AT_SYMLINK_NOFOLLOW: * If `file` is relative is a symbolic link, * fail with `errno` set to `ELOOP`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execveat(2). * * @since Always. */ int execvpeat(int, const char*, char* const[], char* const[], int) __GCC_ONLY(__attribute__((__nonnull__(2)))); #endif #if defined(__SLIBC_SOURCE) /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param fd File descriptor for the file to execute. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int fexecl(int, ... /*, NULL */) __GCC_ONLY(__attribute__((__sentinel__(0)))); /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param fd File descriptor for the file to execute. * @param ... The arguments with which to execute the file. * The arguments should have the type `const char*`. * As a slibc extension, it can be empty. * This list shall be terminated by a `NULL` sentinel. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int fexecle(int, ... /*, NULL, char* const[] */) __GCC_ONLY(__attribute__((__sentinel__(1)))); /** * Replace the current process image with a new process image. * * This is a slibc extension. * * @param fd File descriptor for the file to execute. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int fexecv(int, char* const[]); #endif /** * Replace the current process image with a new process image. * * @param fd File descriptor for the file to execute. * @param argv The arguments with which to execute the file. * This parameter should really have the type * `const char* const[]`, but that probably not * so because compiles take issue with casts * adding const to any pointer in the type * except the outmost pointer. This list shall * be `NULL`-terminated. The behaviour is * system-dependant if this argument is `NULL`. * @param envp The list of environment variables the new program shall * have set. Each element shall be formatted $name=$value. * This list shall be `NULL`-terminated. The behaviour * is system-dependant if this argument is `NULL`. * @return This function does not return on success, * on error, -1 is returned and `errno` is * set to describe the error. * * @throws Any error specified for execve(2). * * @since Always. */ int fexecve(int, char* const[], char* const[]); #if defined(__PLAN9_SOURCE) || defined(__SLIBC_SOURCE) /** * Search the environment variable $PATH for an executable * file whose name is the specified name. Slashes are ignored * and treated as any other character. $PATH is searched * for left to right, and ':' is used as the path-delimiter. * * $PATH is not inspected if `name` starts with './', '../', or '/'. * * This is a Plan 9 from Bell Labs compliant slibc extension. * * @etymology (Search) ($PATH) for an executable. * * @param name The name of the sought executable. Must not be `NULL`. * @return The pathname of the sought file, `NULL` on error, * or if not found. Files that are not executable * are (almost) ignored. * * @throws ENOMEM The process cannot allocate enough memory. * @throws ENOENT $PATH is not defined, there are no directories * listed in $PATH, or the sought file is not * exist inside $PATH. * @throws EACCES None of the candidates (with at least one candidate) * are executable by the current user. * @throws Any exception defined for access(3), except for `EROFS`, * these when encountered, the search is aborted, unless * the error is `ENOENT` or `EACCES`. * * @since Always. */ char* searchpath(const char*) __GCC_ONLY(__attribute__((__nonnull__(1), __warn_unused_result__))); #endif #if defined(__SLIBC_SOURCE) /** * Search the environment variable $PATH for an executable * file whose name is the specified name. Slashes are ignored * and treated as any other character. $PATH is searched * for left to right, and ':' is used as the path-delimiter. * If $PATH is not defined, a fallback value for $PATH will be * used. * * $PATH is not inspected if `name` starts with './', '../', or '/'. * * This function was added because it was useful in implementing * the `exec`-function family. * * This is a slibc extension. * * @etymology Variant of (searchpath) that takes (2) arguments. * * @param name The name of the sought executable. Must not be `NULL`. * @param fallback Value to use instead of the value of $PATH, if * path is not defined. If `NULL` the default value * for $PATH is used. * @return The pathname of the sought file, `NULL` on error, * or if not found. Files that are not executable * are (almost) ignored. * * @throws ENOMEM The process cannot allocate enough memory. * @throws ENOENT There are no directories listed in $PATH, or * the sought file is not exist inside $PATH. * @throws EACCES None of the candidates (with at least one candidate) * are executable by the current user. * @throws Any exception defined for access(3), except for `EROFS`, * these when encountered, the search is aborted, unless * the error is `ENOENT` or `EACCES`. * * @since Always. */ char* searchpath2(const char*, const char*) __GCC_ONLY(__attribute__((__nonnull__(1), __warn_unused_result__))); /** * Search the environment variable $PATH for an executable * file whose name is the specified name. Slashes are ignored * and treated as any other character. $PATH is searched * for left to right, and ':' is used as the path-delimiter. * If $PATH is not defined, a fallback value for $PATH will be * used. * * $PATH is not inspected if `name` starts with './', '../', or '/'. * * This function was added because it was useful in implementing * the `exec`-function family. * * This is a slibc extension. * * @etymology Variant of (searchpath) that takes (2) arguments. * * @param name The name of the sought executable. Must not be `NULL`. * @param fallback Value to use instead of the value of $PATH, if * path is not defined. If `NULL` the default value * for $PATH is used. * @param first If $PATH is not defined, and `fallback` is `NULL`, * these directories are tested before the default * directories. May be `NULL`. * @return The pathname of the sought file, `NULL` on error, * or if not found. Files that are not executable * are (almost) ignored. * * @throws ENOMEM The process cannot allocate enough memory. * @throws ENOENT There are no directories listed in $PATH, or * the sought file is not exist inside $PATH. * @throws EACCES None of the candidates (with at least one candidate) * are executable by the current user. * @throws Any exception defined for access(3), except for `EROFS`, * these when encountered, the search is aborted, unless * the error is `ENOENT` or `EACCES`. * * @since Always. */ char* searchpath3(const char*, const char*, const char*) __GCC_ONLY(__attribute__((__nonnull__(1), __warn_unused_result__))); #endif #if defined(__BSD_SOURCE) || defined(__XOPEN_SOURCE) /** * Detach the process from the controlling terminal * and run in the background. * * The function shall change the working directory * to '/' to avoid block a mountpoint from being * unmounted. It shall also change direct stdin, * stdout, and stderr to '/dev/null'. It shall * then double-fork, and between the fork, become * a session leader, temporarily, so that the * it no longer has a controlling terminal. * * Note well, this function does not implement a * reliable or particularly correct mechanism for * daemonising a process. It shall not be used! * Note, the GNU implementation is slightly * different because of a bug. * * @etymology (Daemon)ise! * * @param nochdir The not change working directory to '/'. * @param noclose The not redirect stdin, stdout, and stderr to '/dev/null'. * @return Zero on success, -1 on error. * * @throws EACCES If `nochdir` is zero, and the user is denied access to '/'. * @throws Any error specified for open(3). * @throws Any error specified for dup2(3). * @throws Any error specified for fork(3). * @throws Any error specified for setsid(3). * * @since Always. */ int daemon(int, int) __deprecated("Portable programs should implement this mechanism " "manually. Non-portable programs may use 'daemonise'."); #endif #if defined(__SLIBC_SOURCE) /** * Leave all opened files open. */ #define DAEMONISE_NO_CLOSE 1 /** * Leave all signal handlers rather than * appling default signal handlers. */ #define DAEMONISE_NO_SIG_DFL 2 /** * Leave the signal block mask as-is. */ #define DAEMONISE_KEEP_SIGMASK 4 /** * Do not remove malformatted environment entries. */ #define DAEMONISE_KEEP_ENVIRON 8 /** * Do not set umask to zero. */ #define DAEMONISE_KEEP_UMASK 16 /** * Do not create a PID file. */ #define DAEMONISE_NO_PID_FILE 32 /** * Do not close stderr even if it is * a terminal device. * * Cannot be combined with `DAEMONISE_KEEP_STDERR`. */ #define DAEMONISE_KEEP_STDERR 64 /** * Close stderr even if it is * not a terminal device. * * Cannot be combined with `DAEMONISE_KEEP_STDERR`. */ #define DAEMONISE_CLOSE_STDERR 128 /** * Do not close stdin. */ #define DAEMONISE_KEEP_STDIN 256 /** * Do not close stdout. */ #define DAEMONISE_KEEP_STDOUT 512 /** * Enables you to select additional * file descritors to keep open. */ #define DAEMONISE_KEEP_FDS 1024 /** * Daemonise the process. This means to: * * - close all file descritors except for those to * stdin, stdout, and stderr, * * - remove all custom signal handlers, and apply * the default handlers. * * - unblock all signals, * * - remove all malformatted entries in the * environment (this not containing an '=',) * * - set the umask to zero, to be ensure that all * file permissions are set as specified, * * - change directory to '/', to ensure that the * process does not block any mountpoint from being * unmounted, * * - fork to become a background process, * * - temporarily become a session leader to ensure * that the process does not have a controlling * terminal. * * - fork again to become a child of the daemon * supervisor, (subreaper could however be in the * say, so one should not merely rely on this when * writing a daemon supervisor,) (the first child * shall exit after this,) * * - create, exclusively, a PID file to stop the daemon * to be being run twice concurrently, and to let * the daemon supervicer know the process ID of the * daemon, * * - redirect stdin and stdout to /dev/null, * as well as stderr if it is currently directed * to a terminal, and * * - exit in the original process to let the daemon * supervisor know that the daemon has been * initialised. * * Before calling this function, you should remove any * environment variable that could negatively impact * the runtime of the process. * * After calling this function, you should remove * unnecessary privileges. * * Do not try do continue the process in failure unless * you make sure to only do this in the original process. * But not that things will not necessarily be as when * you make the function call. The process can have become * partially deamonised. * * If $XDG_RUNTIME_DIR is set and is not empty, its value * should be used instead of /run for the runtime data-files * directory, in which the PID file is stored. * * This is a slibc extension. * * @etymology (Daemonise) the process! * * @param name The name of the daemon. Use a hardcoded value, * not the process name. Must not be `NULL`. * @param flags Flags to modify the behaviour of the function. * A bitwise OR combination of the constants: * - `DAEMONISE_NO_CLOSE` * - `DAEMONISE_NO_SIG_DFL` * - `DAEMONISE_KEEP_SIGMASK` * - `DAEMONISE_KEEP_ENVIRON` * - `DAEMONISE_KEEP_UMASK` * - `DAEMONISE_NO_PID_FILE` * - `DAEMONISE_KEEP_STDERR` * - `DAEMONISE_CLOSE_STDERR` * - `DAEMONISE_KEEP_STDIN` * - `DAEMONISE_KEEP_STDOUT` * - `DAEMONISE_KEEP_FDS` * @param ... Enabled if `DAEMONISE_KEEP_FDS` is used, * do not add anything if `DAEMONISE_KEEP_FDS` * is unused. This is a `-1`-terminated list * of file descritors to keep open. 0, 1, and 2 * are implied by `DAEMONISE_KEEP_STDIN`, * `DAEMONISE_KEEP_STDOUT`, and `DAEMONISE_KEEP_STDERR`, * respectively. All arguments are of type `int`. * @return Zero on success, -1 on error. * * @throws EEXIST The PID file already exists on the system. * Unless your daemon supervisor removs old * PID files, this could mean that the daemon * has exited without removing the PID file. * @throws EINVAL `flags` contains an unsupported bit, both * `DAEMONISE_KEEP_STDERR` and `DAEMONISE_CLOSE_STDERR` * are set, or both `DAEMONISE_CLOSE_STDERR` and * `DAEMONISE_KEEP_FDS` are set whilst `2` is * in the list of file descriptor not to close. * @throws Any error specified for signal(3). * @throws Any error specified for sigemptyset(3). * @throws Any error specified for sigprocmask(3). * @throws Any error specified for chdir(3). * @throws Any error specified for pipe(3). * @throws Any error specified for dup(3). * @throws Any error specified for dup2(3). * @throws Any error specified for fork(3). * @throws Any error specified for setsid(3). * @throws Any error specified for open(3). * @throws Any error specified for malloc(3). * * @since Always. */ int daemonise(const char*, int, ...) __GCC_ONLY(__attribute__((__nonnull__, __warn_unused_result__))); /** * Remove the PID file created by `daemonise`. This shall * always be called before exiting after calling `daemonise`, * even if it failed. * * This is a slibc extension. * * @etymology (Un)link PID file created by `(daemonise)`! * * @return Zero on success, -1 on error. * * @throws Any error specified for unlink(3). * * @since Always. */ int undaemonise(void); #endif /** * Get password input from the terminal. * * The exact behaviour of this function depends on the implementations. * However you can assume that, the controlling terminal (/dev/tty) is * opened and used for input and output, and that echoing is disabled. * You cannot assume that arbitrary lengths are supported. However, in * this implementation, line editing is enabled and arbitrary lengths * are supported. If the length of the input (excluding termination) is * less than 8192 a statically allocated string is returned, otherwise * a dynamically allocated string is returned. * * @etymology (Get) (pass)word from terminal! * * @param prompt Text to print at the beginning of the line. * Used to tell the user what is expected of her. * Must not be `NULL`. * @return The entered line. You should override it with zeroes as * soon as possible to avoid leaving cleartest passphrases * visible in memory, or potentially stored to unencrypted * swap. The returned string is statically allocated, do * not deallocate it, unless you know that you are using * slibc and the length of the string is at least 8192. * `NULL` on error. If a statically allocated string is * returned, it will be overwritten at the next call. * * @throws Any error specified for open(3). * @throws Any error specified for malloc(3). * @throws Any error specified for read(3). * @throws Any error specified for tcgetattr(3). * @throws Any error specified for tcsetattr(3). * @throws Any error specified for tcdrain(3). * * @since Always. */ char* getpass(const char*) __GCC_ONLY(__attribute__((__nonnull__, __warn_unused_result__))) __deprecated("'getpass' has been deprecated without any " "replacement. You could use libpassphrase instead. :)"); #if defined(__PLAN9_SOURCE) || defined(__SLIBC_SOURCE) /** * Variant of `read` that will read until the request * amount of that has been read, or there is no more * data to read. This function will block signals so * that it cannot throw `EINTR`, which could mean that * read data is lost. Note however, it may fail for * any other reason resulting in lost data. * * This is a Plan 9 from Bell Labs compliant slibc extension. * * @etymology (Read) all `(n)byte` bytes! * * @param fd The file descriptor whence the data shall be read. * @param buf The buffer whither the read data shall be stored. * @param nbyte The number of bytes to read. * * @throws Any error specified for read(3), except `EINTR`. * * @since Always. */ ssize_t readn(int, void*, size_t); #endif #if defined(__SLIBC_SOURCE) /** * Variant of `write` that will write until all given * data has been written. This function will block signals * so that it cannot throw `EINTR`, which could mean that * you do not know how much data has been successfully * written. Note however, it may fail for any other reason * resulting in the same problem. * * This is a slibc extension. * * @etymology (Write) all `(n)byte` bytes! * * @param fd The file descriptor whither the data shall be write. * @param buf The data to write. * @param nbyte The number of bytes to write. * * @throws Any error specified for write(3), except `EINTR`. * * @since Always. */ ssize_t writen(int, const void*, size_t); /** * Variant of `pread` that will read until the request * amount of that has been read, or there is no more * data to read. This function will block signals so * that it cannot throw `EINTR`, which could mean that * read data is lost. Note however, it may fail for * any other reason resulting in lost data. * * This is a slibc extension. * * @etymology Variant of `(pread)` that reads all `(n)byte` bytes! * * @param fd The file descriptor whence the data shall be read. * @param buf The buffer whither the read data shall be stored. * @param nbyte The number of bytes to read. * @param offset Whence in the file the read begins. * * @throws Any error specified for pread(3), except `EINTR`. * * @since Always. */ ssize_t preadn(int, void*, size_t, off_t); /** * Variant of `pwrite` that will write until all given * data has been written. This function will block signals * so that it cannot throw `EINTR`, which could mean that * you do not know how much data has been successfully * written. Note however, it may fail for any other reason * resulting in the same problem. * * This is a slibc extension. * * @etymology Variant of `(pwrite)` that writes all `(n)byte` bytes! * * @param fd The file descriptor whither the data shall be write. * @param buf The data to write. * @param nbyte The number of bytes to write. * @param offset Whence in the file the write begins. * * @throws Any error specified for pwrite(3), except `EINTR`. * * @since Always. */ ssize_t pwriten(int, const void*, size_t); #endif #if defined(__SLIBC_SOURCE) /** * Halt the process in definitely. * This function never returns. * * This is a slibc extension. * * @etymology (Halt)! * * @since Always. */ __noreturn void halt(void); /** * Halt and catch fire! * This function never returns. * * This is a slibc extension. * * @etymology (H)alt and (c)atch (f)rie! * * @since Always. */ __noreturn void hcf(void); #endif #endif /* TODO ssize_t writeatleast(int, const void*, size_t min, size_t max, size_t*); TODO ssize_t pwriteatleast(int, const void*, size_t min, size_t max, off_t, size_t*); TODO ssize_t readatleast(int, void**, size_t min, size_t max, size_t*); TODO ssize_t preadatleast(int, void**, size_t min, size_t max, off_t, size_t*); TODO int dup2atleast(int, int); TODO int dup3atleast(int, int, int); TODO for dup3 and dup3atleast, a flag to specify the the oldfd shall close TODO for dup3 and dup3atleast, a flag to specify the the oldfd shall be /dev/null */