Author: sayer
Date: 2009-03-25 01:23:06 +0100 (Wed, 25 Mar 2009)
New Revision: 1328
Modified:
trunk/apps/dsm/mods/mod_sys/ModSys.cpp
trunk/apps/dsm/mods/mod_sys/ModSys.h
Log:
function for recursive mkdir
This work was kindly sponsored by Teltech Systems Inc.
Modified: trunk/apps/dsm/mods/mod_sys/ModSys.cpp
===================================================================
--- trunk/apps/dsm/mods/mod_sys/ModSys.cpp 2009-03-25 00:05:33 UTC (rev
1327)
+++ trunk/apps/dsm/mods/mod_sys/ModSys.cpp 2009-03-25 00:23:06 UTC (rev
1328)
@@ -60,6 +60,7 @@
splitCmd(from_str, cmd, params);
DEF_CMD("sys.mkdir", SCMkDirAction);
+ DEF_CMD("sys.mkdirRecursive", SCMkDirRecursiveAction);
DEF_CMD("sys.getNewId", SCGetNewIdAction);
return NULL;
@@ -96,16 +97,72 @@
}
} MATCH_CONDITION_END;
+bool sys_mkdir(const char* p) {
+ if (mkdir(p, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) {
+ ERROR("mkdir failed for '%s': %s\n",
+ p, strerror(errno));
+ return false;
+ }
+ return true;
+}
EXEC_ACTION_START(SCMkDirAction) {
string d = resolveVars(arg, sess, sc_sess, event_params);
DBG("mkdir '%s'\n", d.c_str());
- if (mkdir(d.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) {
- ERROR("kmdir failed for '%s': %s\n",
- d.c_str(), strerror(errno));
+ if (sys_mkdir(d.c_str())) {
+ sc_sess->SET_ERRNO(DSM_ERRNO_OK);
+ } else {
+ sc_sess->SET_ERRNO(DSM_ERRNO_FILE);
}
} EXEC_ACTION_END;
+
+bool sys_get_parent_dir(const char* path, char* parentPath) {
+
+ //size_t pos = strcspn(dirPath, "/\\");
+ char* ptr = strrchr(path, '/'); // search char from end reverse
+ if (ptr == NULL) {
+ ptr = strrchr(path, '\\'); // search char from end reverse
+ if (ptr == NULL) {
+ return false;
+ }
+ }
+
+ // copy the parent substring to parentPath
+ unsigned int i;
+ for (i = 0; &(path[i+1]) != ptr; i++) {
+ parentPath[i] = path[i];
+ }
+ parentPath[i] = '\0';
+
+ return true;
+}
+
+bool sys_mkdir_recursive(const char* p) {
+ if (!file_exists(p)) {
+ char parent_dir[strlen(p)+1];
+ bool has_parent = sys_get_parent_dir(p, parent_dir);
+ if (has_parent) {
+ bool parent_exists = sys_mkdir_recursive(parent_dir);
+ if (parent_exists) {
+ return sys_mkdir(p);
+ }
+ }
+ return false;
+ }
+ return true;
+}
+
+EXEC_ACTION_START(SCMkDirRecursiveAction) {
+ string d = resolveVars(arg, sess, sc_sess, event_params);
+ DBG("mkdir recursive '%s'\n", d.c_str());
+ if (sys_mkdir_recursive(d.c_str())) {
+ sc_sess->SET_ERRNO(DSM_ERRNO_OK);
+ } else {
+ sc_sess->SET_ERRNO(DSM_ERRNO_FILE);
+ }
+} EXEC_ACTION_END;
+
EXEC_ACTION_START(SCGetNewIdAction) {
string d = resolveVars(arg, sess, sc_sess, event_params);
sc_sess->var[d]=AmSession::getNewId();
Modified: trunk/apps/dsm/mods/mod_sys/ModSys.h
===================================================================
--- trunk/apps/dsm/mods/mod_sys/ModSys.h 2009-03-25 00:05:33 UTC (rev
1327)
+++ trunk/apps/dsm/mods/mod_sys/ModSys.h 2009-03-25 00:23:06 UTC (rev
1328)
@@ -41,5 +41,7 @@
DEF_SCCondition(FileExistsCondition);
DEF_ACTION_1P(SCMkDirAction);
+DEF_ACTION_1P(SCMkDirRecursiveAction);
DEF_ACTION_1P(SCGetNewIdAction);
+
#endif
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev