1 /* 2 Wrapper for routines to notify the 3 tree about the changes made to the directory 4 structure. 5 6 Copyright (C) 2011-2024 7 Free Software Foundation, Inc. 8 9 Author: 10 Janne Kukonlehto 11 Miguel de Icaza 12 Slava Zanko <slavazanko@gmail.com>, 2013 13 14 This file is part of the Midnight Commander. 15 16 The Midnight Commander is free software: you can redistribute it 17 and/or modify it under the terms of the GNU General Public License as 18 published by the Free Software Foundation, either version 3 of the License, 19 or (at your option) any later version. 20 21 The Midnight Commander is distributed in the hope that it will be useful, 22 but WITHOUT ANY WARRANTY; without even the implied warranty of 23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24 GNU General Public License for more details. 25 26 You should have received a copy of the GNU General Public License 27 along with this program. If not, see <http://www.gnu.org/licenses/>. 28 */ 29 30 31 /** \file filenot.c 32 * \brief Source: wrapper for routines to notify the 33 * tree about the changes made to the directory 34 * structure. 35 */ 36 37 #include <config.h> 38 39 #include <errno.h> 40 #include <string.h> 41 42 #include "lib/global.h" 43 #include "lib/fs.h" 44 #include "lib/util.h" 45 #include "lib/vfs/vfs.h" 46 47 #include "filenot.h" 48 49 /*** global variables ****************************************************************************/ 50 51 /*** file scope macro definitions ****************************************************************/ 52 53 /*** file scope type declarations ****************************************************************/ 54 55 /*** forward declarations (file scope functions) *************************************************/ 56 57 /*** file scope variables ************************************************************************/ 58 59 /* --------------------------------------------------------------------------------------------- */ 60 /*** file scope functions ************************************************************************/ 61 /* --------------------------------------------------------------------------------------------- */ 62 63 static int 64 my_mkdir_rec (const vfs_path_t *vpath, mode_t mode) /* */ 65 { 66 vfs_path_t *q; 67 int result; 68 69 if (mc_mkdir (vpath, mode) == 0) 70 return 0; 71 if (errno != ENOENT) 72 return (-1); 73 74 /* FIXME: should check instead if vpath is at the root of that filesystem */ 75 if (!vfs_file_is_local (vpath)) 76 return (-1); 77 78 if (strcmp (vfs_path_as_str (vpath), PATH_SEP_STR) == 0) 79 { 80 errno = ENOTDIR; 81 return (-1); 82 } 83 84 q = vfs_path_append_new (vpath, "..", (char *) NULL); 85 result = my_mkdir_rec (q, mode); 86 vfs_path_free (q, TRUE); 87 88 if (result == 0) 89 result = mc_mkdir (vpath, mode); 90 91 return result; 92 } 93 94 /* --------------------------------------------------------------------------------------------- */ 95 /*** public functions ****************************************************************************/ 96 /* --------------------------------------------------------------------------------------------- */ 97 98 int 99 my_mkdir (const vfs_path_t *vpath, mode_t mode) /* */ 100 { 101 int result; 102 103 result = my_mkdir_rec (vpath, mode); 104 return result; 105 } 106 107 /* --------------------------------------------------------------------------------------------- */ 108 109 int 110 my_rmdir (const char *path) /* */ 111 { 112 int result; 113 vfs_path_t *vpath; 114 115 vpath = vfs_path_from_str_flags (path, VPF_NO_CANON); 116 /* FIXME: Should receive a Wtree! */ 117 result = mc_rmdir (vpath); 118 vfs_path_free (vpath, TRUE); 119 return result; 120 } 121 122 /* --------------------------------------------------------------------------------------------- */