* manual/filesys.texi: Document MTASC-safety properties.

This commit is contained in:
Alexandre Oliva 2014-02-01 03:50:11 -02:00
parent c3299c08d1
commit de55fdf4b5
2 changed files with 226 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2014-02-01 Alexandre Oliva <aoliva@redhat.com>
* manual/filesys.texi: Document MTASC-safety properties.
2014-02-01 Alexandre Oliva <aoliva@redhat.com> 2014-02-01 Alexandre Oliva <aoliva@redhat.com>
* manual/errno.texi: Document MTASC-safety properties. * manual/errno.texi: Document MTASC-safety properties.

View File

@ -58,6 +58,25 @@ Prototypes for these functions are declared in the header file
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun {char *} getcwd (char *@var{buffer}, size_t @var{size}) @deftypefun {char *} getcwd (char *@var{buffer}, size_t @var{size})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c If buffer is NULL, this function calls malloc and realloc, and, in
@c case of error, free. Linux offers a getcwd syscall that we use on
@c GNU/Linux systems, but it may fail if the pathname is too long. As a
@c fallback, and on other systems, the generic implementation opens each
@c parent directory with opendir, which allocates memory for the
@c directory stream with malloc. If a fstatat64 syscall is not
@c available, very deep directory trees may also have to malloc to build
@c longer sequences of ../../../... than those supported by a global
@c const read-only string.
@c linux/__getcwd
@c posix/__getcwd
@c malloc/realloc/free if buffer is NULL, or if dir is too deep
@c lstat64 -> see its own entry
@c fstatat64
@c direct syscall if possible, alloca+snprintf+*stat64 otherwise
@c openat64_not_cancel_3, close_not_cancel_no_status
@c __fdopendir, __opendir, __readdir, rewinddir
The @code{getcwd} function returns an absolute file name representing The @code{getcwd} function returns an absolute file name representing
the current working directory, storing it in the character array the current working directory, storing it in the character array
@var{buffer} that you provide. The @var{size} argument is how you tell @var{buffer} that you provide. The @var{size} argument is how you tell
@ -116,6 +135,9 @@ software.
@comment unistd.h @comment unistd.h
@comment BSD @comment BSD
@deftypefn {Deprecated Function} {char *} getwd (char *@var{buffer}) @deftypefn {Deprecated Function} {char *} getwd (char *@var{buffer})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @ascuintl{}}@acunsafe{@acsmem{} @acsfd{}}}
@c Besides the getcwd safety issues, it calls strerror_r on error, which
@c brings in all of the i18n issues.
This is similar to @code{getcwd}, but has no way to specify the size of This is similar to @code{getcwd}, but has no way to specify the size of
the buffer. @Theglibc{} provides @code{getwd} only the buffer. @Theglibc{} provides @code{getwd} only
for backwards compatibility with BSD. for backwards compatibility with BSD.
@ -130,6 +152,9 @@ this function is deprecated.
@comment unistd.h @comment unistd.h
@comment GNU @comment GNU
@deftypefun {char *} get_current_dir_name (void) @deftypefun {char *} get_current_dir_name (void)
@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c Besides getcwd, which this function calls as a fallback, it calls
@c getenv, with the potential thread-safety issues that brings about.
@vindex PWD @vindex PWD
This @code{get_current_dir_name} function is basically equivalent to This @code{get_current_dir_name} function is basically equivalent to
@w{@code{getcwd (NULL, 0)}}. The only difference is that the value of @w{@code{getcwd (NULL, 0)}}. The only difference is that the value of
@ -145,6 +170,7 @@ This function is a GNU extension.
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int chdir (const char *@var{filename}) @deftypefun int chdir (const char *@var{filename})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function is used to set the process's working directory to This function is used to set the process's working directory to
@var{filename}. @var{filename}.
@ -158,6 +184,7 @@ file @var{filename} is not a directory.
@comment unistd.h @comment unistd.h
@comment XPG @comment XPG
@deftypefun int fchdir (int @var{filedes}) @deftypefun int fchdir (int @var{filedes})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function is used to set the process's working directory to This function is used to set the process's working directory to
directory associated with the file descriptor @var{filedes}. directory associated with the file descriptor @var{filedes}.
@ -294,12 +321,14 @@ values and @code{st_mode} values:
@comment dirent.h @comment dirent.h
@comment BSD @comment BSD
@deftypefun int IFTODT (mode_t @var{mode}) @deftypefun int IFTODT (mode_t @var{mode})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This returns the @code{d_type} value corresponding to @var{mode}. This returns the @code{d_type} value corresponding to @var{mode}.
@end deftypefun @end deftypefun
@comment dirent.h @comment dirent.h
@comment BSD @comment BSD
@deftypefun mode_t DTTOIF (int @var{dtype}) @deftypefun mode_t DTTOIF (int @var{dtype})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This returns the @code{st_mode} value corresponding to @var{dtype}. This returns the @code{st_mode} value corresponding to @var{dtype}.
@end deftypefun @end deftypefun
@end table @end table
@ -342,6 +371,9 @@ the following functions.
@comment dirent.h @comment dirent.h
@comment POSIX.1 @comment POSIX.1
@deftypefun {DIR *} opendir (const char *@var{dirname}) @deftypefun {DIR *} opendir (const char *@var{dirname})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c Besides the safe syscall, we have to allocate the DIR object with
@c __alloc_dir, that calls malloc.
The @code{opendir} function opens and returns a directory stream for The @code{opendir} function opens and returns a directory stream for
reading the directory whose file name is @var{dirname}. The stream has reading the directory whose file name is @var{dirname}. The stream has
type @code{DIR *}. type @code{DIR *}.
@ -381,6 +413,8 @@ alternative interface can be used.
@comment dirent.h @comment dirent.h
@comment GNU @comment GNU
@deftypefun {DIR *} fdopendir (int @var{fd}) @deftypefun {DIR *} fdopendir (int @var{fd})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c The DIR object is allocated with __alloc_dir, that calls malloc.
The @code{fdopendir} function works just like @code{opendir} but The @code{fdopendir} function works just like @code{opendir} but
instead of taking a file name and opening a file descriptor for the instead of taking a file name and opening a file descriptor for the
directory the caller is required to provide a file descriptor. This directory the caller is required to provide a file descriptor. This
@ -425,6 +459,7 @@ access.
@comment dirent.h @comment dirent.h
@comment GNU @comment GNU
@deftypefun int dirfd (DIR *@var{dirstream}) @deftypefun int dirfd (DIR *@var{dirstream})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The function @code{dirfd} returns the file descriptor associated with The function @code{dirfd} returns the file descriptor associated with
the directory stream @var{dirstream}. This descriptor can be used until the directory stream @var{dirstream}. This descriptor can be used until
the directory is closed with @code{closedir}. If the directory stream the directory is closed with @code{closedir}. If the directory stream
@ -443,6 +478,12 @@ symbols are declared in the header file @file{dirent.h}.
@comment dirent.h @comment dirent.h
@comment POSIX.1 @comment POSIX.1
@deftypefun {struct dirent *} readdir (DIR *@var{dirstream}) @deftypefun {struct dirent *} readdir (DIR *@var{dirstream})
@safety{@prelim{}@mtunsafe{@mtasurace{:dirstream}}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
@c This function holds dirstream's non-recursive lock, which brings
@c about the usual issues with locks and async signals and cancellation,
@c but the lock taking is not enough to make the returned value safe to
@c use, since it points to a stream's internal buffer that can be
@c overwritten by subsequent calls or even released by closedir.
This function reads the next entry from the directory. It normally This function reads the next entry from the directory. It normally
returns a pointer to a structure containing information about the returns a pointer to a structure containing information about the
file. This structure is associated with the @var{dirstream} handle file. This structure is associated with the @var{dirstream} handle
@ -478,6 +519,7 @@ locking if multiple threads access the same @var{dirstream}.
@comment dirent.h @comment dirent.h
@comment GNU @comment GNU
@deftypefun int readdir_r (DIR *@var{dirstream}, struct dirent *@var{entry}, struct dirent **@var{result}) @deftypefun int readdir_r (DIR *@var{dirstream}, struct dirent *@var{entry}, struct dirent **@var{result})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
This function is a version of @code{readdir} which performs internal This function is a version of @code{readdir} which performs internal
locking. Like @code{readdir} it returns the next entry from the locking. Like @code{readdir} it returns the next entry from the
directory. To prevent conflicts between simultaneously running directory. To prevent conflicts between simultaneously running
@ -549,6 +591,7 @@ of the last two functions.
@comment dirent.h @comment dirent.h
@comment LFS @comment LFS
@deftypefun {struct dirent64 *} readdir64 (DIR *@var{dirstream}) @deftypefun {struct dirent64 *} readdir64 (DIR *@var{dirstream})
@safety{@prelim{}@mtunsafe{@mtasurace{:dirstream}}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
The @code{readdir64} function is just like the @code{readdir} function The @code{readdir64} function is just like the @code{readdir} function
except that it returns a pointer to a record of type @code{struct except that it returns a pointer to a record of type @code{struct
dirent64}. Some of the members of this data type (notably @code{d_ino}) dirent64}. Some of the members of this data type (notably @code{d_ino})
@ -560,6 +603,7 @@ In all other aspects this function is equivalent to @code{readdir}.
@comment dirent.h @comment dirent.h
@comment LFS @comment LFS
@deftypefun int readdir64_r (DIR *@var{dirstream}, struct dirent64 *@var{entry}, struct dirent64 **@var{result}) @deftypefun int readdir64_r (DIR *@var{dirstream}, struct dirent64 *@var{entry}, struct dirent64 **@var{result})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
The @code{readdir64_r} function is equivalent to the @code{readdir_r} The @code{readdir64_r} function is equivalent to the @code{readdir_r}
function except that it takes parameters of base type @code{struct function except that it takes parameters of base type @code{struct
dirent64} instead of @code{struct dirent} in the second and third dirent64} instead of @code{struct dirent} in the second and third
@ -570,6 +614,10 @@ position. The same precautions mentioned in the documentation of
@comment dirent.h @comment dirent.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int closedir (DIR *@var{dirstream}) @deftypefun int closedir (DIR *@var{dirstream})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{/hurd}}@acunsafe{@acsmem{} @acsfd{} @aculock{/hurd}}}
@c No synchronization in the posix implementation, only in the hurd
@c one. This is regarded as safe because it is undefined behavior if
@c other threads could still be using the dir stream while it's closed.
This function closes the directory stream @var{dirstream}. It returns This function closes the directory stream @var{dirstream}. It returns
@code{0} on success and @code{-1} on failure. @code{0} on success and @code{-1} on failure.
@ -609,6 +657,7 @@ declared in the header file @file{dirent.h}.
@comment dirent.h @comment dirent.h
@comment POSIX.1 @comment POSIX.1
@deftypefun void rewinddir (DIR *@var{dirstream}) @deftypefun void rewinddir (DIR *@var{dirstream})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
The @code{rewinddir} function is used to reinitialize the directory The @code{rewinddir} function is used to reinitialize the directory
stream @var{dirstream}, so that if you call @code{readdir} it stream @var{dirstream}, so that if you call @code{readdir} it
returns information about the first entry in the directory again. This returns information about the first entry in the directory again. This
@ -622,6 +671,10 @@ added or removed since you last called @code{opendir} or
@comment dirent.h @comment dirent.h
@comment BSD @comment BSD
@deftypefun {long int} telldir (DIR *@var{dirstream}) @deftypefun {long int} telldir (DIR *@var{dirstream})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd} @asulock{/bsd}}@acunsafe{@acsmem{/bsd} @aculock{/bsd}}}
@c The implementation is safe on most platforms, but on BSD it uses
@c cookies, buckets and records, and the global array of pointers to
@c dynamically allocated records is guarded by a non-recursive lock.
The @code{telldir} function returns the file position of the directory The @code{telldir} function returns the file position of the directory
stream @var{dirstream}. You can use this value with @code{seekdir} to stream @var{dirstream}. You can use this value with @code{seekdir} to
restore the directory stream to that position. restore the directory stream to that position.
@ -630,6 +683,10 @@ restore the directory stream to that position.
@comment dirent.h @comment dirent.h
@comment BSD @comment BSD
@deftypefun void seekdir (DIR *@var{dirstream}, long int @var{pos}) @deftypefun void seekdir (DIR *@var{dirstream}, long int @var{pos})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd} @asulock{/bsd}}@acunsafe{@acsmem{/bsd} @aculock{/bsd}}}
@c The implementation is safe on most platforms, but on BSD it uses
@c cookies, buckets and records, and the global array of pointers to
@c dynamically allocated records is guarded by a non-recursive lock.
The @code{seekdir} function sets the file position of the directory The @code{seekdir} function sets the file position of the directory
stream @var{dirstream} to @var{pos}. The value @var{pos} must be the stream @var{dirstream} to @var{pos}. The value @var{pos} must be the
result of a previous call to @code{telldir} on this particular stream; result of a previous call to @code{telldir} on this particular stream;
@ -649,6 +706,19 @@ the result.
@comment dirent.h @comment dirent.h
@comment BSD/SVID @comment BSD/SVID
@deftypefun int scandir (const char *@var{dir}, struct dirent ***@var{namelist}, int (*@var{selector}) (const struct dirent *), int (*@var{cmp}) (const struct dirent **, const struct dirent **)) @deftypefun int scandir (const char *@var{dir}, struct dirent ***@var{namelist}, int (*@var{selector}) (const struct dirent *), int (*@var{cmp}) (const struct dirent **, const struct dirent **))
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c The scandir function calls __opendirat, __readdir, and __closedir to
@c go over the named dir; malloc and realloc to allocate the namelist
@c and copies of each selected dirent, besides the selector, if given,
@c and qsort and the cmp functions if the latter is given. In spite of
@c the cleanup handler that releases memory and the file descriptor in
@c case of synchronous cancellation, an asynchronous cancellation may
@c still leak memory and a file descriptor. Although readdir is unsafe
@c in general, the use of an internal dir stream for sequential scanning
@c of the directory with copying of dirents before subsequent calls
@c makes the use safe, and the fact that the dir stream is private to
@c each scandir call does away with the lock issues in readdir and
@c closedir.
The @code{scandir} function scans the contents of the directory selected The @code{scandir} function scans the contents of the directory selected
by @var{dir}. The result in *@var{namelist} is an array of pointers to by @var{dir}. The result in *@var{namelist} is an array of pointers to
@ -679,6 +749,8 @@ are very helpful for this purpose.
@comment dirent.h @comment dirent.h
@comment BSD/SVID @comment BSD/SVID
@deftypefun int alphasort (const void *@var{a}, const void *@var{b}) @deftypefun int alphasort (const void *@var{a}, const void *@var{b})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
@c Calls strcoll.
The @code{alphasort} function behaves like the @code{strcoll} function The @code{alphasort} function behaves like the @code{strcoll} function
(@pxref{String/Array Comparison}). The difference is that the arguments (@pxref{String/Array Comparison}). The difference is that the arguments
are not string pointers but instead they are of type are not string pointers but instead they are of type
@ -691,6 +763,9 @@ than zero depending on the order of the two entries @var{a} and @var{b}.
@comment dirent.h @comment dirent.h
@comment GNU @comment GNU
@deftypefun int versionsort (const void *@var{a}, const void *@var{b}) @deftypefun int versionsort (const void *@var{a}, const void *@var{b})
@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
@c Calls strverscmp, which will accesses the locale object multiple
@c times.
The @code{versionsort} function is like @code{alphasort} except that it The @code{versionsort} function is like @code{alphasort} except that it
uses the @code{strverscmp} function internally. uses the @code{strverscmp} function internally.
@end deftypefun @end deftypefun
@ -703,6 +778,8 @@ dirent64}}. To use this we need a new function.
@comment dirent.h @comment dirent.h
@comment GNU @comment GNU
@deftypefun int scandir64 (const char *@var{dir}, struct dirent64 ***@var{namelist}, int (*@var{selector}) (const struct dirent64 *), int (*@var{cmp}) (const struct dirent64 **, const struct dirent64 **)) @deftypefun int scandir64 (const char *@var{dir}, struct dirent64 ***@var{namelist}, int (*@var{selector}) (const struct dirent64 *), int (*@var{cmp}) (const struct dirent64 **, const struct dirent64 **))
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c See scandir.
The @code{scandir64} function works like the @code{scandir} function The @code{scandir64} function works like the @code{scandir} function
except that the directory entries it returns are described by elements except that the directory entries it returns are described by elements
of type @w{@code{struct dirent64}}. The function pointed to by of type @w{@code{struct dirent64}}. The function pointed to by
@ -721,6 +798,8 @@ argument. Instead we provide the two replacement functions below.
@comment dirent.h @comment dirent.h
@comment GNU @comment GNU
@deftypefun int alphasort64 (const void *@var{a}, const void *@var{b}) @deftypefun int alphasort64 (const void *@var{a}, const void *@var{b})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
@c See alphasort.
The @code{alphasort64} function behaves like the @code{strcoll} function The @code{alphasort64} function behaves like the @code{strcoll} function
(@pxref{String/Array Comparison}). The difference is that the arguments (@pxref{String/Array Comparison}). The difference is that the arguments
are not string pointers but instead they are of type are not string pointers but instead they are of type
@ -733,6 +812,8 @@ than zero depending on the order of the two entries @var{a} and @var{b}.
@comment dirent.h @comment dirent.h
@comment GNU @comment GNU
@deftypefun int versionsort64 (const void *@var{a}, const void *@var{b}) @deftypefun int versionsort64 (const void *@var{a}, const void *@var{b})
@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
@c See versionsort.
The @code{versionsort64} function is like @code{alphasort64}, excepted that it The @code{versionsort64} function is like @code{alphasort64}, excepted that it
uses the @code{strverscmp} function internally. uses the @code{strverscmp} function internally.
@end deftypefun @end deftypefun
@ -913,6 +994,8 @@ file was passed).
@comment ftw.h @comment ftw.h
@comment SVID @comment SVID
@deftypefun int ftw (const char *@var{filename}, __ftw_func_t @var{func}, int @var{descriptors}) @deftypefun int ftw (const char *@var{filename}, __ftw_func_t @var{func}, int @var{descriptors})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c see nftw for safety details
The @code{ftw} function calls the callback function given in the The @code{ftw} function calls the callback function given in the
parameter @var{func} for every item which is found in the directory parameter @var{func} for every item which is found in the directory
specified by @var{filename} and all directories below. The function specified by @var{filename} and all directories below. The function
@ -963,6 +1046,7 @@ interface transparently replaces the old interface.
@comment ftw.h @comment ftw.h
@comment Unix98 @comment Unix98
@deftypefun int ftw64 (const char *@var{filename}, __ftw64_func_t @var{func}, int @var{descriptors}) @deftypefun int ftw64 (const char *@var{filename}, __ftw64_func_t @var{func}, int @var{descriptors})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
This function is similar to @code{ftw} but it can work on filesystems This function is similar to @code{ftw} but it can work on filesystems
with large files. File information is reported using a variable of type with large files. File information is reported using a variable of type
@code{struct stat64} which is passed by reference to the callback @code{struct stat64} which is passed by reference to the callback
@ -976,6 +1060,17 @@ transparently replaces the old implementation.
@comment ftw.h @comment ftw.h
@comment XPG4.2 @comment XPG4.2
@deftypefun int nftw (const char *@var{filename}, __nftw_func_t @var{func}, int @var{descriptors}, int @var{flag}) @deftypefun int nftw (const char *@var{filename}, __nftw_func_t @var{func}, int @var{descriptors}, int @var{flag})
@safety{@prelim{}@mtsafe{@mtasscwd{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{} @acscwd{}}}
@c ftw_startup calls alloca, malloc, free, xstat/lxstat, tdestroy, and ftw_dir
@c if FTW_CHDIR, call open, and fchdir, or chdir and getcwd
@c ftw_dir calls open_dir_stream, readdir64, process_entry, closedir
@c if FTW_CHDIR, also calls fchdir
@c open_dir_stream calls malloc, realloc, readdir64, free, closedir,
@c then openat64_not_cancel_3 and fdopendir or opendir, then dirfd.
@c process_entry may cal realloc, fxstatat/lxstat/xstat, ftw_dir, and
@c find_object (tsearch) and add_object (tfind).
@c Since each invocation of *ftw uses its own private search tree, none
@c of the search tree concurrency issues apply.
The @code{nftw} function works like the @code{ftw} functions. They call The @code{nftw} function works like the @code{ftw} functions. They call
the callback function @var{func} for all items found in the directory the callback function @var{func} for all items found in the directory
@var{filename} and below. At most @var{descriptors} file descriptors @var{filename} and below. At most @var{descriptors} file descriptors
@ -1036,6 +1131,7 @@ interface transparently replaces the old interface.
@comment ftw.h @comment ftw.h
@comment Unix98 @comment Unix98
@deftypefun int nftw64 (const char *@var{filename}, __nftw64_func_t @var{func}, int @var{descriptors}, int @var{flag}) @deftypefun int nftw64 (const char *@var{filename}, __nftw64_func_t @var{func}, int @var{descriptors}, int @var{flag})
@safety{@prelim{}@mtsafe{@mtasscwd{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{} @acscwd{}}}
This function is similar to @code{nftw} but it can work on filesystems This function is similar to @code{nftw} but it can work on filesystems
with large files. File information is reported using a variable of type with large files. File information is reported using a variable of type
@code{struct stat64} which is passed by reference to the callback @code{struct stat64} which is passed by reference to the callback
@ -1079,6 +1175,7 @@ file @file{unistd.h}.
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int link (const char *@var{oldname}, const char *@var{newname}) @deftypefun int link (const char *@var{oldname}, const char *@var{newname})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{link} function makes a new link to the existing file named by The @code{link} function makes a new link to the existing file named by
@var{oldname}, under the new name @var{newname}. @var{oldname}, under the new name @var{newname}.
@ -1186,6 +1283,7 @@ Prototypes for most of the functions listed in this section are in
@comment unistd.h @comment unistd.h
@comment BSD @comment BSD
@deftypefun int symlink (const char *@var{oldname}, const char *@var{newname}) @deftypefun int symlink (const char *@var{oldname}, const char *@var{newname})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{symlink} function makes a symbolic link to @var{oldname} named The @code{symlink} function makes a symbolic link to @var{oldname} named
@var{newname}. @var{newname}.
@ -1223,6 +1321,7 @@ exceeded.
@comment unistd.h @comment unistd.h
@comment BSD @comment BSD
@deftypefun ssize_t readlink (const char *@var{filename}, char *@var{buffer}, size_t @var{size}) @deftypefun ssize_t readlink (const char *@var{filename}, char *@var{buffer}, size_t @var{size})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{readlink} function gets the value of the symbolic link The @code{readlink} function gets the value of the symbolic link
@var{filename}. The file name that the link points to is copied into @var{filename}. The file name that the link points to is copied into
@var{buffer}. This file name string is @emph{not} null-terminated; @var{buffer}. This file name string is @emph{not} null-terminated;
@ -1282,6 +1381,8 @@ names can refer to the same inode.
@comment stdlib.h @comment stdlib.h
@comment GNU @comment GNU
@deftypefun {char *} canonicalize_file_name (const char *@var{name}) @deftypefun {char *} canonicalize_file_name (const char *@var{name})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c Calls realpath.
The @code{canonicalize_file_name} function returns the absolute name of The @code{canonicalize_file_name} function returns the absolute name of
the file named by @var{name} which contains no @code{.}, @code{..} the file named by @var{name} which contains no @code{.}, @code{..}
@ -1323,6 +1424,8 @@ where the result is placed in.
@comment stdlib.h @comment stdlib.h
@comment XPG @comment XPG
@deftypefun {char *} realpath (const char *restrict @var{name}, char *restrict @var{resolved}) @deftypefun {char *} realpath (const char *restrict @var{name}, char *restrict @var{resolved})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}}
@c Calls malloc, realloc, getcwd, lxstat64, readlink, alloca.
A call to @code{realpath} where the @var{resolved} parameter is A call to @code{realpath} where the @var{resolved} parameter is
@code{NULL} behaves exactly like @code{canonicalize_file_name}. The @code{NULL} behaves exactly like @code{canonicalize_file_name}. The
@ -1362,6 +1465,7 @@ then the file is deleted as well. If the file has other remaining names
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int unlink (const char *@var{filename}) @deftypefun int unlink (const char *@var{filename})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{unlink} function deletes the file name @var{filename}. If The @code{unlink} function deletes the file name @var{filename}. If
this is a file's sole name, the file itself is also deleted. (Actually, this is a file's sole name, the file itself is also deleted. (Actually,
if any process has the file open when this happens, deletion is if any process has the file open when this happens, deletion is
@ -1404,6 +1508,7 @@ file system and can't be modified.
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int rmdir (const char *@var{filename}) @deftypefun int rmdir (const char *@var{filename})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@cindex directories, deleting @cindex directories, deleting
@cindex deleting a directory @cindex deleting a directory
The @code{rmdir} function deletes a directory. The directory must be The @code{rmdir} function deletes a directory. The directory must be
@ -1431,6 +1536,8 @@ The prototype for this function is declared in the header file
@comment stdio.h @comment stdio.h
@comment ISO @comment ISO
@deftypefun int remove (const char *@var{filename}) @deftypefun int remove (const char *@var{filename})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Calls unlink and rmdir.
This is the @w{ISO C} function to remove a file. It works like This is the @w{ISO C} function to remove a file. It works like
@code{unlink} for files and like @code{rmdir} for directories. @code{unlink} for files and like @code{rmdir} for directories.
@code{remove} is declared in @file{stdio.h}. @code{remove} is declared in @file{stdio.h}.
@ -1446,6 +1553,10 @@ The @code{rename} function is used to change a file's name.
@comment stdio.h @comment stdio.h
@comment ISO @comment ISO
@deftypefun int rename (const char *@var{oldname}, const char *@var{newname}) @deftypefun int rename (const char *@var{oldname}, const char *@var{newname})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c In the absence of a rename syscall, there's an emulation with link
@c and unlink, but it's racy, even more so if newname exists and is
@c unlinked first.
The @code{rename} function renames the file @var{oldname} to The @code{rename} function renames the file @var{oldname} to
@var{newname}. The file formerly accessible under the name @var{newname}. The file formerly accessible under the name
@var{oldname} is afterwards accessible as @var{newname} instead. (If @var{oldname} is afterwards accessible as @var{newname} instead. (If
@ -1541,6 +1652,7 @@ a shell command @code{mkdir} which does the same thing.)
@comment sys/stat.h @comment sys/stat.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int mkdir (const char *@var{filename}, mode_t @var{mode}) @deftypefun int mkdir (const char *@var{filename}, mode_t @var{mode})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{mkdir} function creates a new, empty directory with name The @code{mkdir} function creates a new, empty directory with name
@var{filename}. @var{filename}.
@ -1882,6 +1994,7 @@ header file @file{sys/stat.h}.
@comment sys/stat.h @comment sys/stat.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int stat (const char *@var{filename}, struct stat *@var{buf}) @deftypefun int stat (const char *@var{filename}, struct stat *@var{buf})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{stat} function returns information about the attributes of the The @code{stat} function returns information about the attributes of the
file named by @w{@var{filename}} in the structure pointed to by @var{buf}. file named by @w{@var{filename}} in the structure pointed to by @var{buf}.
@ -1908,6 +2021,7 @@ replaces the normal implementation.
@comment sys/stat.h @comment sys/stat.h
@comment Unix98 @comment Unix98
@deftypefun int stat64 (const char *@var{filename}, struct stat64 *@var{buf}) @deftypefun int stat64 (const char *@var{filename}, struct stat64 *@var{buf})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function is similar to @code{stat} but it is also able to work on This function is similar to @code{stat} but it is also able to work on
files larger than @math{2^31} bytes on 32-bit systems. To be able to do files larger than @math{2^31} bytes on 32-bit systems. To be able to do
this the result is stored in a variable of type @code{struct stat64} to this the result is stored in a variable of type @code{struct stat64} to
@ -1921,6 +2035,7 @@ replaces the interface for small files on 32-bit machines.
@comment sys/stat.h @comment sys/stat.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int fstat (int @var{filedes}, struct stat *@var{buf}) @deftypefun int fstat (int @var{filedes}, struct stat *@var{buf})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{fstat} function is like @code{stat}, except that it takes an The @code{fstat} function is like @code{stat}, except that it takes an
open file descriptor as an argument instead of a file name. open file descriptor as an argument instead of a file name.
@xref{Low-Level I/O}. @xref{Low-Level I/O}.
@ -1942,6 +2057,7 @@ replaces the normal implementation.
@comment sys/stat.h @comment sys/stat.h
@comment Unix98 @comment Unix98
@deftypefun int fstat64 (int @var{filedes}, struct stat64 *@var{buf}) @deftypefun int fstat64 (int @var{filedes}, struct stat64 *@var{buf})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function is similar to @code{fstat} but is able to work on large This function is similar to @code{fstat} but is able to work on large
files on 32-bit platforms. For large files the file descriptor files on 32-bit platforms. For large files the file descriptor
@var{filedes} should be obtained by @code{open64} or @code{creat64}. @var{filedes} should be obtained by @code{open64} or @code{creat64}.
@ -1953,9 +2069,16 @@ function is available under the name @code{fstat} and so transparently
replaces the interface for small files on 32-bit machines. replaces the interface for small files on 32-bit machines.
@end deftypefun @end deftypefun
@c fstatat will call alloca and snprintf if the syscall is not
@c available.
@c @safety{@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
@comment sys/stat.h @comment sys/stat.h
@comment BSD @comment BSD
@deftypefun int lstat (const char *@var{filename}, struct stat *@var{buf}) @deftypefun int lstat (const char *@var{filename}, struct stat *@var{buf})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Direct system call through lxstat, sometimes with an xstat conv call
@c afterwards.
The @code{lstat} function is like @code{stat}, except that it does not The @code{lstat} function is like @code{stat}, except that it does not
follow symbolic links. If @var{filename} is the name of a symbolic follow symbolic links. If @var{filename} is the name of a symbolic
link, @code{lstat} returns information about the link itself; otherwise link, @code{lstat} returns information about the link itself; otherwise
@ -1969,6 +2092,9 @@ replaces the normal implementation.
@comment sys/stat.h @comment sys/stat.h
@comment Unix98 @comment Unix98
@deftypefun int lstat64 (const char *@var{filename}, struct stat64 *@var{buf}) @deftypefun int lstat64 (const char *@var{filename}, struct stat64 *@var{buf})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Direct system call through lxstat64, sometimes with an xstat conv
@c call afterwards.
This function is similar to @code{lstat} but it is also able to work on This function is similar to @code{lstat} but it is also able to work on
files larger than @math{2^31} bytes on 32-bit systems. To be able to do files larger than @math{2^31} bytes on 32-bit systems. To be able to do
this the result is stored in a variable of type @code{struct stat64} to this the result is stored in a variable of type @code{struct stat64} to
@ -2007,12 +2133,14 @@ that file:
@comment sys/stat.h @comment sys/stat.h
@comment POSIX @comment POSIX
@deftypefn Macro int S_ISDIR (mode_t @var{m}) @deftypefn Macro int S_ISDIR (mode_t @var{m})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This macro returns non-zero if the file is a directory. This macro returns non-zero if the file is a directory.
@end deftypefn @end deftypefn
@comment sys/stat.h @comment sys/stat.h
@comment POSIX @comment POSIX
@deftypefn Macro int S_ISCHR (mode_t @var{m}) @deftypefn Macro int S_ISCHR (mode_t @var{m})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This macro returns non-zero if the file is a character special file (a This macro returns non-zero if the file is a character special file (a
device like a terminal). device like a terminal).
@end deftypefn @end deftypefn
@ -2020,6 +2148,7 @@ device like a terminal).
@comment sys/stat.h @comment sys/stat.h
@comment POSIX @comment POSIX
@deftypefn Macro int S_ISBLK (mode_t @var{m}) @deftypefn Macro int S_ISBLK (mode_t @var{m})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This macro returns non-zero if the file is a block special file (a device This macro returns non-zero if the file is a block special file (a device
like a disk). like a disk).
@end deftypefn @end deftypefn
@ -2027,12 +2156,14 @@ like a disk).
@comment sys/stat.h @comment sys/stat.h
@comment POSIX @comment POSIX
@deftypefn Macro int S_ISREG (mode_t @var{m}) @deftypefn Macro int S_ISREG (mode_t @var{m})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This macro returns non-zero if the file is a regular file. This macro returns non-zero if the file is a regular file.
@end deftypefn @end deftypefn
@comment sys/stat.h @comment sys/stat.h
@comment POSIX @comment POSIX
@deftypefn Macro int S_ISFIFO (mode_t @var{m}) @deftypefn Macro int S_ISFIFO (mode_t @var{m})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This macro returns non-zero if the file is a FIFO special file, or a This macro returns non-zero if the file is a FIFO special file, or a
pipe. @xref{Pipes and FIFOs}. pipe. @xref{Pipes and FIFOs}.
@end deftypefn @end deftypefn
@ -2040,6 +2171,7 @@ pipe. @xref{Pipes and FIFOs}.
@comment sys/stat.h @comment sys/stat.h
@comment GNU @comment GNU
@deftypefn Macro int S_ISLNK (mode_t @var{m}) @deftypefn Macro int S_ISLNK (mode_t @var{m})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This macro returns non-zero if the file is a symbolic link. This macro returns non-zero if the file is a symbolic link.
@xref{Symbolic Links}. @xref{Symbolic Links}.
@end deftypefn @end deftypefn
@ -2047,6 +2179,7 @@ This macro returns non-zero if the file is a symbolic link.
@comment sys/stat.h @comment sys/stat.h
@comment GNU @comment GNU
@deftypefn Macro int S_ISSOCK (mode_t @var{m}) @deftypefn Macro int S_ISSOCK (mode_t @var{m})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This macro returns non-zero if the file is a socket. @xref{Sockets}. This macro returns non-zero if the file is a socket. @xref{Sockets}.
@end deftypefn @end deftypefn
@ -2129,6 +2262,7 @@ the whole @code{struct stat} structure.
@comment sys/stat.h @comment sys/stat.h
@comment POSIX @comment POSIX
@deftypefn Macro int S_TYPEISMQ (struct stat *@var{s}) @deftypefn Macro int S_TYPEISMQ (struct stat *@var{s})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
If the system implement POSIX message queues as distinct objects and the If the system implement POSIX message queues as distinct objects and the
file is a message queue object, this macro returns a non-zero value. file is a message queue object, this macro returns a non-zero value.
In all other cases the result is zero. In all other cases the result is zero.
@ -2137,6 +2271,7 @@ In all other cases the result is zero.
@comment sys/stat.h @comment sys/stat.h
@comment POSIX @comment POSIX
@deftypefn Macro int S_TYPEISSEM (struct stat *@var{s}) @deftypefn Macro int S_TYPEISSEM (struct stat *@var{s})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
If the system implement POSIX semaphores as distinct objects and the If the system implement POSIX semaphores as distinct objects and the
file is a semaphore object, this macro returns a non-zero value. file is a semaphore object, this macro returns a non-zero value.
In all other cases the result is zero. In all other cases the result is zero.
@ -2145,6 +2280,7 @@ In all other cases the result is zero.
@comment sys/stat.h @comment sys/stat.h
@comment POSIX @comment POSIX
@deftypefn Macro int S_TYPEISSHM (struct stat *@var{s}) @deftypefn Macro int S_TYPEISSHM (struct stat *@var{s})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
If the system implement POSIX shared memory objects as distinct objects If the system implement POSIX shared memory objects as distinct objects
and the file is a shared memory object, this macro returns a non-zero and the file is a shared memory object, this macro returns a non-zero
value. In all other cases the result is zero. value. In all other cases the result is zero.
@ -2189,6 +2325,7 @@ The prototype for this function is declared in @file{unistd.h}.
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int chown (const char *@var{filename}, uid_t @var{owner}, gid_t @var{group}) @deftypefun int chown (const char *@var{filename}, uid_t @var{owner}, gid_t @var{group})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{chown} function changes the owner of the file @var{filename} to The @code{chown} function changes the owner of the file @var{filename} to
@var{owner}, and its group owner to @var{group}. @var{owner}, and its group owner to @var{group}.
@ -2223,6 +2360,7 @@ The file is on a read-only file system.
@comment unistd.h @comment unistd.h
@comment BSD @comment BSD
@deftypefun int fchown (int @var{filedes}, uid_t @var{owner}, gid_t @var{group}) @deftypefun int fchown (int @var{filedes}, uid_t @var{owner}, gid_t @var{group})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This is like @code{chown}, except that it changes the owner of the open This is like @code{chown}, except that it changes the owner of the open
file with descriptor @var{filedes}. file with descriptor @var{filedes}.
@ -2502,6 +2640,7 @@ The functions in this section are declared in @file{sys/stat.h}.
@comment sys/stat.h @comment sys/stat.h
@comment POSIX.1 @comment POSIX.1
@deftypefun mode_t umask (mode_t @var{mask}) @deftypefun mode_t umask (mode_t @var{mask})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{umask} function sets the file creation mask of the current The @code{umask} function sets the file creation mask of the current
process to @var{mask}, and returns the previous value of the file process to @var{mask}, and returns the previous value of the file
creation mask. creation mask.
@ -2527,6 +2666,7 @@ you just want to read the mask value, because it is reentrant.
@comment sys/stat.h @comment sys/stat.h
@comment GNU @comment GNU
@deftypefun mode_t getumask (void) @deftypefun mode_t getumask (void)
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
Return the current value of the file creation mask for the current Return the current value of the file creation mask for the current
process. This function is a GNU extension and is only available on process. This function is a GNU extension and is only available on
@gnuhurdsystems{}. @gnuhurdsystems{}.
@ -2535,6 +2675,7 @@ process. This function is a GNU extension and is only available on
@comment sys/stat.h @comment sys/stat.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int chmod (const char *@var{filename}, mode_t @var{mode}) @deftypefun int chmod (const char *@var{filename}, mode_t @var{mode})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{chmod} function sets the access permission bits for the file The @code{chmod} function sets the access permission bits for the file
named by @var{filename} to @var{mode}. named by @var{filename} to @var{mode}.
@ -2575,6 +2716,7 @@ for full details on the sticky bit.
@comment sys/stat.h @comment sys/stat.h
@comment BSD @comment BSD
@deftypefun int fchmod (int @var{filedes}, mode_t @var{mode}) @deftypefun int fchmod (int @var{filedes}, mode_t @var{mode})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This is like @code{chmod}, except that it changes the permissions of the This is like @code{chmod}, except that it changes the permissions of the
currently open file given by @var{filedes}. currently open file given by @var{filedes}.
@ -2645,6 +2787,7 @@ The symbols in this section are declared in @file{unistd.h}.
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int access (const char *@var{filename}, int @var{how}) @deftypefun int access (const char *@var{filename}, int @var{how})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{access} function checks to see whether the file named by The @code{access} function checks to see whether the file named by
@var{filename} can be accessed in the way specified by the @var{how} @var{filename} can be accessed in the way specified by the @var{how}
argument. The @var{how} argument either can be the bitwise OR of the argument. The @var{how} argument either can be the bitwise OR of the
@ -2765,6 +2908,9 @@ This is the modification time for the file.
@comment utime.h @comment utime.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int utime (const char *@var{filename}, const struct utimbuf *@var{times}) @deftypefun int utime (const char *@var{filename}, const struct utimbuf *@var{times})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c In the absence of a utime syscall, it non-atomically converts times
@c to a struct timeval and calls utimes.
This function is used to modify the file times associated with the file This function is used to modify the file times associated with the file
named @var{filename}. named @var{filename}.
@ -2816,6 +2962,10 @@ in the header file @file{sys/time.h}.
@comment sys/time.h @comment sys/time.h
@comment BSD @comment BSD
@deftypefun int utimes (const char *@var{filename}, const struct timeval @var{tvp}@t{[2]}) @deftypefun int utimes (const char *@var{filename}, const struct timeval @var{tvp}@t{[2]})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c In the absence of a utimes syscall, it non-atomically converts tvp
@c to struct timespec array and issues a utimensat syscall, or to
@c struct utimbuf and calls utime.
This function sets the file access and modification times of the file This function sets the file access and modification times of the file
@var{filename}. The new file access time is specified by @var{filename}. The new file access time is specified by
@code{@var{tvp}[0]}, and the new modification time by @code{@var{tvp}[0]}, and the new modification time by
@ -2830,6 +2980,9 @@ function.
@comment sys/time.h @comment sys/time.h
@comment BSD @comment BSD
@deftypefun int lutimes (const char *@var{filename}, const struct timeval @var{tvp}@t{[2]}) @deftypefun int lutimes (const char *@var{filename}, const struct timeval @var{tvp}@t{[2]})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Since there's no lutimes syscall, it non-atomically converts tvp
@c to struct timespec array and issues a utimensat syscall.
This function is like @code{utimes}, except that it does not follow This function is like @code{utimes}, except that it does not follow
symbolic links. If @var{filename} is the name of a symbolic link, symbolic links. If @var{filename} is the name of a symbolic link,
@code{lutimes} sets the file access and modification times of the @code{lutimes} sets the file access and modification times of the
@ -2846,6 +2999,10 @@ function.
@comment sys/time.h @comment sys/time.h
@comment BSD @comment BSD
@deftypefun int futimes (int @var{fd}, const struct timeval @var{tvp}@t{[2]}) @deftypefun int futimes (int @var{fd}, const struct timeval @var{tvp}@t{[2]})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Since there's no futimes syscall, it non-atomically converts tvp
@c to struct timespec array and issues a utimensat syscall, falling back
@c to utimes on a /proc/self/fd symlink.
This function is like @code{utimes}, except that it takes an open file This function is like @code{utimes}, except that it takes an open file
descriptor as an argument instead of a file name. @xref{Low-Level descriptor as an argument instead of a file name. @xref{Low-Level
I/O}. This function comes from FreeBSD, and is not available on all I/O}. This function comes from FreeBSD, and is not available on all
@ -2900,6 +3057,8 @@ succeed, without actually accomplishing anything.
@comment unistd.h @comment unistd.h
@comment X/Open @comment X/Open
@deftypefun int truncate (const char *@var{filename}, off_t @var{length}) @deftypefun int truncate (const char *@var{filename}, off_t @var{length})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c In the absence of a truncate syscall, we use open and ftruncate.
The @code{truncate} function changes the size of @var{filename} to The @code{truncate} function changes the size of @var{filename} to
@var{length}. If @var{length} is shorter than the previous length, data @var{length}. If @var{length} is shorter than the previous length, data
@ -2944,6 +3103,8 @@ The operation was interrupted by a signal.
@comment unistd.h @comment unistd.h
@comment Unix98 @comment Unix98
@deftypefun int truncate64 (const char *@var{name}, off64_t @var{length}) @deftypefun int truncate64 (const char *@var{name}, off64_t @var{length})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c In the absence of a syscall, try truncate if length fits.
This function is similar to the @code{truncate} function. The This function is similar to the @code{truncate} function. The
difference is that the @var{length} argument is 64 bits wide even on 32 difference is that the @var{length} argument is 64 bits wide even on 32
bits machines, which allows the handling of files with sizes up to bits machines, which allows the handling of files with sizes up to
@ -2957,6 +3118,7 @@ When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} on a
@comment unistd.h @comment unistd.h
@comment POSIX @comment POSIX
@deftypefun int ftruncate (int @var{fd}, off_t @var{length}) @deftypefun int ftruncate (int @var{fd}, off_t @var{length})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This is like @code{truncate}, but it works on a file descriptor @var{fd} This is like @code{truncate}, but it works on a file descriptor @var{fd}
for an opened file instead of a file name to identify the object. The for an opened file instead of a file name to identify the object. The
@ -3021,6 +3183,8 @@ The operation was interrupted by a signal.
@comment unistd.h @comment unistd.h
@comment Unix98 @comment Unix98
@deftypefun int ftruncate64 (int @var{id}, off64_t @var{length}) @deftypefun int ftruncate64 (int @var{id}, off64_t @var{length})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c In the absence of a syscall, try ftruncate if length fits.
This function is similar to the @code{ftruncate} function. The This function is similar to the @code{ftruncate} function. The
difference is that the @var{length} argument is 64 bits wide even on 32 difference is that the @var{length} argument is 64 bits wide even on 32
bits machines which allows the handling of files with sizes up to bits machines which allows the handling of files with sizes up to
@ -3083,6 +3247,10 @@ The prototype for @code{mknod} is declared in @file{sys/stat.h}.
@comment sys/stat.h @comment sys/stat.h
@comment BSD @comment BSD
@deftypefun int mknod (const char *@var{filename}, mode_t @var{mode}, dev_t @var{dev}) @deftypefun int mknod (const char *@var{filename}, mode_t @var{mode}, dev_t @var{dev})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c Instead of issuing the syscall directly, we go through xmknod.
@c Although the internal xmknod takes a dev_t*, that could lead to
@c @mtsrace races, it's passed a pointer to mknod's dev.
The @code{mknod} function makes a special file with name @var{filename}. The @code{mknod} function makes a special file with name @var{filename}.
The @var{mode} specifies the mode of the file, and may include the various The @var{mode} specifies the mode of the file, and may include the various
special file bits, such as @code{S_IFCHR} (for a character special file) special file bits, such as @code{S_IFCHR} (for a character special file)
@ -3134,6 +3302,20 @@ These facilities are declared in the header file @file{stdio.h}.
@comment stdio.h @comment stdio.h
@comment ISO @comment ISO
@deftypefun {FILE *} tmpfile (void) @deftypefun {FILE *} tmpfile (void)
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @acsfd{} @aculock{}}}
@c The unsafety issues are those of fdopen, plus @acsfd because of the
@c open.
@c __path_search (internal buf, !dir, const pfx, !try_tmpdir) ok
@c libc_secure_genenv only if try_tmpdir
@c xstat64, strlen, strcmp, sprintf
@c __gen_tempname (internal tmpl, __GT_FILE) ok
@c strlen, memcmp, getpid, open/mkdir/lxstat64 ok
@c HP_TIMING_NOW if available ok
@c gettimeofday (!tz) first time, or every time if no HP_TIMING_NOW ok
@c static value is used and modified without synchronization ok
@c but the use is as a source of non-cryptographic randomness
@c with retries in case of collision, so it should be safe
@c unlink, fdopen
This function creates a temporary binary file for update mode, as if by This function creates a temporary binary file for update mode, as if by
calling @code{fopen} with mode @code{"wb+"}. The file is deleted calling @code{fopen} with mode @code{"wb+"}. The file is deleted
automatically when it is closed or when the program terminates. (On automatically when it is closed or when the program terminates. (On
@ -3150,6 +3332,7 @@ interface transparently replaces the old interface.
@comment stdio.h @comment stdio.h
@comment Unix98 @comment Unix98
@deftypefun {FILE *} tmpfile64 (void) @deftypefun {FILE *} tmpfile64 (void)
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @acsfd{} @aculock{}}}
This function is similar to @code{tmpfile}, but the stream it returns a This function is similar to @code{tmpfile}, but the stream it returns a
pointer to was opened using @code{tmpfile64}. Therefore this stream can pointer to was opened using @code{tmpfile64}. Therefore this stream can
be used for files larger than @math{2^31} bytes on 32-bit machines. be used for files larger than @math{2^31} bytes on 32-bit machines.
@ -3165,6 +3348,11 @@ and so transparently replaces the old interface.
@comment stdio.h @comment stdio.h
@comment ISO @comment ISO
@deftypefun {char *} tmpnam (char *@var{result}) @deftypefun {char *} tmpnam (char *@var{result})
@safety{@prelim{}@mtunsafe{@mtasurace{:tmpnam/!result}}@asunsafe{}@acsafe{}}
@c The passed-in buffer should not be modified concurrently with the
@c call.
@c __path_search (static or passed-in buf, !dir, !pfx, !try_tmpdir) ok
@c __gen_tempname (internal tmpl, __GT_NOCREATE) ok
This function constructs and returns a valid file name that does not This function constructs and returns a valid file name that does not
refer to any existing file. If the @var{result} argument is a null refer to any existing file. If the @var{result} argument is a null
pointer, the return value is a pointer to an internal static string, pointer, the return value is a pointer to an internal static string,
@ -3189,6 +3377,7 @@ opening the file you should use the @code{O_EXCL} flag. Using
@comment stdio.h @comment stdio.h
@comment GNU @comment GNU
@deftypefun {char *} tmpnam_r (char *@var{result}) @deftypefun {char *} tmpnam_r (char *@var{result})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function is nearly identical to the @code{tmpnam} function, except This function is nearly identical to the @code{tmpnam} function, except
that if @var{result} is a null pointer it returns a null pointer. that if @var{result} is a null pointer it returns a null pointer.
@ -3225,6 +3414,13 @@ never less than @code{25}.
@comment stdio.h @comment stdio.h
@comment SVID @comment SVID
@deftypefun {char *} tempnam (const char *@var{dir}, const char *@var{prefix}) @deftypefun {char *} tempnam (const char *@var{dir}, const char *@var{prefix})
@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
@c There's no way (short of being setuid) to avoid getenv("TMPDIR"),
@c even with a non-NULL dir.
@c
@c __path_search (internal buf, dir, pfx, try_tmpdir) unsafe getenv
@c __gen_tempname (internal tmpl, __GT_NOCREATE) ok
@c strdup
This function generates a unique temporary file name. If @var{prefix} This function generates a unique temporary file name. If @var{prefix}
is not a null pointer, up to five characters of this string are used as is not a null pointer, up to five characters of this string are used as
a prefix for the file name. The return value is a string newly a prefix for the file name. The return value is a string newly
@ -3288,6 +3484,8 @@ string. These functions are declared in the header file @file{stdlib.h}.
@comment stdlib.h @comment stdlib.h
@comment Unix @comment Unix
@deftypefun {char *} mktemp (char *@var{template}) @deftypefun {char *} mktemp (char *@var{template})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c __gen_tempname (caller tmpl, __GT_NOCREATE) ok
The @code{mktemp} function generates a unique file name by modifying The @code{mktemp} function generates a unique file name by modifying
@var{template} as described above. If successful, it returns @var{template} as described above. If successful, it returns
@var{template} as modified. If @code{mktemp} cannot find a unique file @var{template} as modified. If @code{mktemp} cannot find a unique file
@ -3306,6 +3504,8 @@ opening the file you should use the @code{O_EXCL} flag. Using
@comment stdlib.h @comment stdlib.h
@comment BSD @comment BSD
@deftypefun int mkstemp (char *@var{template}) @deftypefun int mkstemp (char *@var{template})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
@c __gen_tempname (caller tmpl, __GT_FILE) ok
The @code{mkstemp} function generates a unique file name just as The @code{mkstemp} function generates a unique file name just as
@code{mktemp} does, but it also opens the file for you with @code{open} @code{mktemp} does, but it also opens the file for you with @code{open}
(@pxref{Opening and Closing Files}). If successful, it modifies (@pxref{Opening and Closing Files}). If successful, it modifies
@ -3328,6 +3528,8 @@ new file and get an error if the file already exists.
@comment stdlib.h @comment stdlib.h
@comment BSD @comment BSD
@deftypefun {char *} mkdtemp (char *@var{template}) @deftypefun {char *} mkdtemp (char *@var{template})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c __gen_tempname (caller tmpl, __GT_DIR) ok
The @code{mkdtemp} function creates a directory with a unique name. If The @code{mkdtemp} function creates a directory with a unique name. If
it succeeds, it overwrites @var{template} with the name of the it succeeds, it overwrites @var{template} with the name of the
directory, and returns @var{template}. As with @code{mktemp} and directory, and returns @var{template}. As with @code{mktemp} and
@ -3349,3 +3551,23 @@ creation always works like @code{open} with @code{O_EXCL}.
@xref{Creating Directories}. @xref{Creating Directories}.
The @code{mkdtemp} function comes from OpenBSD. The @code{mkdtemp} function comes from OpenBSD.
@c FIXME these are undocumented:
@c faccessat
@c fchmodat
@c fchownat
@c futimesat
@c fstatat (there's a commented-out safety assessment for this one)
@c linkat
@c mkdirat
@c mkfifoat
@c name_to_handle_at
@c openat
@c open_by_handle_at
@c readlinkat
@c renameat
@c scandirat
@c symlinkat
@c unlinkat
@c utimensat
@c mknodat