Mercurial > trustbridge
annotate common/portpath.c @ 984:faf58e9f518b
Add recursive mkdir and mkdir for windows
mkdir for windows is based on the create restricted directory
function that was used in nssstore_win
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Fri, 29 Aug 2014 17:12:35 +0200 |
parents | b3695a3399de |
children | 66f6361fba1b |
rev | line source |
---|---|
404 | 1 /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik |
2 * Software engineering by Intevation GmbH | |
3 * | |
4 * This file is Free Software under the GNU GPL (v>=2) | |
5 * and comes with ABSOLUTELY NO WARRANTY! | |
6 * See LICENSE.txt for details. | |
7 */ | |
146
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
8 #include "portpath.h" |
984
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
9 #include "strhelp.h" |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
10 #include "util.h" |
146
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
11 |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
12 #include <libgen.h> |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
13 #include <limits.h> |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
14 #include <stdio.h> |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
15 #include <stdlib.h> |
168
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
16 #include <sys/stat.h> |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
17 #include <sys/types.h> |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
18 #include <unistd.h> |
146
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
19 |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
20 char * |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
21 port_dirname(char *path) |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
22 { |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
23 #ifndef _WIN32 |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
24 return dirname(path); |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
25 #else |
164
6d64d7e9fa32
Implemented port_dirname for windows.
Sascha Wilde <wilde@intevation.de>
parents:
146
diff
changeset
|
26 char drive[_MAX_DRIVE]; |
6d64d7e9fa32
Implemented port_dirname for windows.
Sascha Wilde <wilde@intevation.de>
parents:
146
diff
changeset
|
27 char dir[_MAX_DIR]; |
6d64d7e9fa32
Implemented port_dirname for windows.
Sascha Wilde <wilde@intevation.de>
parents:
146
diff
changeset
|
28 _splitpath(path, drive, dir, NULL, NULL); |
170
3343ddf43f42
Windows implementation of port_dirname: strip trailing '/' and '\'.
Sascha Wilde <wilde@intevation.de>
parents:
169
diff
changeset
|
29 size_t dlen = strlen(dir); |
3343ddf43f42
Windows implementation of port_dirname: strip trailing '/' and '\'.
Sascha Wilde <wilde@intevation.de>
parents:
169
diff
changeset
|
30 if ((dlen > 0) && |
3343ddf43f42
Windows implementation of port_dirname: strip trailing '/' and '\'.
Sascha Wilde <wilde@intevation.de>
parents:
169
diff
changeset
|
31 ((dir[dlen-1] == '/') || (dir[dlen-1] == '\\'))) |
3343ddf43f42
Windows implementation of port_dirname: strip trailing '/' and '\'.
Sascha Wilde <wilde@intevation.de>
parents:
169
diff
changeset
|
32 dir[dlen-1] = '\0'; |
164
6d64d7e9fa32
Implemented port_dirname for windows.
Sascha Wilde <wilde@intevation.de>
parents:
146
diff
changeset
|
33 /* We assume: drive + dir is shorter than |
6d64d7e9fa32
Implemented port_dirname for windows.
Sascha Wilde <wilde@intevation.de>
parents:
146
diff
changeset
|
34 * drive + dir + fname + ext */ |
6d64d7e9fa32
Implemented port_dirname for windows.
Sascha Wilde <wilde@intevation.de>
parents:
146
diff
changeset
|
35 sprintf(path, "%s%s", drive, dir); |
6d64d7e9fa32
Implemented port_dirname for windows.
Sascha Wilde <wilde@intevation.de>
parents:
146
diff
changeset
|
36 return path; |
146
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
37 #endif |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
38 } |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
39 |
975
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
40 bool |
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
41 port_mkdir(const char *path) |
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
42 { |
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
43 #ifndef _WIN32 |
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
44 return mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == 0; |
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
45 #else |
984
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
46 wchar_t *wchar_path = utf8_to_wchar(path, strlen(path)); |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
47 bool ret; |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
48 |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
49 if (!wchar_path) |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
50 { |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
51 return false; |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
52 } |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
53 ret = create_restricted_directory (wchar_path); |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
54 xfree (wchar_path); |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
55 return ret; |
975
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
56 #endif |
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
57 } |
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
58 |
146
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
59 char * |
975
b3695a3399de
(issue86) Install into default directories on Linux
Andre Heinecke <andre.heinecke@intevation.de>
parents:
404
diff
changeset
|
60 port_realpath(const char *path) |
146
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
61 { |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
62 #ifndef _WIN32 |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
63 return realpath(path, NULL); |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
64 #else |
169
701b7036c5dc
Windows implementation of port_realpath: NULL if file does not exist.
Sascha Wilde <wilde@intevation.de>
parents:
168
diff
changeset
|
65 char *fp = _fullpath(NULL, path, 0); |
701b7036c5dc
Windows implementation of port_realpath: NULL if file does not exist.
Sascha Wilde <wilde@intevation.de>
parents:
168
diff
changeset
|
66 if (port_fileexits(fp)) |
701b7036c5dc
Windows implementation of port_realpath: NULL if file does not exist.
Sascha Wilde <wilde@intevation.de>
parents:
168
diff
changeset
|
67 return fp; |
701b7036c5dc
Windows implementation of port_realpath: NULL if file does not exist.
Sascha Wilde <wilde@intevation.de>
parents:
168
diff
changeset
|
68 else |
701b7036c5dc
Windows implementation of port_realpath: NULL if file does not exist.
Sascha Wilde <wilde@intevation.de>
parents:
168
diff
changeset
|
69 return NULL; |
146
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
70 #endif |
306e4db11761
Added portable path name handling functions.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
71 } |
168
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
72 |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
73 bool |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
74 port_fileexits(char *path) |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
75 { |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
76 int ret; |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
77 #ifndef _WIN32 |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
78 struct stat sb; |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
79 ret = stat(path, &sb); |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
80 #else |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
81 struct _stat sb; |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
82 ret = _stat(path, &sb); |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
83 #endif |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
84 |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
85 if (ret == 0) |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
86 return true; |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
87 else |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
88 return false; |
f100861dad8f
Added simple portable function to test if an file exists.
Sascha Wilde <wilde@intevation.de>
parents:
166
diff
changeset
|
89 } |
176
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
90 |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
91 bool |
984
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
92 port_mkdir_p(const char *path) |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
93 { |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
94 char *parent_path, |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
95 *p; |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
96 if (!path) { |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
97 return false; |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
98 } |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
99 if (port_isdir(path)) { |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
100 return true; |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
101 } |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
102 parent_path = xstrndup (path, strlen(path)); |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
103 p = strrchr(parent_path, '/'); |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
104 if (!p) |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
105 { |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
106 p = strrchr(parent_path, '\\'); |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
107 } |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
108 if (!p) |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
109 { |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
110 return false; |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
111 } |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
112 *p = '\0'; |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
113 if (!port_isdir(parent_path)) |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
114 { |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
115 port_mkdir_p(parent_path); |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
116 } |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
117 return port_mkdir(path); |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
118 } |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
119 |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
120 bool |
faf58e9f518b
Add recursive mkdir and mkdir for windows
Andre Heinecke <andre.heinecke@intevation.de>
parents:
975
diff
changeset
|
121 port_isdir(const char *path) |
176
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
122 { |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
123 int ret; |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
124 #ifndef _WIN32 |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
125 struct stat sb; |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
126 ret = stat(path, &sb); |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
127 #else |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
128 struct _stat sb; |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
129 ret = _stat(path, &sb); |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
130 #endif |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
131 |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
132 if ((ret == 0) && S_ISDIR(sb.st_mode)) |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
133 return true; |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
134 else |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
135 return false; |
70d627e9e801
New portability function to test if a file is an directory.
Sascha Wilde <wilde@intevation.de>
parents:
170
diff
changeset
|
136 } |