]> Kevux Git Server - fll/commitdiff
Update: Add missing checks to f_file_link_hard_at() and use F_file_descriptor.
authorKevin Day <thekevinday@gmail.com>
Sat, 16 Apr 2022 03:08:40 +0000 (22:08 -0500)
committerKevin Day <thekevinday@gmail.com>
Sat, 16 Apr 2022 03:08:40 +0000 (22:08 -0500)
The F_data_not tests are missing, add them.

The EBADF is returning F_directory_descriptor.
In this specific case, the descriptor is not for a directory per-say but for a general file.
The F_file_descriptor code should be returned in this case.

This has been revealed by the unit tests that I am writing.

level_0/f_file/c/file.c
level_0/f_file/c/file.h
level_0/f_file/c/private-file.c

index 98de2d62e04735d3c6c38f02859285c03885b5a6..23c160a891f8288763065f8df9d49c6942183558 100644 (file)
@@ -578,9 +578,13 @@ extern "C" {
 #ifndef _di_f_file_link_hard_at_
   f_status_t f_file_link_hard_at(const int at_id_target, const int at_id_point, const f_string_static_t target, const f_string_static_t point, const int flag) {
 
+    if (!target.used || !point.used) {
+      return F_data_not;
+    }
+
     if (linkat(at_id_target, target.string, at_id_point, point.string, flag) < 0) {
       if (errno == EACCES) return F_status_set_error(F_access_denied);
-      if (errno == EBADF) return F_status_set_error(F_directory_descriptor);
+      if (errno == EBADF) return F_status_set_error(F_file_descriptor);
       if (errno == EDQUOT) return F_status_set_error(F_filesystem_quota_block);
       if (errno == EEXIST) return F_status_set_error(F_file_found);
       if (errno == EFAULT) return F_status_set_error(F_buffer);
index 1ed2602d99683658252b0a305f5d2e86554b48ce..80c314dfc63257eb0e079dc2279f2f91289f53ea 100644 (file)
@@ -929,6 +929,7 @@ extern "C" {
  *   F_busy (with error bit) if file system is too busy to perform write.
  *   F_directory_descriptor (with error bit) when either at_id_target or at_id_point is not a valid file descriptor (at_id must point to a directory).
  *   F_directory_not (with error bit) if a supposed directory in path is not actually a directory.
+ *   F_file_descriptor (with error bit) if file descriptor is invalid.
  *   F_file_found (with error bit) if a file aleady exists at the path.
  *   F_file_found_not (with error bit) if a parent path in point does not exist or is a broken symlink.
  *   F_filesystem_quota_block (with error bit) if file system's disk blocks or inodes are exhausted.
index 8cb410d4d7f14ee3ee093ae4e1ad12678b5dd0ce..a4f3e49b0960ca8e95093bbb0781da022c551531 100644 (file)
@@ -404,7 +404,7 @@ extern "C" {
 #if !defined(_di_f_file_link_read_) || !defined(_di_f_file_copy_)
   f_status_t private_f_file_link_read(const f_string_static_t path, const struct stat link_stat, f_string_dynamic_t * const target) {
 
-    // create a NULL terminated string based on file stat.
+    // Create a NULL terminated string based on file stat.
     if (link_stat.st_size + 1 > target->size) {
       if (link_stat.st_size + 1 > F_array_length_t_size_d) {
         return F_status_set_error(F_string_too_large);