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