Changeset 8ec7abb in rtems


Ignore:
Timestamp:
Mar 4, 2010, 6:36:51 AM (10 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
a16a7949
Parents:
3fc1c8db
Message:

010-03-04 Chris Johns <chrisj@…>

  • libcsupport/include/rtems/libio.h, libcsupport/src/_rename_r.c: Add a rename file op and have rename use it.
  • libfs/Makefile.am, libfs/src/dosfs/msdos_rename.c, libfs/src/imfs/imfs_rename.c: New files to support the rename file op.
  • libfs/src/imfs/imfs.h: Add rename interface.
  • libfs/src/imfs/imfs_init.c: Add rename handler.
  • libfs/src/imfs/miniimfs_init.c: Fix up ops struct.
  • libfs/src/dosfs/msdos.h: Add msdos_rename and remove msdos_file_link.
  • libfs/src/dosfs/msdos_create.c: Remove the link call.
  • libfs/src/dosfs/msdos_eval.c: Fix a path parsing bug.
  • libfs/src/dosfs/msdos_init.c: Add rename handler and clean up the struct naming.
  • libfs/src/rfs/rtems-rfs-link.c, libfs/src/rfs/rtems-rfs-link.h: Change the link call to allow linking of directories if told to and change the unlink to handle unlink directories that are not empty so rename can be supported.
  • libfs/src/rfs/rtems-rfs-rtems-dir.c: Fix the link/unlink calls.
  • libfs/src/rfs/rtems-rfs-rtems.c: Add a rename handler. Fix the link/unlink calls.
  • libfs/src/dosfs/msdos_dir.c, libfs/src/dosfs/msdos_format.c, libfs/src/dosfs/msdos_misc.c, httpd/asp.c, libfs/src/nfsclient/src/nfs.c: Work around a newlib warning when using the is*() family of calls.
Location:
cpukit
Files:
2 added
20 edited

Legend:

Unmodified
Added
Removed
  • cpukit/ChangeLog

    r3fc1c8db r8ec7abb  
     12010-03-04      Chris Johns <chrisj@rtems.org>
     2
     3        * libcsupport/include/rtems/libio.h, libcsupport/src/_rename_r.c:
     4        Add a rename file op and have rename use it.
     5
     6        * libfs/Makefile.am, libfs/src/dosfs/msdos_rename.c,
     7        libfs/src/imfs/imfs_rename.c: New files to support the rename file
     8        op.
     9
     10        * libfs/src/imfs/imfs.h: Add rename interface.
     11
     12        * libfs/src/imfs/imfs_init.c: Add rename handler.
     13
     14        * libfs/src/imfs/miniimfs_init.c: Fix up ops struct.
     15       
     16        * libfs/src/dosfs/msdos.h: Add msdos_rename and remove
     17        msdos_file_link.
     18
     19        * libfs/src/dosfs/msdos_create.c: Remove the link call.
     20       
     21        * libfs/src/dosfs/msdos_eval.c: Fix a path parsing bug.
     22
     23        * libfs/src/dosfs/msdos_init.c: Add rename handler and clean up
     24        the struct naming.
     25
     26        * libfs/src/rfs/rtems-rfs-link.c, libfs/src/rfs/rtems-rfs-link.h:
     27        Change the link call to allow linking of directories if told to
     28        and change the unlink to handle unlink directories that are not
     29        empty so rename can be supported.
     30
     31        * libfs/src/rfs/rtems-rfs-rtems-dir.c: Fix the link/unlink calls.
     32
     33        * libfs/src/rfs/rtems-rfs-rtems.c: Add a rename handler. Fix the
     34        link/unlink calls.
     35       
     36        * libfs/src/dosfs/msdos_dir.c, libfs/src/dosfs/msdos_format.c,
     37        libfs/src/dosfs/msdos_misc.c, httpd/asp.c,
     38        libfs/src/nfsclient/src/nfs.c: Work around a newlib warning when
     39        using the is*() family of calls.
     40
    1412010-03-01      Chris Johns <chrisj@rtems.org>
    242
  • cpukit/httpd/asp.c

    r3fc1c8db r8ec7abb  
    288288        s1 = skipWhite(s1);
    289289        len = gstrlen(s2);
    290         for (len = gstrlen(s2); len > 0 && (tolower(*s1) == tolower(*s2)); len--) {
     290        for (len = gstrlen(s2); len > 0 && (tolower((int)*s1) == tolower((int)*s2)); len--) {
    291291                if (*s2 == '\0') {
    292292                        return s1;
     
    313313                return s;
    314314        }
    315         while (*s && gisspace(*s)) {
     315        while (*s && gisspace((int)*s)) {
    316316                s++;
    317317        }
  • cpukit/libcsupport/include/rtems/libio.h

    r3fc1c8db r8ec7abb  
    250250 char                              *buf,     /* OUT */
    251251 size_t                            bufsize
     252);
     253
     254typedef int (*rtems_filesystem_rename_t)(
     255 rtems_filesystem_location_info_t  *old_parent_loc,  /* IN */
     256 rtems_filesystem_location_info_t  *old_loc,         /* IN */
     257 rtems_filesystem_location_info_t  *new_parent_loc,  /* IN */
     258 const char                        *name             /* IN */
    252259);
    253260
     
    281288    rtems_filesystem_symlink_t       symlink_h;
    282289    rtems_filesystem_readlink_t      readlink_h;
     290    rtems_filesystem_rename_t        rename_h;
    283291    rtems_filesystem_statvfs_t       statvfs_h;
    284292};
  • cpukit/libcsupport/src/_rename_r.c

    r3fc1c8db r8ec7abb  
    2121#include <unistd.h>
    2222
    23 #include <reent.h>
     23#include <rtems/libio_.h>
     24#include <rtems/seterr.h>
    2425
    2526int _rename_r(
     
    2930)
    3031{
     32  int                                 old_parent_pathlen;
     33  rtems_filesystem_location_info_t    old_loc;
     34  rtems_filesystem_location_info_t    old_parent_loc;
     35  rtems_filesystem_location_info_t    new_parent_loc;
     36  int                                 i;
     37  int                                 result;
     38  const char                         *name;
     39  bool                                free_old_parentloc = false;
     40
     41  /*
     42   *  Get the parent node of the old path to be renamed. Find the parent path.
     43   */
     44
     45  old_parent_pathlen = rtems_filesystem_dirname ( old );
     46
     47  if ( old_parent_pathlen == 0 )
     48    rtems_filesystem_get_start_loc( old, &i, &old_parent_loc );
     49  else {
     50    result = rtems_filesystem_evaluate_path( old, old_parent_pathlen,
     51                                             RTEMS_LIBIO_PERMS_WRITE,
     52                                             &old_parent_loc,
     53                                             false );
     54    if ( result != 0 )
     55      return -1;
     56
     57    free_old_parentloc = true;
     58  }
     59
     60  /*
     61   * Start from the parent to find the node that should be under it.
     62   */
     63
     64  old_loc = old_parent_loc;
     65  name = old + old_parent_pathlen;
     66  name += rtems_filesystem_prefix_separators( name, strlen( name ) );
     67
     68  result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
     69                                                    0, &old_loc, false );
     70  if ( result != 0 ) {
     71    if ( free_old_parentloc )
     72      rtems_filesystem_freenode( &old_parent_loc );
     73    rtems_set_errno_and_return_minus_one( result );
     74  }
     75 
     76  /*
     77   * Get the parent of the new node we are renaming to.
     78   */
     79
     80  rtems_filesystem_get_start_loc( new, &i, &new_parent_loc );
     81
     82  if ( !new_parent_loc.ops->evalformake_h ) {
     83    if ( free_old_parentloc )
     84      rtems_filesystem_freenode( &old_parent_loc );
     85    rtems_filesystem_freenode( &old_loc );
     86    rtems_set_errno_and_return_minus_one( ENOTSUP );
     87  }
     88
     89  result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name );
     90  if ( result != 0 ) {
     91    rtems_filesystem_freenode( &new_parent_loc );
     92    if ( free_old_parentloc )
     93      rtems_filesystem_freenode( &old_parent_loc );
     94    rtems_filesystem_freenode( &old_loc );
     95    rtems_set_errno_and_return_minus_one( result );
     96  }
     97
     98  /*
     99   *  Check to see if the caller is trying to rename across file system
     100   *  boundaries.
     101   */
     102
     103  if ( old_parent_loc.mt_entry != new_parent_loc.mt_entry ) {
     104    rtems_filesystem_freenode( &new_parent_loc );
     105    if ( free_old_parentloc )
     106      rtems_filesystem_freenode( &old_parent_loc );
     107    rtems_filesystem_freenode( &old_loc );
     108    rtems_set_errno_and_return_minus_one( EXDEV );
     109  }
     110
     111  if ( !new_parent_loc.ops->rename_h ) {
     112    rtems_filesystem_freenode( &new_parent_loc );
     113    if ( free_old_parentloc )
     114      rtems_filesystem_freenode( &old_parent_loc );
     115    rtems_filesystem_freenode( &old_loc );
     116    rtems_set_errno_and_return_minus_one( ENOTSUP );
     117  }
     118
     119  result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name );
     120
     121  rtems_filesystem_freenode( &new_parent_loc );
     122  if ( free_old_parentloc )
     123    rtems_filesystem_freenode( &old_parent_loc );
     124  rtems_filesystem_freenode( &old_loc );
     125
     126  return result;
     127}
     128
     129#if 0
    31130  struct stat sb;
    32131  int s;
     
    39138    return s;
    40139  return S_ISDIR(sb.st_mode) ? rmdir( old ) : unlink( old );
    41 }
    42140#endif
     141                                           
     142#endif
  • cpukit/libfs/Makefile.am

    r3fc1c8db r8ec7abb  
    3232    src/imfs/imfs_readlink.c src/imfs/imfs_fdatasync.c src/imfs/imfs_fcntl.c \
    3333    src/imfs/ioman.c src/imfs/miniimfs_init.c src/imfs/imfs_load_tar.c \
    34     src/imfs/imfs.h \
     34    src/imfs/imfs_rename.c src/imfs/imfs.h \
    3535    src/imfs/deviceerrno.c \
    3636    src/devfs/devfs_init.c src/devfs/devfs_eval.c src/devfs/devfs_mknod.c \
     
    6060    src/dosfs/msdos_mknod.c src/dosfs/msdos_node_type.c \
    6161    src/dosfs/msdos_conv.c src/dosfs/msdos.h src/dosfs/msdos_format.c \
    62     src/dosfs/dosfs.h
     62    src/dosfs/dosfs.h src/dosfs/msdos_rename.c
    6363endif
    6464
  • cpukit/libfs/src/dosfs/msdos.h

    r3fc1c8db r8ec7abb  
    260260);
    261261
     262int msdos_rename(rtems_filesystem_location_info_t  *old_parent_loc,
     263                 rtems_filesystem_location_info_t  *old_loc,
     264                 rtems_filesystem_location_info_t  *new_parent_loc,
     265                 const char                        *new_name);
     266
    262267int msdos_initialize_support(
    263268  rtems_filesystem_mount_table_entry_t    *temp_mt_entry,
     
    323328int msdos_file_rmnod(rtems_filesystem_location_info_t *parent_pathloc, /* IN */
    324329                     rtems_filesystem_location_info_t *pathloc /* IN */);
    325 
    326 int msdos_file_link(
    327   rtems_filesystem_location_info_t *to_loc,
    328   rtems_filesystem_location_info_t *pa_loc,
    329   const char                       *token
    330 );
    331330
    332331int msdos_dir_open(
  • cpukit/libfs/src/dosfs/msdos_create.c

    r3fc1c8db r8ec7abb  
    268268    return rc;
    269269}
    270 
    271 /* msdos_file_link --
    272  *     Replacement for a file "link" operation.
    273  *     MSDOS FAT FS does not support links, but this call is needed to
    274  *     allow "rename" operations. The current NEWLIB rename performs a link
    275  *     from the old to the new name and then deletes the old filename.
    276  *
    277  *     This pseudo-"link" operation will create a new directory entry,
    278  *     copy the file size and cluster information from the "old"
    279  *     to the "new" directory entry and then clear the file size and cluster
    280  *     info from the "old" filename, leaving this file as
    281  *     a valid, but empty entry.
    282  *
    283  *     When this "link" call is part of a "rename" sequence, the "old"
    284  *     entry will be deleted in a subsequent "rmnod" call
    285  *
    286  *     This function has been implemented by Thomas Doerfler,
    287  *     <Thomas.Doerfler@imd-systems.de>
    288  *
    289  * PARAMETERS:
    290  *     to_loc     - node description for "existing" node
    291  *     par_loc    - node description for "new" node
    292  *     token      - name of new node
    293  *
    294  * RETURNS:
    295  *     RC_OK on success, or -1 if error occured (errno set appropriately)
    296  */
    297 int
    298 msdos_file_link(rtems_filesystem_location_info_t *to_loc,
    299                 rtems_filesystem_location_info_t *par_loc,
    300                 const char                       *name
    301 )
    302 {
    303     int                rc = RC_OK;
    304     rtems_status_code  sc = RTEMS_SUCCESSFUL;
    305     msdos_fs_info_t   *fs_info     = to_loc->mt_entry->fs_info;
    306     fat_file_fd_t     *to_fat_fd   = to_loc->node_access;
    307     const char        *token;
    308     int                len;
    309 
    310     /*
    311      * check spelling and format new node name
    312      */
    313     if (MSDOS_NAME != msdos_get_token(name, strlen(name), &token, &len)) {
    314       rtems_set_errno_and_return_minus_one(ENAMETOOLONG);
    315     }
    316     /*
    317      * verify, that the existing node can be linked to
    318      * check that nodes are in same FS/volume?
    319      */
    320     if (to_loc->mt_entry->fs_info != par_loc->mt_entry->fs_info) {
    321       rtems_set_errno_and_return_minus_one(EXDEV);
    322     }
    323     /*
    324      * lock volume
    325      */
    326     sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
    327                                 MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
    328     if (sc != RTEMS_SUCCESSFUL)
    329         rtems_set_errno_and_return_minus_one(EIO);
    330 
    331 
    332     /*
    333      * create new directory entry as "hard link",
    334      * copying relevant info from existing file
    335      */
    336     rc = msdos_creat_node(par_loc,MSDOS_HARD_LINK,name,len,S_IFREG,
    337                           to_loc->node_access);
    338     /*
    339      * set file size and first cluster number of old entry to 0
    340      */
    341     if (rc == RC_OK) {
    342       to_fat_fd->fat_file_size = 0;
    343       to_fat_fd->cln           = FAT_EOF;
    344       rc = msdos_set_first_cluster_num(to_loc->mt_entry, to_fat_fd);
    345       if (rc == RC_OK) {
    346           rc = msdos_set_file_size(par_loc->mt_entry, to_fat_fd);
    347       }
    348     }
    349     /*
    350      * FIXME: check error/abort handling
    351      */
    352     rtems_semaphore_release(fs_info->vol_sema);
    353     return rc;
    354 }
  • cpukit/libfs/src/dosfs/msdos_dir.c

    r3fc1c8db r8ec7abb  
    147147  len = i;
    148148  while (i-- > 0) {
    149     *dst++ = tolower(*src_tmp++);
     149    *dst++ = tolower((int)(*src_tmp++));
    150150  }
    151151  /*
     
    166166    src_tmp = src + MSDOS_SHORT_BASE_LEN;
    167167    while (i-- > 0) {
    168       *dst++ = tolower(*src_tmp++);
     168      *dst++ = tolower((int)(*src_tmp++));
    169169      len++;
    170170    }
  • cpukit/libfs/src/dosfs/msdos_eval.c

    r3fc1c8db r8ec7abb  
    109109    {
    110110        type = msdos_get_token(&pathname[i], pathnamelen, &token, &token_len);
    111         pathnamelen += token_len;
     111        pathnamelen -= token_len;
    112112        i += token_len;
    113113
     
    153153                        rtems_semaphore_release(fs_info->vol_sema);
    154154                        return (*pathloc->ops->evalpath_h)(&(pathname[i-token_len]),
    155                                                            pathnamelen - token_len,
     155                                                           pathnamelen + token_len,
    156156                                                           flags, pathloc);
    157157                    }
  • cpukit/libfs/src/dosfs/msdos_format.c

    r3fc1c8db r8ec7abb  
    649649         cnt < (sizeof(fmt_params->OEMName)-1);
    650650         cnt++) {
    651       if (isprint(*from)) {
     651      if (isprint((int)*from)) {
    652652        *to++ = *from++;
    653653      }
     
    680680         cnt < (sizeof(fmt_params->VolLabel)-1);
    681681         cnt++) {
    682       if (isprint(*from)) {
     682      if (isprint((int)*from)) {
    683683        *to++ = *from++;
    684684      }
  • cpukit/libfs/src/dosfs/msdos_init.c

    r3fc1c8db r8ec7abb  
    2020
    2121const rtems_filesystem_operations_table  msdos_ops = {
    22     msdos_eval_path,
    23     msdos_eval4make,
    24 #if 0
    25      NULL,                 /* msdos_link */
    26 #else
    27     msdos_file_link,      /* msdos_link (pseudo-functionality) */
    28 #endif
    29     msdos_file_rmnod,
    30     msdos_node_type,
    31     msdos_mknod,
    32     NULL,                 /* msdos_chown */
    33     msdos_free_node_info,
    34     NULL,
    35     msdos_initialize,
    36     NULL,
    37     msdos_shut_down,      /* msdos_shut_down */
    38     NULL,                 /* msdos_utime */
    39     NULL,
    40     NULL,
    41     NULL,
    42     NULL
     22  .evalpath_h     =  msdos_eval_path,
     23  .evalformake_h  =  msdos_eval4make,
     24  .link_h         =  NULL,
     25  .unlink_h       =  msdos_file_rmnod,
     26  .node_type_h    =  msdos_node_type,
     27  .mknod_h        =  msdos_mknod,
     28  .chown_h        =  NULL,
     29  .freenod_h      =  msdos_free_node_info,
     30  .mount_h        =  NULL,
     31  .fsmount_me_h   =  msdos_initialize,
     32  .unmount_h      =  NULL,
     33  .fsunmount_me_h =  msdos_shut_down,
     34  .utime_h        =  NULL,
     35  .eval_link_h    =  NULL,
     36  .symlink_h      =  NULL,
     37  .readlink_h     =  NULL,
     38  .rename_h       =  msdos_rename,
     39  .statvfs_h      =  NULL
    4340};
    4441
  • cpukit/libfs/src/dosfs/msdos_misc.c

    r3fc1c8db r8ec7abb  
    6666        return MSDOS_NAME_LONG;
    6767
    68     if ((ch == '.') || isalnum(ch) ||
     68    if ((ch == '.') || isalnum((int)ch) ||
    6969        (strchr("$%'-_@~`!(){}^#&", ch) != NULL))
    7070        return MSDOS_NAME_SHORT;
  • cpukit/libfs/src/imfs/imfs.h

    r3fc1c8db r8ec7abb  
    530530);
    531531
     532extern int IMFS_rename(
     533  rtems_filesystem_location_info_t  *old_loc,         /* IN */
     534  rtems_filesystem_location_info_t  *old_parent_loc,  /* IN */
     535  rtems_filesystem_location_info_t  *new_parent_loc,  /* IN */
     536  const char                        *new_name         /* IN */
     537);
     538
    532539extern int IMFS_fdatasync(
    533540  rtems_libio_t *iop
  • cpukit/libfs/src/imfs/imfs_init.c

    r3fc1c8db r8ec7abb  
    5151  IMFS_symlink,
    5252  IMFS_readlink,
     53  IMFS_rename,
    5354  NULL
    5455};
  • cpukit/libfs/src/imfs/miniimfs_init.c

    r3fc1c8db r8ec7abb  
    5050  NULL, /* XXX IMFS_evaluate_link, */
    5151  NULL, /* XXX IMFS_symlink, */
    52   NULL  /* XXX IMFS_readlink */
     52  NULL, /* XXX IMFS_readlink */
     53  NULL, /* XXX IMFS_rename */
     54  NULL  /* XXX IMFS_statvfs */
    5355};
    5456
  • cpukit/libfs/src/nfsclient/src/nfs.c

    r3fc1c8db r8ec7abb  
    32633263        }
    32643264
    3265         if (isdigit(*host)) {
     3265        if (isdigit((int)*host)) {
    32663266                /* avoid using gethostbyname */
    32673267                sprintf(dev,"%s:%s",uidhost,path);
  • cpukit/libfs/src/rfs/rtems-rfs-link.c

    r3fc1c8db r8ec7abb  
    2525#include <rtems/rfs/rtems-rfs-dir.h>
    2626#include <rtems/rfs/rtems-rfs-dir-hash.h>
     27#include <rtems/rfs/rtems-rfs-link.h>
    2728
    2829int
     
    3132                int                    length,
    3233                rtems_rfs_ino          parent,
    33                 rtems_rfs_ino          target)
     34                rtems_rfs_ino          target,
     35                bool                   link_dir)
    3436{
    3537  rtems_rfs_inode_handle parent_inode;
     
    5153    return rc;
    5254
    53   if (S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)))
     55  /*
     56   * If the target inode is a directory and we cannot link directories
     57   * return a not supported error code.
     58   */
     59  if (!link_dir && S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)))
    5460  {
    5561    rtems_rfs_inode_close (fs, &target_inode);
     
    100106                  rtems_rfs_ino          target,
    101107                  uint32_t               doff,
    102                   bool                   dir)
     108                  rtems_rfs_unlink_dir   dir_mode)
    103109{
    104110  rtems_rfs_inode_handle parent_inode;
    105111  rtems_rfs_inode_handle target_inode;
    106112  uint16_t               links;
     113  bool                   dir;
    107114  int                    rc;
    108115
     
    113120  if (rc)
    114121    return rc;
    115 
     122 
     123  /*
     124   * If a directory process the unlink mode.
     125   */
     126 
     127  dir = RTEMS_RFS_S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)); 
    116128  if (dir)
    117129  {
    118     rc = rtems_rfs_dir_empty (fs, &target_inode);
    119     if (rc > 0)
    120     {
    121       if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
    122         printf ("rtems-rfs: dir-empty: %d: %s\n", rc, strerror (rc));
    123       rtems_rfs_inode_close (fs, &target_inode);
    124       return rc;
    125     }
    126   }
    127   else
    128   {
    129     /*
    130      * Directories not allowed and the target is a directory.
    131      */
    132     if (RTEMS_RFS_S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)))
    133     {
    134       if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
    135         printf ("rtems-rfs: link is a directory\n");
    136       rtems_rfs_inode_close (fs, &target_inode);
    137       return EISDIR;
     130    switch (dir_mode)
     131    {
     132      case rtems_rfs_unlink_dir_denied:
     133        if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
     134          printf ("rtems-rfs: link is a directory\n");
     135        rtems_rfs_inode_close (fs, &target_inode);
     136        return EISDIR;
     137
     138      case rtems_rfs_unlink_dir_if_empty:
     139        rc = rtems_rfs_dir_empty (fs, &target_inode);
     140        if (rc > 0)
     141        {
     142          if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
     143            printf ("rtems-rfs: dir-empty: %d: %s\n", rc, strerror (rc));
     144          rtems_rfs_inode_close (fs, &target_inode);
     145          return rc;
     146        }
     147        break;
     148
     149      default:
     150        break;
    138151    }
    139152  }
  • cpukit/libfs/src/rfs/rtems-rfs-link.h

    r3fc1c8db r8ec7abb  
    2727
    2828/**
    29  * Create a link.
     29 * Directory unlink modes.
     30 */
     31typedef enum rtems_rfs_unlink_dir_e
     32{
     33  rtems_rfs_unlink_dir_denied,   /**< Not allowed to unlink a directory. */
     34  rtems_rfs_unlink_dir_if_empty, /**< Unlink if the directory is empty. */
     35  rtems_rfs_unlink_dir_allowed   /**< Unlinking of directories is allowed. */
     36} rtems_rfs_unlink_dir;
     37
     38/**
     39 * Create a link. Do not link directories unless renaming or you will create
     40 * loops in the file system.
    3041 *
    3142 * @param fs The file system.
     
    3445 * @param parent The inode number of the parent directory.
    3546 * @param target The inode of the target.
     47 * @param link_dir If true directories can be linked. Useful when renaming.
    3648 * @return int The error number (errno). No error if 0.
    3749 */
     
    4052                    int                    length,
    4153                    rtems_rfs_ino          parent,
    42                     rtems_rfs_ino          target);
     54                    rtems_rfs_ino          target,
     55                    bool                   link_dir);
    4356
    4457/**
     
    5164 * @param target The inode of the target.
    5265 * @param doff Parent directory entry offset for the target entry.
    53  * @param dir If true unlinking of directory nodes is allowed.
     66 * @param dir_mode Directory unlink mode.
    5467 * @return int The error number (errno). No error if 0.
    5568 */
     
    5871                      rtems_rfs_ino          target,
    5972                      uint32_t               doff,
    60                       bool                   dir);
     73                      rtems_rfs_unlink_dir   dir_mode);
    6174
    6275/**
  • cpukit/libfs/src/rfs/rtems-rfs-rtems-dir.c

    r3fc1c8db r8ec7abb  
    206206  rtems_rfs_rtems_lock (fs);
    207207 
    208   rc = rtems_rfs_unlink (fs, parent, ino, doff, true);
     208  rc = rtems_rfs_unlink (fs, parent, ino, doff, rtems_rfs_unlink_dir_if_empty);
    209209  if (rc)
    210210  {
  • cpukit/libfs/src/rfs/rtems-rfs-rtems.c

    r3fc1c8db r8ec7abb  
    479479  rtems_rfs_rtems_lock (fs);
    480480 
    481   rc = rtems_rfs_link (fs, name, strlen (name), parent, target);
     481  rc = rtems_rfs_link (fs, name, strlen (name), parent, target, false);
    482482  if (rc)
    483483  {
     
    515515           parent, doff, ino);
    516516 
    517   rc = rtems_rfs_unlink (fs, parent, ino, doff, false);
     517  rc = rtems_rfs_unlink (fs, parent, ino, doff, rtems_rfs_unlink_dir_denied);
    518518  if (rc)
    519519  {
     
    10441044 * @param parent_pathloc
    10451045 * @param pathloc
     1046 * @return int
    10461047 */
    10471048int
     
    10611062  rtems_rfs_rtems_lock (fs);
    10621063 
    1063   rc = rtems_rfs_unlink (fs, parent, ino, doff, false);
     1064  rc = rtems_rfs_unlink (fs, parent, ino, doff, rtems_rfs_unlink_dir_denied);
    10641065  if (rc)
    10651066  {
     
    10771078 *
    10781079 * @param iop
     1080 * @return int
    10791081 */
    10801082int
     
    10861088  if (rc)
    10871089    return rtems_rfs_rtems_error ("fdatasync: sync", rc);
     1090
     1091  return 0;
     1092}
     1093
     1094/**
     1095 * Rename the node.
     1096 *
     1097 * @param old_parent_loc The old name's parent location.
     1098 * @param old_loc The old name's location.
     1099 * @param new_parent_loc The new name's parent location.
     1100 * @param new_name The new name.
     1101 * @return int
     1102 */
     1103int
     1104rtems_rfs_rtems_rename(rtems_filesystem_location_info_t* old_parent_loc,
     1105                       rtems_filesystem_location_info_t* old_loc,
     1106                       rtems_filesystem_location_info_t* new_parent_loc,
     1107                       const char*                       new_name)
     1108{
     1109  rtems_rfs_file_system*  fs = rtems_rfs_rtems_pathloc_dev (old_loc);
     1110  rtems_rfs_ino           old_parent;
     1111  rtems_rfs_ino           new_parent;
     1112  rtems_rfs_ino           ino;
     1113  uint32_t                doff;
     1114  int                     rc;
     1115 
     1116  old_parent = rtems_rfs_rtems_get_pathloc_ino (old_parent_loc);
     1117  new_parent = rtems_rfs_rtems_get_pathloc_ino (new_parent_loc);
     1118
     1119  ino  = rtems_rfs_rtems_get_pathloc_ino (old_loc);
     1120  doff = rtems_rfs_rtems_get_pathloc_doff (old_loc);
     1121
     1122  if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_RENAME))
     1123    printf ("rtems-rfs: rename: ino:%ld doff:%lu, new parent:%ld new name:%s\n",
     1124            ino, doff, new_parent, new_name);
     1125
     1126  rtems_rfs_rtems_lock (fs);
     1127
     1128  /*
     1129   * Link to the inode before unlinking so the inode is not erased when
     1130   * unlinked.
     1131   */
     1132  rc = rtems_rfs_link (fs, new_name, strlen (new_name), new_parent, ino, true);
     1133  if (rc)
     1134  {
     1135    rtems_rfs_rtems_unlock (fs);
     1136    return rtems_rfs_rtems_error ("rename: linking", rc);
     1137  }
     1138 
     1139  /*
     1140   * Unlink all inodes even directories with the dir option as false because a
     1141   * directory may not be empty.
     1142   */
     1143  rc = rtems_rfs_unlink (fs, old_parent, ino, doff,
     1144                         rtems_rfs_unlink_dir_allowed);
     1145  if (rc)
     1146  {
     1147    rtems_rfs_rtems_unlock (fs);
     1148    return rtems_rfs_rtems_error ("rename: unlinking", rc);
     1149  }
     1150
     1151  rtems_rfs_rtems_unlock (fs);
    10881152
    10891153  return 0;
     
    11511215
    11521216/**
    1153  *  RFS file system operations table
     1217 * RFS file system operations table.
    11541218 */
    11551219const rtems_filesystem_operations_table rtems_rfs_ops =
     
    11711235  .symlink_h      = rtems_rfs_rtems_symlink,
    11721236  .readlink_h     = rtems_rfs_rtems_readlink,
     1237  .rename_h       = rtems_rfs_rtems_rename,
    11731238  .statvfs_h      = rtems_rfs_rtems_statvfs
    11741239};
Note: See TracChangeset for help on using the changeset viewer.