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); }