summaryrefslogtreecommitdiffstats
path: root/unwind.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-05-01 06:32:34 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-05-01 06:32:34 -0700
commit488c1ba59416a0b2ce87a36d7df3026e334d66b9 (patch)
treef0e4f92351f5eb98c07206828cb80615a1a8fdce /unwind.c
parentc7888220b30e5933b76c0d5359c6f56874859fee (diff)
downloadtxr-488c1ba59416a0b2ce87a36d7df3026e334d66b9.tar.gz
txr-488c1ba59416a0b2ce87a36d7df3026e334d66b9.tar.bz2
txr-488c1ba59416a0b2ce87a36d7df3026e334d66b9.zip
lib: more nuanced file access errors.
Several new more specific exception types are derived from file-error and used. Error handlers can distinguish unexpected non-existence, unexpected existence and permission errors from each other and other errors. * lib.c (path_not_found_s, path_exists_s, path_permission_s): New symbol variables. (obj_init): New variables initialized. * lib.h (path_not_found_s, path_exists_s, path_permission_s): Declared. * parser.c (open_txr_file): Use new errno_to_file_error function to convert errno to exception symbol. * socket.c (open_sockfd): Likewise. * stream.c (open_directory, open_file, open_fileno, open_command, open_process, run, remove_path, rename_path): Likewise, and process-error is used in open_process and run instead of file-error for problems related to creating the process. * sysif.c (errno_to_file_error): New function. (mkdir_wrap, ensure_dir, chdir_wrap, getcwd_wrap, mknod_wrap, chmod_wrap, symlink_wrap, link_wrap, readlink_wrap, stat_impl, umask_wrap, ): Use errno_to_file_error to convert errno to exception symbol. (exec_wrap): Use process-error instead of file-error. * sysif.c (errno_to_file_error): Declared. * unwind.c (uw_init): Register path-not-found, path-exists and path-permission as subtypes of file-error. * txr.1: Documented.
Diffstat (limited to 'unwind.c')
-rw-r--r--unwind.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/unwind.c b/unwind.c
index ca8762fd..0f362c4b 100644
--- a/unwind.c
+++ b/unwind.c
@@ -1177,6 +1177,9 @@ void uw_init(void)
uw_register_subtype(timeout_error_s, error_s);
uw_register_subtype(assert_s, error_s);
uw_register_subtype(syntax_error_s, error_s);
+ uw_register_subtype(path_not_found_s, file_error_s);
+ uw_register_subtype(path_exists_s, file_error_s);
+ uw_register_subtype(path_permission_s, file_error_s);
}
void uw_late_init(void)