void nx_expr_proc__xm_fileop_file_remove(nx_expr_eval_ctx_t *eval_ctx, nx_module_t *module, nx_expr_arg_list_t *args) { nx_expr_arg_t *arg; nx_value_t file; apr_status_t rv; apr_pool_t *pool = NULL; apr_dir_t *dir; nx_exception_t e; nx_string_t *dirname = NULL; nx_string_t *fname = NULL; char *filename; char *idx; int flags = 0; apr_finfo_t finfo; nx_expr_arg_t *older; nx_value_t olderval; apr_time_t older_time = 0LL; ASSERT(module != NULL); ASSERT(args != NULL); arg = NX_DLIST_FIRST(args); ASSERT(arg != NULL); ASSERT(arg->expr != NULL); nx_expr_evaluate(eval_ctx, &file, arg->expr); if ( file.defined != TRUE ) { throw_msg("'file' is undef"); } try { if ( file.type != NX_VALUE_TYPE_STRING ) { throw_msg("string type required for 'file'"); } older = NX_DLIST_NEXT(arg, link); if ( older != NULL ) { ASSERT(older->expr != NULL); nx_expr_evaluate(eval_ctx, &olderval, older->expr); if ( olderval.type != NX_VALUE_TYPE_DATETIME ) { nx_value_kill(&olderval); throw_msg("datetime type required for 'older'"); } if ( olderval.defined == TRUE ) { older_time = olderval.datetime; } } if ( apr_fnmatch_test(file.string->buf) != 0 ) { // we have wildcards, expand it pool = nx_pool_create_core(); filename = file.string->buf; idx = strrchr(filename, '/'); #ifndef WIN32 flags = APR_FNM_CASE_BLIND; if ( idx == NULL ) { idx = strrchr(filename, '\\'); } #endif if ( idx == NULL ) { dirname = nx_string_create("."NX_DIR_SEPARATOR, -1); } else { dirname = nx_string_create(filename, (int) (idx + 1 - filename)); filename = idx + 1; } CHECKERR_MSG(apr_dir_open(&dir, dirname->buf, pool), "failed to open directory: %s", dirname->buf); fname = nx_string_new(); while ( apr_dir_read(&finfo, APR_FINFO_NAME | APR_FINFO_TYPE | APR_FINFO_CTIME, dir) == APR_SUCCESS ) { if ( finfo.filetype == APR_REG ) { log_debug("checking '%s' against wildcard '%s':", finfo.name, filename); if ( apr_fnmatch(filename, finfo.name, flags) == APR_SUCCESS ) { nx_string_sprintf(fname, "%s%s", dirname->buf, finfo.name); if ( (older_time == 0) || ((older_time != 0) && (finfo.ctime < older_time)) ) { log_debug("'%s' matches wildcard '%s' and is 'older', removing", fname->buf, file.string->buf); log_info("removing file %s", fname->buf); rv = apr_file_remove(fname->buf, NULL); if ( APR_STATUS_IS_ENOENT(rv) ) { } else if ( rv == APR_SUCCESS ) { } else { log_aprerror(rv, "failed to remove file '%s'", fname->buf); } _reopen_logfile(fname->buf); } } } } nx_string_free(fname); apr_pool_destroy(pool); } else { CHECKERR_MSG(apr_file_remove(file.string->buf, NULL), "failed to remove file '%s'", file.string->buf); } } catch(e) { nx_value_kill(&file); if ( pool != NULL ) { apr_pool_destroy(pool); } if ( dirname != NULL ) { nx_string_free(dirname); } log_exception(e); } }
/* Deprecated */ APR_DECLARE(int) apr_is_fnmatch(const char *pattern) { return apr_fnmatch_test(pattern); }