comparison liboctave/lo-cutils.c @ 14679:a543ed02e673

Allow the builtin function mkdir to create missing parent directories * bootstrap.conf : Add the mkdir-p and savewd gnulib modules. * file-ops.cc (static int make_ancestor (const char*, const char*, void*)): New function. (int octave_mkdir (const std::string&, mode_t, std::string&, bool): Add fourth argument and use it to conditionally select whether to make the missing parent directories. * file-ops.h (int octave_mkdir (const std::string&, mode_t, std::string&, bool): Add fourth argument. * lo-cutils.c (struct mkdir_options): New structure (static void announce_mkdir (const char*, void*), static int process_dir (char *, struct savewd *, void *), int octave_mkdir_parents (const char *, mode_t, int (*make_ancestor) (const char *, const char *, void *)): New functions. * lo-cutils.h (int octave_mkdir_parents (const char *, mode_t, int (*make_ancestor) (const char *, const char *, void *)): New function. * dirfns.cc (Fmkdir): Call octave_mkdir with the make_parents argument set to true.
author David Bateman <dbateman@free.fr>
date Wed, 23 May 2012 22:34:37 +0200
parents 72c96de7a403
children 6d888db04e55
comparison
equal deleted inserted replaced
14675:757f729fd41d 14679:a543ed02e673
30 #if ! defined (_XOPEN_SOURCE) 30 #if ! defined (_XOPEN_SOURCE)
31 #define _XOPEN_SOURCE 31 #define _XOPEN_SOURCE
32 #endif 32 #endif
33 33
34 #include <sys/types.h> 34 #include <sys/types.h>
35 #include <sys/stat.h>
35 #include <unistd.h> 36 #include <unistd.h>
36 37
37 #include <stdlib.h> 38 #include <stdlib.h>
38 #include <string.h> 39 #include <string.h>
39 #include <time.h> 40 #include <time.h>
40 41
41 #include "lo-cutils.h" 42 #include "lo-cutils.h"
42 #include "syswait.h" 43 #include "syswait.h"
44
45 #include "savewd.h"
46 #include "mkdir-p.h"
43 47
44 OCTAVE_API void 48 OCTAVE_API void
45 octave_qsort (void *base, size_t n, size_t size, 49 octave_qsort (void *base, size_t n, size_t size,
46 int (*cmp) (const void *, const void *)) 50 int (*cmp) (const void *, const void *))
47 { 51 {
74 OCTAVE_API pid_t 78 OCTAVE_API pid_t
75 octave_waitpid (pid_t pid, int *status, int options) 79 octave_waitpid (pid_t pid, int *status, int options)
76 { 80 {
77 return WAITPID (pid, status, options); 81 return WAITPID (pid, status, options);
78 } 82 }
83
84 struct mkdir_options
85 {
86 int (*make_ancestor_function) (const char *, const char *, void *);
87 mode_t ancestor_mode;
88 mode_t mode;
89 mode_t mode_bits;
90 };
91
92 static void
93 announce_mkdir (const char *dir, void *options)
94 {
95 /* Do nothing */
96 }
97
98 static int
99 process_dir (char *dir, struct savewd *wd, void *options)
100 {
101 struct mkdir_options const *o = options;
102 mode_t ancestor_mode = o->ancestor_mode;
103 return (make_dir_parents (dir, wd, o->make_ancestor_function, &ancestor_mode,
104 o->mode, announce_mkdir, o->mode_bits,
105 (uid_t) -1, (gid_t) -1, false) ? 0 : -1);
106 }
107
108 OCTAVE_API int
109 octave_mkdir_parents (const char *dir, mode_t mode,
110 int (*make_ancestor) (const char *, const char *, void *))
111 {
112 char *argv[1];
113 int retval;
114 char *dir2 = malloc (strlen (dir) + 1);
115 strcpy (dir2, dir); /* Make a copy to avoid passing a const char* as char* */
116 argv[0] = dir2;
117 struct mkdir_options o;
118 o.make_ancestor_function = make_ancestor;
119 o.ancestor_mode = mode | S_IWUSR | S_IXUSR;
120 o.mode = mode | umask(0);
121 o.mode_bits = ~(mode & umask(0));
122 retval = (savewd_process_files (1, argv, process_dir, &o));
123 free (dir2);
124 return retval;
125 }