//
// aegis - project change supervisor
// Copyright (C) 1991-1997, 1999, 2001-2008 Peter Miller
//
// 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 OS_H
#define OS_H
/** \addtogroup OS
* \brief Access OS services
* \ingroup AegisLibrary
* @{
*/
#include
#include
#include
class string_list_ty; // forward
class nstring_list; // forward
#define OS_EXEC_FLAG_NO_INPUT 0
#define OS_EXEC_FLAG_INPUT 1
#define OS_EXEC_FLAG_ERROK 2
#define OS_EXEC_FLAG_SILENT 4
/**
* The os_exists function is used to determine if the given path
* exists. It does not follow symlinks.
*
* \param path
* The path to check for existance.
* \param eaccess_is_ok
* If true, the EACCES error is also cause for returning false,
* rather than reporting a fatal error and exiting.
* \returns
* int; non-zero if the file exists, zero if the file doesn't
* (ENOENT or ENOTDIR)
* \note
* This function does not return for any error other than ENOENT or
* ENOTDIR, but prints an error and exits.
*/
int os_exists(string_ty *path, bool eaccess_is_ok = false);
/**
* The os_exists function is used to determine if the given path
* exists. It does not follow symlinks.
*
* \param path
* The path to check for existance.
* \param eaccess_is_ok
* If true, the EACCES error is also cause for returning false,
* rather than reporting a fatal error and exiting.
* \returns
* bool; true if the file exists, false if the file doesn't exist
* (ENOENT or ENOTDIR).
* \note
* This function does not return for any error other than ENOENT or
* ENOTDIR, but prints an error and exits.
*/
bool os_exists(const nstring &path, bool eaccess_is_ok = false);
/**
* The os_mkdir function is used to create a new directory. It does
* not mak intermediate directories.
*
* \param path
* The path opf the directory to be created.
* \param mode
* The mode of the created directory.
* \note
* This function does not return for any error, but prints an error
* and exits.
*/
void os_mkdir(string_ty *path, int mode);
/**
* The os_mkdir function is used to create a new directory. It does
* not mak intermediate directories.
*
* \param path
* The path opf the directory to be created.
* \param mode
* The mode of the created directory.
* \note
* This function does not return for any error, but prints an error
* and exits.
*/
void os_mkdir(const nstring &path, int mode);
/**
* The os_rmdir function is used to remove an empty directory.
*
* \param path
* The path of the directory to be removed.
* \note
* This funtion does not return if the is an error; instead it
* prints an error message and exits.
*/
void os_rmdir(string_ty *path);
/**
* The os_rmdir function is used to remove an empty directory.
*
* \param path
* The path of the directory to be removed.
* \note
* This funtion does not return if the is an error; instead it
* prints an error message and exits.
*/
void os_rmdir(const nstring &path);
/**
* The os_rmdir_errok function is used to remove an empty directory.
* It ignores errors.
*
* \param path
* The path of the directory to be removed.
*/
void os_rmdir_errok(string_ty *path);
/**
* The os_rmdir_errok function is used to remove an empty directory.
* It ignores errors.
*
* \param path
* The path of the directory to be removed.
*/
void os_rmdir_errok(const nstring &path);
/**
* The os_rmdir_bg function removes a directory tree in the background.
*
* \param path
* The directory tree to be removed.
*/
void os_rmdir_bg(string_ty *path);
/**
* The os_rmdir_bg function removes a directory tree in the background.
*
* \param path
* The directory tree to be removed.
*/
void os_rmdir_bg(const nstring &path);
/**
* The os_rmdir_tree function is used to remive directory trees.
*
* \param path
* The path of the directory tree to be removed.
* \note
* This function will not return if there is any error removing
* the directory tree, instead it will report the error, abort the
* remove, and exit.
*/
void os_rmdir_tree(string_ty *path);
/**
* The os_rmdir_tree function is used to remive directory trees.
*
* \param path
* The path of the directory tree to be removed.
* \note
* This function will not return if there is any error removing
* the directory tree, instead it will report the error, abort the
* remove, and exit.
*/
void os_rmdir_tree(const nstring &path);
/**
* The os_mkdir_between function is used to make intermediate
* directories, of necessary between a root and a relative destination.
* The final portion is not created.
*
* \param root
* The root directory.
* \param rel
* The path, relative to the root, which needs to have intermediate
* directories created.
* \param mode
* The permissions mode for any created directories.
* \note
* This function will not return if there is any error creating a
* directory, instead it will report the error and exit.
*/
void os_mkdir_between(string_ty *root, string_ty *rel, int mode);
/**
* The os_mkdir_between function is used to make intermediate
* directories, of necessary between a root and a relative destination.
* The final portion is not created.
*
* \param root
* The root directory.
* \param rel
* The path, relative to the root, which needs to have intermediate
* directories created.
* \param mode
* The permissions mode for any created directories.
* \note
* This function will not return if there is any error creating a
* directory, instead it will report the error and exit.
*/
void os_mkdir_between(const nstring &root, const nstring &rel, int mode);
/**
* The os_rename function is used to change the name of a file.
*
* Any other hard links to the file (as created using link(2)) are
* unaffected.
*
* If newpath already exists it will be atomically replaced (subject
* to a few conditions), so that there is no point at which another
* process attempting to access newpath will find it missing.
*
* If newpath exists but the operation fails for some reason rename
* guarantees to leave an instance of newpath in place.
*
* However, when overwriting there will probably be a window in which
* both oldpath and newpath refer to the file being renamed.
*
* If oldpath refers to a symbolic link the link is renamed; if newpath
* refers to a symbolic link the link will be overwritten.
*
* \param oldpath
* The name of the file on entry.
* \param newpath
* The name of the file on return.
*
* \note
* This function will not return if there are any errors.
*/
void os_rename(string_ty *oldpath, string_ty *newpath);
/**
* The os_rename function is used to change the name of a file.
*
* Any other hard links to the file (as created using link(2)) are
* unaffected.
*
* If newpath already exists it will be atomically replaced (subject
* to a few conditions), so that there is no point at which another
* process attempting to access newpath will find it missing.
*
* If newpath exists but the operation fails for some reason rename
* guarantees to leave an instance of newpath in place.
*
* However, when overwriting there will probably be a window in which
* both oldpath and newpath refer to the file being renamed.
*
* If oldpath refers to a symbolic link the link is renamed; if newpath
* refers to a symbolic link the link will be overwritten.
*
* \param oldpath
* The name of the file on entry.
* \param newpath
* The name of the file on return.
*
* \note
* This function does not return if there is an error; it prints an
* error message and exits.
*/
void os_rename(const nstring &oldpath, const nstring &newpath);
/**
* The os_unlink function deletes a name from the filesystem. If that
* name was the last link to a file and no processes have the file open
* the file is deleted and the space it was using is made available for
* reuse.
*
* If the name was the last link to a file but any processes still have
* the file open the file will remain in existence until the last file
* descriptor referring to it is closed.
*
* If the name referred to a symbolic link the link is removed.
*
* If the name referred to a socket, fifo or device the name for it is
* removed but processes which have the object open may continue to use
* it.
*
* \param path
* The name of the file to be deleted.
*
* \note
* This function does not return if there is an error; it prints an
* error message and exits.
*/
void os_unlink(string_ty *path);
/**
* The os_unlink function deletes a name from the filesystem. If that
* name was the last link to a file and no processes have the file open
* the file is deleted and the space it was using is made available for
* reuse.
*
* If the name was the last link to a file but any processes still have
* the file open the file will remain in existence until the last file
* descriptor referring to it is closed.
*
* If the name referred to a symbolic link the link is removed.
*
* If the name referred to a socket, fifo or device the name for it is
* removed but processes which have the object open may continue to use
* it.
*
* \param path
* The name of the file to be deleted.
* \note
* This function does not return if there is an error; it prints an
* error message and exits.
*/
void os_unlink(const nstring &path);
/**
* The os_unlink_errok function deletes a name from the filesystem. If
* that name was the last link to a file and no processes have the
* file open the file is deleted and the space it was using is made
* available for reuse.
*
* If the name was the last link to a file but any processes still have
* the file open the file will remain in existence until the last file
* descriptor referring to it is closed.
*
* If the name referred to a symbolic link the link is removed.
*
* If the name referred to a socket, fifo or device the name for it is
* removed but processes which have the object open may continue to use
* it.
*
* \param path
* The name of the file to be deleted.
* \note
* This function ignores any errors.
*/
void os_unlink_errok(string_ty *path);
/**
* The os_unlink_errok function deletes a name from the filesystem. If
* that name was the last link to a file and no processes have the
* file open the file is deleted and the space it was using is made
* available for reuse.
*
* If the name was the last link to a file but any processes still have
* the file open the file will remain in existence until the last file
* descriptor referring to it is closed.
*
* If the name referred to a symbolic link the link is removed.
*
* If the name referred to a socket, fifo or device the name for it is
* removed but processes which have the object open may continue to use
* it.
*
* \param path
* The name of the file to be deleted.
* \note
* This function ignores any errors.
*/
void os_unlink_errok(const nstring &path);
/**
* The os_curdir function is used to obtain the absolute path of the
* current directory.
*
* \note
* This function does not return if there is an error; it prints an
* error message and exits.
*/
string_ty *os_curdir(void);
/**
* The os_path_join function may be used to joint two strings together
* with a slash between them.
*
* \param lhs
* The root or upper portion.
* \param rhs
* The relative or lower portion.
*/
string_ty *os_path_join(string_ty *lhs, string_ty *rhs);
/**
* The os_path_join function may be used to joint two strings together
* with a slash between them.
*
* \param lhs
* The root or upper portion.
* \param rhs
* The relative or lower portion.
*/
nstring os_path_join(const nstring &lhs, const nstring &rhs);
/**
* The os_path_join function may be used to joint two strings together
* with a slash between them.
*
* \param lhs
* The root or upper portion.
* \param rhs
* The relative or lower portion.
*/
nstring os_path_join(const nstring &lhs, const nstring &rhs);
/**
* The os_path_cat function is used to carefully join two path
* components together with a slash. Care is taken to remove redundant
* "." components and redundant slashes.
*
* \param lhs
* The directory the next part is relative to.
* \param rhs
* The additional path, relative to the first argument.
*/
string_ty *os_path_cat(string_ty *lhs, string_ty *rhs);
/**
* The os_path_cat function is used to carefully join two path
* components together with a slash. Care is taken to remove redundant
* "." components and redundant slashes.
*
* \param lhs
* The directory the next part is relative to.
* \param rhs
* The additional path, relative to the first argument.
*/
nstring os_path_cat(const nstring &lhs, const nstring &rhs);
/**
* The os_path_cat function is used to carefully joint two path
* components together with a slash. Care is taken to remove redundant
* "." components and redundant slashes.
*
* \param lhs
* The directory the next part is relative to.
* \param rhs
* The additional path, relative to the first argument.
*/
nstring os_path_cat(const nstring &lhs, const nstring &rhs);
/**
* The os_path_rel2abs function is used to make relative paths
* absolute, if they need it.
*
* \param root
* The root for relative paths.
* \param path
* The path to (conditionally) be made absolute.
* \returns
* The "path" if it was already abvsolute, otherwise the "root" is
* used to make the "path" absolute.
*/
string_ty *os_path_rel2abs(string_ty *root, string_ty *path);
/**
* The os_path_rel2abs function is used to make relative paths
* absolute, if they need it.
*
* \param root
* The root for relative paths.
* \param path
* The path to (conditionally) be made absolute.
* \returns
* The "path" if it was already abvsolute, otherwise the "root" is
* used to make the "path" absolute.
*/
nstring os_path_rel2abs(const nstring &root, const nstring &path);
/**
* Os_pathname is used to determine the full path name
* of a partial path given.
*
* \param path
* path to canonicalize
* \param resolve
* non-zero if should resolve symlinks, 0 if not
* \returns
* pointer to dynamically allocated string.
* \note
* Use str_free() when you are done with the value returned.
*/
string_ty *os_pathname(string_ty *path, int resolve);
/**
* Os_pathname is used to determine the full path name
* of a partial path given.
*
* \param path
* path to canonicalize
* \param resolve
* true if should resolve symlinks, false if not
*/
nstring os_pathname(const nstring &path, bool resolve);
/**
* The os_basename function strip directory and suffix from
* filenames. (see basename(1))
*
* \param name
* the filename to process
* \param ext
* the (optional) suffix to be stripped
*
*/
string_ty *os_basename(string_ty *name, string_ty *ext = NULL);
/**
* The os_basename function strip directory and suffix from
* filenames. (see basename(1))
*
* \param name
* the filename to process
* \param ext
* the (optional) suffix to be stripped
*
*/
nstring os_basename(const nstring &name, const nstring &ext = "");
/**
* The os_dirname function is used to extract the directory part of a
* path (i.e. the last /component removed).
*
* \param path
* The path to be dismembered.
* \note
* The pash is resolved via os_pathname before the directory part is
* extracted.
*/
string_ty *os_dirname(string_ty *path);
/**
* The os_dirname function is used to extract the directory part of a
* path (i.e. the last /component removed).
*
* \param path
* The path to be dismembered.
* \note
* The pash is resolved via os_pathname before the directory part is
* extracted.
*/
nstring os_dirname(const nstring &path);
/**
* The os_dirname_relative function is used to extract the directory
* part of a path (i.e. the last /component removed). If there is no
* slash (/) in the filename, "." is returned.
*
* \param path
* The path to be dismembered.
*/
string_ty *os_dirname_relative(string_ty *path);
/**
* The os_dirname_relative function is used to extract the directory
* part of a path (i.e. the last /component removed). If there is no
* slash (/) in the filename, "." is returned.
*
* \param path
* The path to be dismembered.
*/
nstring os_dirname_relative(const nstring &path);
/**
* The os_entryname function is used to extract the last pathname
* portion of the given path.
*
* \param path
* The path to be dismembered.
* \note
* The path is resolved via os_pathname before the last portion of
* the path is extracted.
*/
string_ty *os_entryname(string_ty *path);
/**
* The os_entryname function is used to extract the last pathname
* portion of the given path.
*
* \param path
* The path to be dismembered.
* \note
* The path is resolved via os_pathname before the last portion of
* the path is extracted.
*/
nstring os_entryname(const nstring &path);
/**
* The os_entryname_relative function is used to extract the last
* pathname portion of the given path.
*
* \param path
* The path to be dismembered.
*/
string_ty *os_entryname_relative(string_ty *path);
/**
* The os_entryname_relative function is used to extract the last
* pathname portion of the given path.
*
* \param path
* The path to be dismembered.
*/
nstring os_entryname_relative(const nstring &path);
/**
* The os_below_dir function is used to test whether a given path
* (lower) is below another directory (upper).
*
* \param higher
* The top directory.
* \param lower
* The full directory including "higher" and exterding for
* additional path compenents.
* \returns
* pointer to string in dynamic memory, being the relative portion
* below "higher"; NULL if "lower" is not below "higher"; the empty
* string if lower equals upper.
*/
string_ty *os_below_dir(string_ty *higher, string_ty *lower);
/**
* The os_below_dir function is used to test whether a given path
* (lower) is below another directory (upper).
*
* \param upper
* The top directory.
* \param lower
* The full directory including "higher" and exterding for
* additional path compenents.
* \returns
* narrow string; being the relative portion below "higher"; or ""
* if "lower" is not below "higher"; or "." if lower equals higher.
* \note
* The return values are not the same as the old string_ty
* version of this function.
*/
nstring os_below_dir(const nstring &upper, const nstring &lower);
/**
* The os_chdir function is used to changes the current directory to
* the specified path.
*
* \param path
* The directory to change to.
* \note
* This function does not return if there is an error; it printf an
* error message and exits.
*/
void os_chdir(string_ty *path);
/**
* The os_chdir function is used to changes the current directory to
* the specified path.
*
* \param path
* The directory to change to.
* \note
* This function does not return if there is an error; it printf an
* error message and exits.
*/
void os_chdir(const nstring &path);
/**
* The os_setuid function is used to set the effective user ID of the
* current process. If the effective userid of the caller is root, the
* real and saved user IDs are also set.
*
* Under Linux, setuid is implemented like the POSIX version with the
* _POSIX_SAVED_IDS feature. This allows a setuid (other than root)
* program to drop all of its user privileges, do some un-privileged
* work, and then re-engage the original effective user ID in a secure
* manner.
*
* If the user is root or the program is setuid root, special care must
* be taken. The setuid function checks the effective uid of the caller
* and if it is the superuser, all process related user IDs are set
* to uid. After this has occurred, it is impossible for the program
* to regain root privileges.
*
* Thus, a setuid-root program wishing to temporarily drop root
* privileges, assume the identity of a non-root user, and then regain
* root privileges afterwards cannot use setuid. You can accomplish
* this with the (non-POSIX, BSD) call seteuid.
*
* \param id
* The UID to assume.
*
* \note
* This function does not return in the event of an error; instead
* it prints an error message and exits.
*/
void os_setuid(int id);
/**
* The os_setgid function si used to set the effective group ID of the
* current process. If the caller is the superuser, the real and saved
* group IDs are also set.
*
* Under Linux, setgid is implemented like the POSIX version with the
* _POSIX_SAVED_IDS feature. This allows a setgid program that is not
* suid root to drop all of its group privileges, do some un-privileged
* work, and then re-engage the original effective group ID in a secure
* manner.
*
* \param id
* The GID to assume.
*
* \note
* This function does not return in the event of an error; instead
* it prints an error message and exits.
*/
void os_setgid(int id);
/**
* The os_execute function i sused to execute a command. It is
* expected that you have already called os_become to set the user the
* command is to be executed as.
*
* This function does not return if the command returns a non-zero exit
* status.
*
* @param cmd
* The command to be executed.
* @param flags
* specific conditions to run the command
* @param dir
* The current directory to execute the command from.
*/
void os_execute(string_ty *cmd, int flags, string_ty *dir);
/**
* The os_execute function i sused to execute a command. It is
* expected that you have already called os_become to set the user the
* command is to be executed as.
*
* This function does not return if the command returns a non-zero exit
* status.
*
* @param cmd
* The command to be executed.
* @param flags
* specific conditions to run the command
* @param dir
* The current directory to execute the command from.
*/
void os_execute(const nstring &cmd, int flags, const nstring &dir);
/**
* The os_execute_retcode function is used to execute a command an
* returns its exit status.
*
* @param cmd
* The command to execute
* @param flags
* flags for how to run the command
* @param dir
* the directory in which to run the command
* @returns
* the exit status: zero on success, non-zero on failure
*/
int os_execute_retcode(string_ty *cmd, int flags, string_ty *dir);
/**
* The os_execute_retcode function is used to execute a command an
* returns its exit status.
*
* @param cmd
* The command to execute
* @param flags
* flags for how to run the command
* @param dir
* the directory in which to run the command
* @returns
* the exit status: zero on success, non-zero on failure
*/
int os_execute_retcode(const nstring &cmd, int flags, const nstring &dir);
string_ty *os_execute_slurp(string_ty *cmd, int flags, string_ty *dir);
/**
* The os_xargs function is used to run a command with command line
* arguments supplied by a list of strings. It will break it into
* chunks if necessary. This is analogous to the unix xargs(1)
* command.
*
* @param the_command
* The command to be executed. Additional arguments are expected
* to have been quoted appropriately already.
* @param the_list
* The arguments to the command. They will be quoted to protect
* shell special characters if necessary.
* @param dir
* The directory the command is to be run in.
*/
void os_xargs(string_ty *the_command, struct string_list_ty *the_list,
string_ty *dir);
/**
* The os_xargs function is used to run a command with command line
* arguments supplied by a list of strings. It will break it into
* chunks if necessary. This is analogous to the unix xargs(1)
* command.
*
* @param the_command
* The command to be executed. Additional arguments are expected
* to have been quoted appropriately already.
* @param the_list
* The arguments to the command. They will be quoted to protect
* shell special characters if necessary.
* @param dir
* The directory the command is to be run in.
*/
void os_xargs(const nstring &the_command, const nstring_list &the_list,
const nstring &dir);
long os_file_size(string_ty *);
void os_mtime_range(string_ty *, time_t *, time_t *);
time_t os_mtime_actual(string_ty *);
void os_mtime_set(string_ty *, time_t);
void os_mtime_set_errok(string_ty *, time_t);
void os_chown_check(string_ty *path, int mode, int uid, int gid);
/**
* The os_chmod function is used to change the permission mode of a
* file. This function does not return if there is an error; instead
* it prints an error messages and exits.
*
* \param path
* The path of the file to be changed.
* \param mode
* The permissions mode the file is to assume.
*/
void os_chmod(string_ty *path, int mode);
/**
* The os_chmod function is used to change the permission mode of a
* file. This function does not return if there is an error; instead
* it prints an error messages and exits.
*
* \param path
* The path of the file to be changed.
* \param mode
* The permissions mode the file is to assume.
*/
void os_chmod(const nstring &path, int mode);
/**
* The os_chmod_errok function is used to change the permission mode of
* a file. This function ignores arror.
*
* \param path
* The path of the file to be changed.
* \param mode
* The permissions mode the file is to assume.
*/
void os_chmod_errok(string_ty *path, int mode);
/**
* The os_chmod_errok function is used to change the permission mode of
* a file. This function ignores arror.
*
* \param path
* The path of the file to be changed.
* \param mode
* The permissions mode the file is to assume.
*/
void os_chmod_errok(const nstring &path, int mode);
int os_chmod_query(string_ty *);
/**
* The os_link function is used to make a hard link between two files.
*
* @param from
* The existing file.
* @param to
* The new file to be a hard link of the existing file.
*/
void os_link(string_ty *from, string_ty *to);
/**
* The os_link function is used to make a hard link between two files.
*
* @param from
* The existing file.
* @param to
* The new file to be a hard link of the existing file.
*/
void os_link(const nstring &from, const nstring &to);
int os_testing_mode(void);
void os_become_init(void);
void os_become_init_mortal(void);
void os_become_reinit_mortal(void);
void os_become(int uid, int gid, int umsk);
/**
* The os_become_undo function is used to undo the effects of the
* os_become function. It returns the effective uid and gid to root,
* so that future os_become call will work.
*
* It is a bug (and a fatal error will be issued) if there is no
* matching os_become call.
*/
void os_become_undo(void);
/**
* The os_become_undo function is used to undo the effects of the
* os_become function. It returns the effective uid and gid to root,
* so that future os_become call will work.
*
* It is a bug (and a fatal error will be issued) if there is no
* matching os_become call. If DEBUG is enabled, it will cause an
* assert failure if the uid and gid in the undo does not match the
* os_become.
*/
void os_become_undo(int uid, int gid);
/**
* The os_become_undo_atexit function is used to cancel any os_become
* setting, if one is active. It performs all of the functions
* of_os_become_undo, except it is not an error if there has been no
* matching os_become call. This function may only be called
* from quite_action derived classes.
*/
void os_become_undo_atexit(void);
void os_become_orig(void);
void os_become_query(int *uid, int *gid, int *umsk);
void os_become_orig_query(int *uid, int *gid, int *umsk);
int os_become_active(void);
#define os_become_must_be_active() \
os_become_must_be_active_gizzards(__FILE__, __LINE__)
void os_become_must_be_active_gizzards(const char *, int);
#define os_become_must_not_be_active() \
os_become_must_not_be_active_gizzards(__FILE__, __LINE__)
void os_become_must_not_be_active_gizzards(const char *, int);
/**
* \brief
* test for backgroundness
*
* The background function is used to determine if the curent process
* is running in the background.
*
*\return
* zero if process is not in the background, nonzero if the process
* is in the background.
*/
int os_background(void);
/**
* The os_readable function may be used to determine whether or not the
* given file is readable.
*
* @param path
* The path (aabsolute or relative) of the file to test.
* @returns
* zero on success, or the errno value on failure.
*/
int os_readable(string_ty *path);
/**
* The os_readable function may be used to determine whether or not the
* given file is readable.
*
* @param path
* The path (aabsolute or relative) of the file to test.
* @returns
* zero on success, or the errno value on failure.
*/
int os_readable(const nstring &path);
bool os_executable(string_ty *);
int os_waitpid(int child, int *status);
int os_waitpid_status(int child, const char *cmd);
const char *os_shell(void);
enum edit_ty
{
edit_not_set,
edit_foreground,
edit_background
};
/**
* The os_edit function is used to pass the named file to an edirot for
* the user to edit. It returns whn the user quit the editor.
*
* @param filename
* The name of the file to be edited.
* @param mode
* How the editing is to be done.
*/
void os_edit(string_ty *filename, edit_ty mode);
/**
* The os_edit function is used to pass the named file to an edirot for
* the user to edit. It returns whn the user quit the editor.
*
* @param filename
* The name of the file to be edited.
* @param mode
* How the editing is to be done.
*/
void os_edit(const nstring &filename, edit_ty mode);
string_ty *os_edit_string(string_ty *, edit_ty);
string_ty *os_edit_new(edit_ty);
string_ty *os_edit_filename(int);
string_ty *os_tmpdir(void);
/**
* The os_pathconf_name_max function may be used to determine the
* maximum length of a path name component.
*
* @param path
* the file or directory of interest
*/
int os_pathconf_name_max(const nstring &path);
/**
* The os_pathconf_name_max function may be used to determine the
* maximum length of a path name component.
*
* @param path
* the file or directory of interest
*/
int os_pathconf_name_max(string_ty *path);
/**
* The os_pathconf_path_max function may be used to determine the
* maximum length of a file name path, over all components, including
* separators.
*
* @param path
* the file or directory of interest
*/
int os_pathconf_path_max(const nstring &path);
/**
* The os_pathconf_path_max function may be used to determine the
* maximum length of a file name path, over all components, including
* separators.
*
* @param path
* the file or directory of interest
*/
int os_pathconf_path_max(string_ty *path);
/**
* The os_symlink function is used to make symbolic links.
*
* @param src
* The src paramter is the source file to be linked from.
* @param dst
* The dst paramter is the destination file to be created.
*/
void os_symlink(string_ty *src, string_ty *dst);
/**
* The os_symlink function is used to make symbolic links.
*
* @param src
* The src paramter is the source file to be linked from.
* @param dst
* The dst paramter is the destination file to be created.
*/
void os_symlink(const nstring &src, const nstring &dst);
/**
* The os_symlink_or_copy function is used to make symbolic links if
* possible otherwise hard links otherwise make a complete copy.
*
* @param src
* The src paramter is the source file to be linked from.
* @param dst
* The dst paramter is the destination file to be created.
*/
void os_symlink_or_copy(string_ty *src, string_ty *dst);
string_ty *os_readlink(string_ty *);
int os_symlink_query(string_ty *);
/**
* This unlikely function is used to slow aegis down. It is primarily
* used for Aegis' own tests, to ensure that the time stamps are kosher
* even on ultra-fast machines. It is also useful in shell scripts,
* e.g. automatic integration queue handling.
*
* The AEGIS_THROTTLE environment variable is set to the number of
* seconds to throttle, typically 2.
*/
void os_throttle(void);
/**
* The os_unthrottle method is used to determine whether or not strict
* timestamp checks should be performed, because no throoline is in
* effect.
*
* @returns
* bool; true if AEGIS_THROTTLE is less than zero,; false if unset
* or zero or positive.
*/
bool os_unthrottle(void);
void os_owner_query(string_ty *, int *, int *);
string_ty *os_fingerprint(string_ty *);
void os_interrupt_register(void);
void os_interrupt_cope(void);
void os_interrupt_ignore(void);
int os_interrupt_has_occurred(void);
/**
* The os_isa_directory function is used to test whether the given
* absolute path is a directory.
*
* \param path
* The absolute file path to be examined.
* \returns
* bool; true if the file exists and is a directory,
* false if the file does not exist,
* false if the file exists and is not a directory.
*/
int os_isa_directory(string_ty *path);
/**
* The os_isa_symlink function is used to test whether the given
* absolute path is a symbolic link.
*
* \param path
* The absolute file path to be examined.
* \returns
* bool; true if the file exists and is a symbolic link,
* false if the file does not exists,
* false if the file exists and is not a symbolic link.
*/
bool os_isa_symlink(string_ty *path);
/**
* The os_isa_special_file function is used to test whether the given
* absolute path is a regular file or not.
*
* \param path
* The absolute file path to be examined.
* \returns
* bool;
* false if the file does not exist,
* false if the file exists and is a regular file,
* true if the file exists and is a directory,
* true if the file exists and is a symlink,
* true if the file exists and is not a regular file,
*/
int os_isa_special_file(string_ty *path);
/**
* The os_magic_file function is used to determine a file type from
* file contents.
*
* @param filename
* The name of the file to be examined to determine the file type.
* @returns
* A string describing the file, as a MIME content-type.
* E.g. most source files will be "text/plain; charset=us-ascii"
*/
nstring os_magic_file(const nstring &filename);
/**
* The os_magic_file function is used to determine a file type from
* file contents. This is for compatibility and will eventually disappear.
*
* @param filename
* The name of the file to be examined to determine the file type.
* @returns
* A string describing the file, as a MIME content-type.
* E.g. most source files will be "text/plain; charset=us-ascii"
*/
nstring os_magic_file(string_ty *filename);
/**
* The os_canonify_dirname function is used transform a directory
* name in canonical form (without the trailing slash). This is for
* compatibility and will eventually disappear.
*
* @param dirname
* The name of the directory to be canonified.
* @returns
* A string with the canonified name of the directory.
*/
string_ty* os_canonify_dirname(string_ty *dirname);
/**
* The os_canonify_dirname function is used transform a directory
* name in canonical form (without the trailing slash).
*
* @param dirname
* The name of the directory to be canonified.
* @returns
* A string with the canonified name of the directory.
*/
nstring os_canonify_dirname(const nstring &dirname);
/**
* The os_check_path_traversable function is used to check that a path,
* consisting entirely of existing directories, is traversable (has
* directory 'x' permissions) by the current user.
*
* @param path
* The directory path to walk and check.
* @note
* This function does not return if any problem is found; instead
* it prints a fatal error message and exits.
*/
void os_check_path_traversable(string_ty *path);
/** @} */
#endif // OS_H