Listing 2: The full rm program
#include "apr_file_io.h"
#include "apr_file_info.h"
#include "apr_getopt.h"
#include "apr_lib.h"
#include "apr_pools.h"
#define STR_LEN 256
void showUsage(const char *argv0, apr_file_t *err) {
apr_file_printf(err, "%s [-fi] file_name" APR_EOL_STR, argv0);
exit(1);
}
int main(int argc, const char * const argv[])
{
apr_pool_t *pool;
apr_file_t *err = NULL;
apr_file_t *in = NULL;
apr_getopt_t *opt;
int prompt = TRUE;
char c;
const char *optarg;
apr_status_t rv;
apr_finfo_t finfo;
int numargs = 1;
apr_app_initialize(&argc, &argv, NULL);
atexit(apr_terminate);
apr_pool_create(&pool, NULL);
apr_file_open_stdin(&in, pool);
apr_file_open_stderr(&err, pool);
if (argc < 2) {
showUsage(argv[0], err);
}
apr_getopt_init(&opt, pool, argc, argv);
while ((rv = apr_getopt(opt, "fi", &c, &optarg)) == APR_SUCCESS) {
numargs++;
switch (c) {
case 'f':
prompt = FALSE;
break;
case 'i':
prompt = TRUE;
break;
}
}
if (APR_STATUS_IS_BADCH(rv)) {
showUsage(argv[0], err);
}
while (numargs < argc) {
numargs++;
apr_stat(&finfo, argv[numargs - 1], APR_FINFO_TYPE, pool);
if (finfo.filetype == APR_DIR) {
apr_file_printf(err, "Cannot delete directory %s"
APR_EOL_STR,
argv[numargs - 1]);
continue;
}
if (prompt == TRUE) {
char answer[2];
int numread = 2;
apr_file_printf(err, "%s: remove file '%s'? ",
argv[0], argv[numargs - 1]);
apr_file_read(in, answer, &numread);
if (apr_tolower(answer[0]) != 'y') {
continue;
}
}
apr_file_remove(argv[numargs - 1], pool);
}
apr_pool_destroy(pool);
}