Mercurial > octave-nkf
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 } |