Change dos_rmdir to only use 1 fnode. It now first checks if the directory

is empty and then opens the parent and deletes the real directory.
No longer returns DE_FILENOTFND(2), but return DE_PATHNOTFND(3) instead.


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1416 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2009-06-03 01:01:47 +00:00
parent 1569b6b920
commit 4a6e5677ad

View File

@ -482,8 +482,6 @@ COUNT dos_delete(BYTE * path, int attrib)
COUNT dos_rmdir(BYTE * path)
{
REG f_node_ptr fnp;
REG f_node_ptr fnp1;
BOOL found;
char fcbname[FNAME_SIZE + FEXT_SIZE];
/* prevent removal of the current directory of that drive */
@ -491,72 +489,51 @@ COUNT dos_rmdir(BYTE * path)
if (!fstrcmp(path, cdsp->cdsCurrentPath))
return DE_RMVCUDIR;
/* next, split the passed dir into components (i.e. - */
/* path to new directory and name of new directory */
if ((fnp = split_path(path, fcbname, &fnode[0])) == NULL)
{
return DE_PATHNOTFND;
}
/* Check that we're not trying to remove the root! */
if ((path[0] == '\\') && (path[1] == NULL))
if (path[2] == '\\' && path[3] == '\0')
return DE_ACCESS;
/* Verify name exists, and if so then ensure it refers */
/* to a directory and directory is empty. */
if (find_fname(fnp, fcbname, D_ALL))
/* Check that the directory is empty. Only the */
/* "." and ".." are permissable. */
fnp = dir_open(path, &fnode[0]);
if (fnp == NULL)
return DE_PATHNOTFND;
/* Directories may have attributes, but if other than 'archive' */
/* then do not allow (RDONLY|SYSTEM|HIDDEN) directory to be deleted. */
if (fnp->f_dir.dir_attrib & ~(D_DIR |D_ARCHIVE))
return DE_ACCESS;
dir_read(fnp);
/* 1st entry should be ".", else directory corrupt or not empty */
if (fnp->f_dir.dir_name[0] != '.' || fnp->f_dir.dir_name[1] != ' ')
return DE_ACCESS;
fnp->f_diroff++;
dir_read(fnp);
/* secondard entry should be ".." */
if (fnp->f_dir.dir_name[0] != '.' || fnp->f_dir.dir_name[1] != '.')
return DE_ACCESS;
/* Now search through the directory and make certain */
/* that there are no entries */
fnp->f_diroff++;
while (dir_read(fnp) == 1)
{
/* Check if it's really a directory, directories may
have attributes, but if other than 'archive' then do not
allow (RDONLY|SYSTEM|HIDDEN) directory to be deleted.
*/
if ( !(fnp->f_dir.dir_attrib & D_DIR) ||
(fnp->f_dir.dir_attrib & ~(D_DIR |D_ARCHIVE)) )
return DE_ACCESS;
/* Check that the directory is empty. Only the */
/* "." and ".." are permissable. */
fnp->f_flags &= ~F_DMOD;
fnp1 = dir_open(path, &fnode[1]);
if (fnp1 == NULL)
return DE_ACCESS;
dir_read(fnp1);
/* 1st entry should be ".", else directory corrupt or not empty */
if (fnp1->f_dir.dir_name[0] != '.' || fnp1->f_dir.dir_name[1] != ' ')
return DE_ACCESS;
fnp1->f_diroff++;
dir_read(fnp1);
/* secondard entry should be ".." */
if (fnp1->f_dir.dir_name[0] != '.' || fnp1->f_dir.dir_name[1] != '.')
return DE_ACCESS;
/* Now search through the directory and make certain */
/* that there are no entries. */
found = FALSE;
fnp1->f_diroff++;
while (dir_read(fnp1) == 1)
{
if (fnp1->f_dir.dir_name[0] == '\0')
break;
if (fnp1->f_dir.dir_name[0] != DELETED
&& fnp1->f_dir.dir_attrib != D_LFN)
{
found = TRUE;
break;
}
fnp1->f_diroff++;
}
/* If anything was found, exit with an error. */
if (found)
if (fnp->f_dir.dir_name[0] != DELETED && fnp->f_dir.dir_attrib != D_LFN)
return DE_ACCESS;
return delete_dir_entry(fnp);
fnp->f_diroff++;
}
else
/* No such file, return the error */
return DE_FILENOTFND;
/* next, split the passed dir into components (i.e. - */
/* path to new directory and name of new directory */
if ((fnp = split_path(path, fcbname, &fnode[0])) == NULL ||
!find_fname(fnp, fcbname, D_ALL))
/* this error should not happen because dir_open() succeeded above */
return DE_PATHNOTFND;
return delete_dir_entry(fnp);
}
COUNT dos_rename(BYTE * path1, BYTE * path2, int attrib)