From c606f0866c3a2a5db3ef9bc41738ef33eb9612a9 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sat, 22 Jun 2013 16:16:13 +0200 Subject: Add original TrueCrypt 7.1a sources --- src/Setup/Dir.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/Setup/Dir.c (limited to 'src/Setup/Dir.c') diff --git a/src/Setup/Dir.c b/src/Setup/Dir.c new file mode 100644 index 00000000..7c418c74 --- /dev/null +++ b/src/Setup/Dir.c @@ -0,0 +1,104 @@ +/* + Legal Notice: Some portions of the source code contained in this file were + derived from the source code of Encryption for the Masses 2.02a, which is + Copyright (c) 1998-2000 Paul Le Roux and which is governed by the 'License + Agreement for Encryption for the Masses'. Modifications and additions to + the original source code (contained in this file) and all other portions + of this file are Copyright (c) 2003-2008 TrueCrypt Developers Association + and are governed by the TrueCrypt License 3.0 the full text of which is + contained in the file License.txt included in TrueCrypt binary and source + code distribution packages. */ + +#include "Tcdefs.h" + +#include +#include +#include +#include +#include +#include + +#include "Dir.h" + +/* create full directory tree. returns 0 for success, -1 if failure */ +int +mkfulldir (char *oriPath, BOOL bCheckonly) +{ + struct _stat st; + char *uniq_file; + char path [TC_MAX_PATH]; + + strcpy (path, oriPath); + + if (strlen (path) == 3 && path[1] == ':') + goto is_root; /* keep final slash in root if present */ + + /* strip final forward or backslash if we have one! */ + uniq_file = strrchr (path, '\\'); + if (uniq_file && uniq_file[1] == '\0') + uniq_file[0] = '\0'; + else + { + uniq_file = strrchr (path, '/'); + if (uniq_file && uniq_file[1] == '\0') + uniq_file[0] = '\0'; + } + + is_root: + if (bCheckonly) + return _stat (path, &st); + + if (_stat (path, &st)) + return mkfulldir_internal (path); + else + return 0; +} + + +int +mkfulldir_internal (char *path) +{ + char *token; + struct _stat st; + static char tokpath[_MAX_PATH]; + static char trail[_MAX_PATH]; + + strcpy (tokpath, path); + trail[0] = '\0'; + + token = strtok (tokpath, "\\/"); + + if (tokpath[0] == '\\' && tokpath[1] == '\\') + { /* unc */ + trail[0] = tokpath[0]; + trail[1] = tokpath[1]; + trail[2] = '\0'; + strcat (trail, token); + strcat (trail, "\\"); + token = strtok (NULL, "\\/"); + if (token) + { /* get share name */ + strcat (trail, token); + strcat (trail, "\\"); + } + token = strtok (NULL, "\\/"); + } + + if (tokpath[1] == ':') + { /* drive letter */ + strcat (trail, tokpath); + strcat (trail, "\\"); + token = strtok (NULL, "\\/"); + } + + while (token != NULL) + { + int x; + strcat (trail, token); + x = _mkdir (trail); + strcat (trail, "\\"); + token = strtok (NULL, "\\/"); + } + + return _stat (path, &st); +} -- cgit v1.2.3