diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-12-22 16:28:39 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-12-22 16:28:39 +0100 |
commit | dba326f60e159697a740f08959d098e19c200453 (patch) | |
tree | 987b3a4f7b4f28dcf52ec0cb199a5992e5ea5e64 /src | |
parent | 639ebf76098f56ce33d9b774acc11f4a8e60be3d (diff) | |
download | abrt-dba326f60e159697a740f08959d098e19c200453.tar.gz abrt-dba326f60e159697a740f08959d098e19c200453.tar.xz abrt-dba326f60e159697a740f08959d098e19c200453.zip |
extend run_event() to run_event_on_dir_name() and run_event_on_crash_data()
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/applet/test_report.c | 4 | ||||
-rw-r--r-- | src/daemon/MiddleWare.cpp | 12 | ||||
-rw-r--r-- | src/daemon/abrt-handle-crashdump.c | 2 | ||||
-rw-r--r-- | src/include/report/crash_data.h | 10 | ||||
-rw-r--r-- | src/include/report/run_event.h | 5 | ||||
-rw-r--r-- | src/lib/crash_data.c | 10 | ||||
-rw-r--r-- | src/lib/create_dump_dir.c | 2 | ||||
-rw-r--r-- | src/lib/run_event.c | 21 | ||||
-rw-r--r-- | src/plugins/abrt-action-bugzilla.cpp | 2 | ||||
-rw-r--r-- | src/plugins/abrt-action-kerneloops.c | 2 | ||||
-rw-r--r-- | src/plugins/abrt-action-mailx.c | 2 | ||||
-rw-r--r-- | src/plugins/abrt-action-print.c | 2 | ||||
-rw-r--r-- | src/plugins/abrt-action-rhtsupport.c | 2 | ||||
-rw-r--r-- | src/report-python/__init__.py | 9 | ||||
-rw-r--r-- | src/report-python/common.h | 9 | ||||
-rw-r--r-- | src/report-python/crash_data.c | 19 | ||||
-rw-r--r-- | src/report-python/dump_dir.c | 1 | ||||
-rw-r--r-- | src/report-python/reportmodule.c | 10 | ||||
-rw-r--r-- | src/report-python/run_event.c | 29 | ||||
-rwxr-xr-x | src/report-python/test_full | 2 | ||||
-rwxr-xr-x | src/report-python/test_full2 | 17 | ||||
-rwxr-xr-x | src/report-python/test_run_event_state1 | 4 |
22 files changed, 119 insertions, 57 deletions
diff --git a/src/applet/test_report.c b/src/applet/test_report.c index 2b3da020..80cf3c73 100644 --- a/src/applet/test_report.c +++ b/src/applet/test_report.c @@ -39,7 +39,7 @@ int main(int argc, char** argv) add_to_crash_data(crash_data, "analyzer", "wow"); const char *event = "report"; - struct dump_dir *dd = create_dump_dir(crash_data, "/tmp"); + struct dump_dir *dd = create_dump_dir_from_crash_data(crash_data, "/tmp"); free_crash_data(crash_data); if (!dd) return 1; @@ -50,7 +50,7 @@ int main(int argc, char** argv) struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log; - int r = run_event(run_state, dir_name, event); + int r = run_event_on_dir_name(run_state, dir_name, event); if (r == -1) printf("No actions are found for event '%s'\n", event); free_run_event_state(run_state); diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp index 655bda3a..ff2e1a2a 100644 --- a/src/daemon/MiddleWare.cpp +++ b/src/daemon/MiddleWare.cpp @@ -79,7 +79,7 @@ static crash_data_t *DebugDumpToCrashReport(const char *dump_dir_name) v++; } - crash_data_t *crash_data = load_crash_data_from_dump_dir(dd); + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); char *events = list_possible_events(dd, NULL, ""); dd_close(dd); @@ -154,7 +154,7 @@ static mw_result_t CreateCrashReport(const char *dump_dir_name, run_state = new_run_event_state(); run_state->logging_callback = do_log_and_update_client; - res = run_event(run_state, dump_dir_name, force ? "reanalyze" : "analyze"); + res = run_event_on_dir_name(run_state, dump_dir_name, force ? "reanalyze" : "analyze"); free_run_event_state(run_state); if (res != 0 && res != -1) /* -1 is "nothing was done", here it is ok */ { @@ -162,7 +162,7 @@ static mw_result_t CreateCrashReport(const char *dump_dir_name, goto ret; } - /* Do a load_crash_data_from_dump_dir from (possibly updated) + /* Do a create_crash_data_from_dump_dir from (possibly updated) * crash dump dir */ *crash_data = DebugDumpToCrashReport(dump_dir_name); @@ -336,7 +336,7 @@ report_status_t Report(crash_data_t *client_report, std::string event = events[i]; l_state.last_line = NULL; - int r = run_event(run_state, dump_dir_name, event.c_str()); + int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == -1) { l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str()); @@ -507,7 +507,7 @@ mw_result_t LoadDebugDump(const char *dump_dir_name, crash_data_t **crash_data) run_state->post_run_callback = is_crash_a_dup; run_state->post_run_param = &state; run_state->logging_callback = do_log; - int r = run_event(run_state, dump_dir_name, "post-create"); + int r = run_event_on_dir_name(run_state, dump_dir_name, "post-create"); free_run_event_state(run_state); //TODO: consider this case: @@ -590,7 +590,7 @@ static crash_data_t *FillCrashInfo(const char *dump_dir_name) if (!dd) return NULL; - crash_data_t *crash_data = load_crash_data_from_dump_dir(dd); + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); char *events = list_possible_events(dd, NULL, ""); dd_close(dd); diff --git a/src/daemon/abrt-handle-crashdump.c b/src/daemon/abrt-handle-crashdump.c index 2217c67a..de809c17 100644 --- a/src/daemon/abrt-handle-crashdump.c +++ b/src/daemon/abrt-handle-crashdump.c @@ -96,7 +96,7 @@ int main(int argc, char **argv) struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log; - int r = run_event(run_state, dump_dir_name ? dump_dir_name : ".", event); + int r = run_event_on_dir_name(run_state, dump_dir_name ? dump_dir_name : ".", event); if (r == -1) error_msg_and_die("No actions are found for event '%s'", event); free_run_event_state(run_state); diff --git a/src/include/report/crash_data.h b/src/include/report/crash_data.h index 86cdadd0..86543a4f 100644 --- a/src/include/report/crash_data.h +++ b/src/include/report/crash_data.h @@ -16,8 +16,8 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef CRASH_DUMP_H_ -#define CRASH_DUMP_H_ +#ifndef CRASH_DATA_H_ +#define CRASH_DATA_H_ #include <glib.h> @@ -90,8 +90,10 @@ static inline void free_vector_of_crash_data(vector_of_crash_data_t *vector) /* Conversions between in-memory and on-disk formats */ -crash_data_t *load_crash_data_from_dump_dir(struct dump_dir *dd); -struct dump_dir *create_dump_dir(crash_data_t *crash_data, const char *base_dir_name); +void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd); +crash_data_t *create_crash_data_from_dump_dir(struct dump_dir *dd); + +struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name); #ifdef __cplusplus } diff --git a/src/include/report/run_event.h b/src/include/report/run_event.h index c2e34650..b58ea66a 100644 --- a/src/include/report/run_event.h +++ b/src/include/report/run_event.h @@ -19,6 +19,8 @@ #ifndef RUN_EVENT_H_ #define RUN_EVENT_H_ +#include "crash_data.h" + #ifdef __cplusplus extern "C" { #endif @@ -38,7 +40,8 @@ void free_run_event_state(struct run_event_state *state); * of post_run_callback. If all actions are successful, returns 0. * If no actions were run for the event, returns -1. */ -int run_event(struct run_event_state *state, const char *dump_dir_name, const char *event); +int run_event_on_dir_name(struct run_event_state *state, const char *dump_dir_name, const char *event); +int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event); char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx); #ifdef __cplusplus diff --git a/src/lib/crash_data.c b/src/lib/crash_data.c index 2cbc043b..a372ab58 100644 --- a/src/lib/crash_data.c +++ b/src/lib/crash_data.c @@ -185,11 +185,10 @@ static char* is_text_file(const char *name, ssize_t *sz) return NULL; /* it's binary */ } -crash_data_t *load_crash_data_from_dump_dir(struct dump_dir *dd) +void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd) { char *short_name; char *full_name; - crash_data_t *crash_data = new_crash_data(); dd_init_next_file(dd); while (dd_get_next_file(dd, &short_name, &full_name)) @@ -208,7 +207,6 @@ crash_data_t *load_crash_data_from_dump_dir(struct dump_dir *dd) full_name, CD_FLAG_BIN + CD_FLAG_ISNOTEDITABLE ); - free(short_name); free(full_name); continue; @@ -231,6 +229,12 @@ crash_data_t *load_crash_data_from_dump_dir(struct dump_dir *dd) free(full_name); free(content); } +} + +crash_data_t *create_crash_data_from_dump_dir(struct dump_dir *dd) +{ + crash_data_t *crash_data = new_crash_data(); + load_crash_data_from_dump_dir(crash_data, dd); return crash_data; } diff --git a/src/lib/create_dump_dir.c b/src/lib/create_dump_dir.c index 2125dea4..b0f38e1a 100644 --- a/src/lib/create_dump_dir.c +++ b/src/lib/create_dump_dir.c @@ -27,7 +27,7 @@ static struct dump_dir *try_dd_create(const char *base_dir_name, const char *dir return dd; } -struct dump_dir *create_dump_dir(crash_data_t *crash_data, const char *base_dir_name) +struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name) { char dir_name[sizeof("abrt-tmp-%lu-%lu") + sizeof(long)*3 * 2]; sprintf(dir_name, "abrt-tmp-%lu-%lu", (long)getpid(), (long)time(NULL)); diff --git a/src/lib/run_event.c b/src/lib/run_event.c index 28fbfd5e..45ed3cdc 100644 --- a/src/lib/run_event.c +++ b/src/lib/run_event.c @@ -28,7 +28,7 @@ void free_run_event_state(struct run_event_state *state) free(state); } -int run_event(struct run_event_state *state, +int run_event_on_dir_name(struct run_event_state *state, const char *dump_dir_name, const char *event ) { @@ -183,6 +183,25 @@ int run_event(struct run_event_state *state, return retval; } +int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event) +{ + struct dump_dir *dd = create_dump_dir_from_crash_data(data, NULL); + if (!dd) + return -1; + char *dir_name = xstrdup(dd->dd_dir); + dd_close(dd); + int r = run_event_on_dir_name(state, dir_name, event); + dd = dd_opendir(dir_name, 0); + free(dir_name); + if (dd) + { + g_hash_table_remove_all(data); + load_crash_data_from_dump_dir(data, dd); + dd_delete(dd); + } + return r; +} + char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx) { FILE *conffile = fopen(CONF_DIR"/abrt_event.conf", "r"); diff --git a/src/plugins/abrt-action-bugzilla.cpp b/src/plugins/abrt-action-bugzilla.cpp index 9174dbc3..00c3613c 100644 --- a/src/plugins/abrt-action-bugzilla.cpp +++ b/src/plugins/abrt-action-bugzilla.cpp @@ -639,7 +639,7 @@ static void report_to_bugzilla( struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) xfunc_die(); /* dd_opendir already emitted error msg */ - crash_data_t *crash_data = load_crash_data_from_dump_dir(dd); + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); const char *env; diff --git a/src/plugins/abrt-action-kerneloops.c b/src/plugins/abrt-action-kerneloops.c index 9cffab7d..5da54d13 100644 --- a/src/plugins/abrt-action-kerneloops.c +++ b/src/plugins/abrt-action-kerneloops.c @@ -90,7 +90,7 @@ static void report_to_kerneloops( if (!dd) exit(1); /* error msg is already logged */ - crash_data_t *crash_data = load_crash_data_from_dump_dir(dd); + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); const char *backtrace = get_crash_item_content_or_NULL(crash_data, FILENAME_BACKTRACE); diff --git a/src/plugins/abrt-action-mailx.c b/src/plugins/abrt-action-mailx.c index 6ade162e..00f73d03 100644 --- a/src/plugins/abrt-action-mailx.c +++ b/src/plugins/abrt-action-mailx.c @@ -67,7 +67,7 @@ static void create_and_send_email( if (!dd) exit(1); /* error msg is already logged by dd_opendir */ - crash_data_t *crash_data = load_crash_data_from_dump_dir(dd); + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); char* env; diff --git a/src/plugins/abrt-action-print.c b/src/plugins/abrt-action-print.c index 3e420768..86a9a1d0 100644 --- a/src/plugins/abrt-action-print.c +++ b/src/plugins/abrt-action-print.c @@ -78,7 +78,7 @@ int main(int argc, char **argv) if (!dd) return 1; /* error message is already logged */ - crash_data_t *crash_data = load_crash_data_from_dump_dir(dd); + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); char *dsc = make_description_logger(crash_data); diff --git a/src/plugins/abrt-action-rhtsupport.c b/src/plugins/abrt-action-rhtsupport.c index 77b6b1ff..245a3ce0 100644 --- a/src/plugins/abrt-action-rhtsupport.c +++ b/src/plugins/abrt-action-rhtsupport.c @@ -34,7 +34,7 @@ static void report_to_rhtsupport( if (!dd) exit(1); /* error msg is already logged by dd_opendir */ - crash_data_t *crash_data = load_crash_data_from_dump_dir(dd); + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); /* Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing */ diff --git a/src/report-python/__init__.py b/src/report-python/__init__.py index 892d7c2a..0b0f5685 100644 --- a/src/report-python/__init__.py +++ b/src/report-python/__init__.py @@ -119,11 +119,12 @@ def createAlertSignature(component, hashmarkername, hashvalue, summary, alertSig return cd def report(cd, io_unused): - dd = cd.create_dump_dir() - dir_name = dd.name - dd.close() + #dd = cd.create_dump_dir() + #dir_name = dd.name + #dd.close() #r = os.spawnlp(P_WAIT, "abrt-handle-crashdump", "abrt-handle-crashdump", "-d", dirname, "-e" , "report"); + ### Silmpler alternative: state = run_event_state() #state.logging_callback = logfunc - r = state.run_event(dir_name, "report") + r = state.run_event_on_crash_data(cd, "report") return r diff --git a/src/report-python/common.h b/src/report-python/common.h index f77e5a31..d6d209e9 100644 --- a/src/report-python/common.h +++ b/src/report-python/common.h @@ -18,6 +18,10 @@ */ #include <Python.h> +#include "dump_dir.h" +#include "crash_data.h" +#include "run_event.h" + /* exception object */ extern PyObject *ReportError; @@ -36,3 +40,8 @@ typedef struct { PyObject_HEAD struct dump_dir *dd; } p_dump_dir; + +typedef struct { + PyObject_HEAD + crash_data_t *cd; +} p_crash_data; diff --git a/src/report-python/crash_data.c b/src/report-python/crash_data.c index 8ae597c3..04a721cc 100644 --- a/src/report-python/crash_data.c +++ b/src/report-python/crash_data.c @@ -20,15 +20,8 @@ #include <structmember.h> #include <errno.h> -#include "crash_data.h" -#include "dump_dir.h" #include "common.h" -typedef struct { - PyObject_HEAD - crash_data_t *cd; -} p_crash_data; - static void p_crash_data_dealloc(PyObject *pself) { @@ -92,8 +85,8 @@ static PyObject *p_get_crash_data_item(PyObject *pself, PyObject *args) return Py_BuildValue("sI", ci->content, ci->flags); } -/* struct dump_dir *create_dump_dir(crash_data_t *crash_data, const char *base_dir_name); */ -static PyObject *p_create_dump_dir(PyObject *pself, PyObject *args) +/* struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name); */ +static PyObject *p_create_dump_dir_from_crash_data(PyObject *pself, PyObject *args) { p_crash_data *self = (p_crash_data*)pself; const char *base_dir_name = NULL; @@ -104,7 +97,7 @@ static PyObject *p_create_dump_dir(PyObject *pself, PyObject *args) p_dump_dir *new_dd = PyObject_New(p_dump_dir, &p_dump_dir_type); if (!new_dd) return NULL; - struct dump_dir *dd = create_dump_dir(self->cd, base_dir_name); + struct dump_dir *dd = create_dump_dir_from_crash_data(self->cd, base_dir_name); if (!dd) { PyObject_Del((PyObject*)new_dd); @@ -121,9 +114,9 @@ static PyObject *p_create_dump_dir(PyObject *pself, PyObject *args) static PyMethodDef p_crash_data_methods[] = { /* method_name, func, flags, doc_string */ - { "add" , p_crash_data_add, METH_VARARGS }, - { "get" , p_get_crash_data_item, METH_VARARGS }, - { "create_dump_dir", p_create_dump_dir, METH_VARARGS }, + { "add" , p_crash_data_add , METH_VARARGS }, + { "get" , p_get_crash_data_item , METH_VARARGS }, + { "create_dump_dir", p_create_dump_dir_from_crash_data, METH_VARARGS }, { NULL } }; diff --git a/src/report-python/dump_dir.c b/src/report-python/dump_dir.c index 04a58d31..249a9478 100644 --- a/src/report-python/dump_dir.c +++ b/src/report-python/dump_dir.c @@ -22,7 +22,6 @@ #include <structmember.h> #include <errno.h> -#include "dump_dir.h" #include "common.h" /*** init/cleanup ***/ diff --git a/src/report-python/reportmodule.c b/src/report-python/reportmodule.c index 6dda73cf..bd74cff3 100644 --- a/src/report-python/reportmodule.c +++ b/src/report-python/reportmodule.c @@ -17,18 +17,16 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include <Python.h> -#include "common.h" -#include "crash_data.h" -#include "dump_dir.h" +#include "common.h" PyObject *ReportError; static PyMethodDef module_methods[] = { /* method_name, func, flags, doc_string */ - { "dd_opendir" , p_dd_opendir, METH_VARARGS, NULL }, - { "dd_create" , p_dd_create, METH_VARARGS, NULL }, - { "delete_dump_dir", p_delete_dump_dir, METH_VARARGS, NULL }, + { "dd_opendir" , p_dd_opendir , METH_VARARGS }, + { "dd_create" , p_dd_create , METH_VARARGS }, + { "delete_dump_dir", p_delete_dump_dir, METH_VARARGS }, { NULL } }; diff --git a/src/report-python/run_event.c b/src/report-python/run_event.c index 0bef3b21..6131df8e 100644 --- a/src/report-python/run_event.c +++ b/src/report-python/run_event.c @@ -20,8 +20,9 @@ #include <structmember.h> #include <errno.h> -#include "run_event.h" #include "common.h" +#include "crash_data.h" +#include "run_event.h" typedef struct { PyObject_HEAD @@ -71,7 +72,7 @@ static void p_run_event_state_dealloc(PyObject *pself) /*** methods ***/ -/* First, C-level callback helpers for run_event(): */ +/* First, C-level callback helpers for run_event_on_FOO(): */ static int post_run_callback(const char *dump_dir_name, void *param) { PyObject *obj = (PyObject*)param; @@ -94,8 +95,8 @@ static char *logging_callback(char *log_line, void *param) return log_line; /* signaling to caller that we didnt consume the string */ } -/* int run_event(struct run_event_state *state, const char *dump_dir_name, const char *event); */ -static PyObject *p_run_event(PyObject *pself, PyObject *args) +/* int run_event_on_dir_name(struct run_event_state *state, const char *dump_dir_name, const char *event); */ +static PyObject *p_run_event_on_dir_name(PyObject *pself, PyObject *args) { p_run_event_state *self = (p_run_event_state*)pself; const char *dump_dir_name; @@ -104,7 +105,22 @@ static PyObject *p_run_event(PyObject *pself, PyObject *args) { return NULL; } - int r = run_event(self->state, dump_dir_name, event); + int r = run_event_on_dir_name(self->state, dump_dir_name, event); + PyObject *obj = Py_BuildValue("i", r); + return obj; +} + +/* int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event); */ +static PyObject *p_run_event_on_crash_data(PyObject *pself, PyObject *args) +{ + p_run_event_state *self = (p_run_event_state*)pself; + p_crash_data *cd; + const char *event; + if (!PyArg_ParseTuple(args, "O!s", &p_crash_data_type, &cd, &event)) + { + return NULL; + } + int r = run_event_on_crash_data(self->state, cd->cd, event); PyObject *obj = Py_BuildValue("i", r); return obj; } @@ -177,7 +193,8 @@ static int set_logging_callback(PyObject *pself, PyObject *callback, void *unuse static PyMethodDef p_run_event_state_methods[] = { /* method_name, func, flags, doc_string */ - { "run_event", p_run_event, METH_VARARGS }, + { "run_event_on_dir_name" , p_run_event_on_dir_name , METH_VARARGS }, + { "run_event_on_crash_data", p_run_event_on_crash_data, METH_VARARGS }, { NULL } }; diff --git a/src/report-python/test_full b/src/report-python/test_full index 05020f05..103535dd 100755 --- a/src/report-python/test_full +++ b/src/report-python/test_full @@ -12,7 +12,7 @@ def run_event_on_crash_data(cd, event, log_function = None): if log_function: # maybe if callable(log_function)? run_state.logging_callback = log_function print "Running event:", event - r = run_state.run_event(dir_name, event) + r = run_state.run_event_on_dir_name(dir_name, event) print "Deleting:", dir_name delete_dump_dir(dir_name) return r; diff --git a/src/report-python/test_full2 b/src/report-python/test_full2 new file mode 100755 index 00000000..734946eb --- /dev/null +++ b/src/report-python/test_full2 @@ -0,0 +1,17 @@ +#!/usr/bin/python + +import sys +from report import * + +def log_function(line): + print "LOG:", line + +cd = crash_data() +cd.add("foo", "bar") +cd.add("analyzer", "baz", CD_FLAG_ISNOTEDITABLE) + +st = run_event_state() +st.logging_callback = log_function +r = st.run_event_on_crash_data(cd, "post-create") + +print "Result:", r diff --git a/src/report-python/test_run_event_state1 b/src/report-python/test_run_event_state1 index fa5d61a8..b30f8b55 100755 --- a/src/report-python/test_run_event_state1 +++ b/src/report-python/test_run_event_state1 @@ -20,8 +20,8 @@ if not dd: dd.save_text("analyzer", "foo") dd.close() -res.run_event("testdir", "post-create") +res.run_event_on_dir_name("testdir", "post-create") dd = dd_opendir("testdir") -#dd.delete() +dd.delete() dd.close() |