From c447c7e7b542424bc08610284721cb505b13e6fc Mon Sep 17 00:00:00 2001 From: saul Date: Mon, 3 Mar 2014 15:34:54 -0500 Subject: [PATCH] plug-ins: Add 'dir-make' procedure to Script-fu. Closes: GNOME/gimp#541 Reviewer note: thanks to Stanislav Grinkov for cleaning up and reworking a bit the patch, such as renaming the procedure to dir-make, as per Kevin Cozens' review. (cherry picked from commit 11906fa82cd982287ff391968b09b0ac02b40b9a) --- plug-ins/script-fu/ftx/ftx-functions.txt | 11 +++++++ plug-ins/script-fu/ftx/ftx.c | 40 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/plug-ins/script-fu/ftx/ftx-functions.txt b/plug-ins/script-fu/ftx/ftx-functions.txt index e681261a1e..5365bc52c3 100644 --- a/plug-ins/script-fu/ftx/ftx-functions.txt +++ b/plug-ins/script-fu/ftx/ftx-functions.txt @@ -83,6 +83,17 @@ portable to different operating systems. Close directory stream. No further calls to read-dir-entry should be performed. +(dir-make dirname . mode) + dirname: string + mode: integer representing permissions + + Create the directory specified, setting the directory permissions based + upon the optional mode argument (taking into account the current + umask). If no mode is specified then use the default (umask) + permissions. Returns #t if the operation succeeds, otherwise #f. + Possible reasons for failure are that the directory already exists, + the user is not authorized to create it, or the mode is incorrectly + specified). *Time (available if HAVE_TIME is defined in tsx.h) diff --git a/plug-ins/script-fu/ftx/ftx.c b/plug-ins/script-fu/ftx/ftx.c index 346a90a92c..b1c1aa745e 100644 --- a/plug-ins/script-fu/ftx/ftx.c +++ b/plug-ins/script-fu/ftx/ftx.c @@ -8,6 +8,7 @@ #include "config.h" +#include #include #if HAVE_UNISTD_H #include @@ -48,6 +49,7 @@ pointer foreign_diropenstream(scheme *sc, pointer args); pointer foreign_dirreadentry(scheme *sc, pointer args); pointer foreign_dirrewind(scheme *sc, pointer args); pointer foreign_dirclosestream(scheme *sc, pointer args); +pointer foreign_mkdir(scheme *sc, pointer args); pointer foreign_getenv(scheme *sc, pointer args); pointer foreign_time(scheme *sc, pointer args); @@ -243,6 +245,41 @@ pointer foreign_dirclosestream(scheme *sc, pointer args) return sc->T; } +pointer foreign_mkdir(scheme *sc, pointer args) +{ + pointer first_arg; + pointer rest; + pointer second_arg; + char *dirname; + mode_t mode; + int retcode; + + if (args == sc->NIL) + return sc->F; + + first_arg = sc->vptr->pair_car(args); + if (!sc->vptr->is_string(first_arg)) + return sc->F; + dirname = sc->vptr->string_value(first_arg); + dirname = g_filename_from_utf8 (dirname, -1, NULL, NULL, NULL); + + rest = sc->vptr->pair_cdr(args); + if (sc->vptr->is_pair(rest)) /* optional mode argument */ + { + second_arg = sc->vptr->pair_car(rest); + if (!sc->vptr->is_integer(second_arg)) + return sc->F; + mode = sc->vptr->ivalue(second_arg); + } + else + mode = 0777; + + retcode = mkdir(dirname, (mode_t)mode); + if (retcode == 0) + return sc->T; + else + return sc->F; +} pointer foreign_getenv(scheme *sc, pointer args) { @@ -365,6 +402,9 @@ void init_ftx (scheme *sc) sc->vptr->scheme_define(sc, sc->global_env, sc->vptr->mk_symbol(sc,"dir-close-stream"), sc->vptr->mk_foreign_func(sc, foreign_dirclosestream)); + sc->vptr->scheme_define(sc, sc->global_env, + sc->vptr->mk_symbol(sc,"dir-make"), + sc->vptr->mk_foreign_func(sc, foreign_mkdir)); for (i = 0; file_type_constants[i].name != NULL; ++i) {