apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "William A. Rowe, Jr." <ad...@rowe-clan.net>
Subject Re: [PATCH] apr_dir_remove_recursively
Date Tue, 22 May 2001 22:32:10 GMT
No, don't duplicate.  Please create a file_io/unix/fileutil.c source for
functions that are common to all platforms (since they are implemented
in terms of apr itself.)

Should do the trick.

Bill

----- Original Message ----- 
From: "Ben Collins-Sussman" <sussman@collab.net>
To: <dev@apr.apache.org>
Sent: Tuesday, May 22, 2001 8:44 AM
Subject: [PATCH] apr_dir_remove_recursively


> 
> OK, it's not actually a patch, because I'm not sure where it ought to
> live.  I've attached it below.
> 
> The function apr_dir_remove() won't work on a non-empty directory, so
> this routine fills the gap.  It's equivalent to 'rm -rf'.
> 
> This routine currently lives in a Subversion library.  I'd like to
> move it into apr_file_io.h, but I'm not sure where the actual code
> should live.  It's implemented using nothing but other apr file
> routines;  does this mean duplicating the code into file_io/unix,
> file_io/win32, file_io/os2?
> 
> ---------------
> 
> apr_status_t
> apr_dir_remove_recursively (const char *path, apr_pool_t *pool)
> {
>   apr_status_t status;
>   apr_dir_t *this_dir;
>   apr_finfo_t this_entry;
>   apr_pool_t *subpool;
>   apr_int32_t flags = APR_FINFO_TYPE | APR_FINFO_NAME;
> 
>   status = apr_pool_create (&subpool, pool);
>   if (! (APR_STATUS_IS_SUCCESS (status))) return status;
> 
>   status = apr_dir_open (&this_dir, path, subpool);
>   if (! (APR_STATUS_IS_SUCCESS (status))) return status;
> 
>   for (status = apr_dir_read (&this_entry, flags, this_dir);
>        APR_STATUS_IS_SUCCESS (status);
>        status = apr_dir_read (&this_entry, flags, this_dir))
>     {
>       char *fullpath = apr_pstrcat (subpool, path, "/", this_entry.name, NULL);
> 
>       if (this_entry.filetype == APR_DIR)
>         {
>           if ((strcmp (this_entry.name, ".") == 0)
>               || (strcmp (this_entry.name, "..") == 0))
>             continue;
> 
>           status = apr_dir_remove_recursively (fullpath, subpool);
>           if (! (APR_STATUS_IS_SUCCESS (status))) return status;
>         }
>       else if (this_entry.filetype == APR_REG)
>         {
>           status = apr_file_remove (fullpath, subpool);
>           if (! (APR_STATUS_IS_SUCCESS (status))) return status;
>         }
>     }
> 
>   if (! (APR_STATUS_IS_ENOENT (status)))
>     return status;
> 
>   else
>     {
>       status = apr_dir_close (this_dir);
>       if (! (APR_STATUS_IS_SUCCESS (status))) return status;
>     }
> 
>   status = apr_dir_remove (path, subpool);
>   if (! (APR_STATUS_IS_SUCCESS (status))) return status;
> 
>   apr_pool_destroy (subpool);
> 
>   return APR_SUCCESS;
> }
> 


Mime
View raw message