root/src/filemanager/filenot.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. get_absolute_name
  2. my_mkdir_rec
  3. my_mkdir
  4. my_rmdir

   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 vfs_path_t *
  64 get_absolute_name (const vfs_path_t * vpath)
     /* [previous][next][first][last][top][bottom][index][help]  */
  65 {
  66     if (vpath == NULL)
  67         return NULL;
  68 
  69     if (IS_PATH_SEP (*vfs_path_get_by_index (vpath, 0)->path))
  70         return vfs_path_clone (vpath);
  71 
  72     return vfs_path_append_vpath_new (vfs_get_raw_current_dir (), vpath, NULL);
  73 }
  74 
  75 /* --------------------------------------------------------------------------------------------- */
  76 
  77 static int
  78 my_mkdir_rec (const vfs_path_t * vpath, mode_t mode)
     /* [previous][next][first][last][top][bottom][index][help]  */
  79 {
  80     vfs_path_t *q;
  81     int result;
  82 
  83     if (mc_mkdir (vpath, mode) == 0)
  84         return 0;
  85     if (errno != ENOENT)
  86         return (-1);
  87 
  88     /* FIXME: should check instead if vpath is at the root of that filesystem */
  89     if (!vfs_file_is_local (vpath))
  90         return (-1);
  91 
  92     if (strcmp (vfs_path_as_str (vpath), PATH_SEP_STR) == 0)
  93     {
  94         errno = ENOTDIR;
  95         return (-1);
  96     }
  97 
  98     q = vfs_path_append_new (vpath, "..", (char *) NULL);
  99     result = my_mkdir_rec (q, mode);
 100     vfs_path_free (q, TRUE);
 101 
 102     if (result == 0)
 103         result = mc_mkdir (vpath, mode);
 104 
 105     return result;
 106 }
 107 
 108 /* --------------------------------------------------------------------------------------------- */
 109 /*** public functions ****************************************************************************/
 110 /* --------------------------------------------------------------------------------------------- */
 111 
 112 int
 113 my_mkdir (const vfs_path_t * vpath, mode_t mode)
     /* [previous][next][first][last][top][bottom][index][help]  */
 114 {
 115     int result;
 116 
 117     result = my_mkdir_rec (vpath, mode);
 118     if (result == 0)
 119     {
 120         vfs_path_t *my_s;
 121 
 122         my_s = get_absolute_name (vpath);
 123         vfs_path_free (my_s, TRUE);
 124     }
 125     return result;
 126 }
 127 
 128 /* --------------------------------------------------------------------------------------------- */
 129 
 130 int
 131 my_rmdir (const char *path)
     /* [previous][next][first][last][top][bottom][index][help]  */
 132 {
 133     int result;
 134     vfs_path_t *vpath;
 135 
 136     vpath = vfs_path_from_str_flags (path, VPF_NO_CANON);
 137     /* FIXME: Should receive a Wtree! */
 138     result = mc_rmdir (vpath);
 139     if (result == 0)
 140     {
 141         vfs_path_t *my_s;
 142 
 143         my_s = get_absolute_name (vpath);
 144         vfs_path_free (my_s, TRUE);
 145     }
 146     vfs_path_free (vpath, TRUE);
 147     return result;
 148 }
 149 
 150 /* --------------------------------------------------------------------------------------------- */

/* [previous][next][first][last][top][bottom][index][help]  */