From 4df9004a4f4cfa1f1ec1e9a8ae6540710f32b0e2 Mon Sep 17 00:00:00 2001 From: Bernd Wachter Date: Thu, 25 Feb 2010 10:21:57 +0100 Subject: Don't support backslash as path separator for non-windows platforms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Thorbjørn Lindeijer --- src/utils/mkdir.c | 93 ----------------------------------------------- src/utils/mkdir.cpp | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils/mkdir.h | 2 +- 3 files changed, 102 insertions(+), 94 deletions(-) delete mode 100644 src/utils/mkdir.c create mode 100644 src/utils/mkdir.cpp diff --git a/src/utils/mkdir.c b/src/utils/mkdir.c deleted file mode 100644 index 930d2158..00000000 --- a/src/utils/mkdir.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * The Mana Client - * Copyright (C) 2010 The Mana Developers - * - * This file is part of The Mana Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include - -#if defined WIN32 -#include -#else -#include -#endif - -#ifdef _MKDIR_TEST_ -// compile with -D_MKDIR_TEST_ to get a standalone binary -#include -#include -#endif - -#include "mkdir.h" - -int mkdir_r(char *pathname){ - char tmp[PATH_MAX]; - char *p; - strncpy(tmp, pathname, sizeof(tmp)-1); - - int len=strlen(tmp); - - // terminate the pathname with '/' - if (tmp[len-1] != '/') - tmp[len] = '/'; - - for (p=tmp;*p;p++){ -#if defined WIN32 - if (*p == '/' || *p == '\\') -#else - if (*p == '/' || *p == '\\') -#endif - { - *p = '\0'; - // ignore a slash at the beginning of a path - if (strlen(tmp) == 0){ - *p = '/'; - continue; - } -#if defined WIN32 - if (!CreateDirectory(tmp, 0) && - GetLastError() != ERROR_ALREADY_EXISTS) -#else - if (mkdir(tmp, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) && - errno != EEXIST) -#endif - { -#if defined WIN32 - // hack, hack. just assume that x: might be a drive - // letter, and try again - if (!(strlen(tmp) == 2 && - !strcmp(tmp+1, ":"))) -#endif - return -1; - } - -#ifdef _MKDIR_TEST_ - printf("%s\n", tmp); -#endif - *p = '/'; - } - } -} - -#ifdef _MKDIR_TEST_ -int main(int argc, char** argv){ - if (argc < 2) exit(1); - mkdir_r(argv[1]); -} -#endif diff --git a/src/utils/mkdir.cpp b/src/utils/mkdir.cpp new file mode 100644 index 00000000..223abe71 --- /dev/null +++ b/src/utils/mkdir.cpp @@ -0,0 +1,101 @@ +/* + * The Mana Client + * Copyright (C) 2010 The Mana Developers + * + * This file is part of The Mana Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +#if defined WIN32 +#include +#else +#include +#endif + +#ifdef _MKDIR_TEST_ +// compile with -D_MKDIR_TEST_ to get a standalone binary +#include +#include +#endif + +#include "mkdir.h" + +int mkdir_r(const char *pathname) { + char tmp[PATH_MAX]; + char *p; + + if (strlen(pathname) >= PATH_MAX-2) + return -1; + + strncpy(tmp, pathname, sizeof(tmp)-1); + tmp[PATH_MAX-1] = '\0'; + + int len=strlen(tmp); + + // terminate the pathname with '/' + if (tmp[len-1] != '/') { + tmp[len] = '/'; + tmp[len+1] = '\0'; + } + + for (p=tmp; *p; p++) { +#if defined WIN32 + if (*p == '/' || *p == '\\') +#else + if (*p == '/') +#endif + { + *p = '\0'; + // ignore a slash at the beginning of a path + if (strlen(tmp) == 0){ + *p = '/'; + continue; + } +#if defined WIN32 + if (!CreateDirectory(tmp, 0) && + GetLastError() != ERROR_ALREADY_EXISTS) +#else + if (mkdir(tmp, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) && + errno != EEXIST) +#endif + { +#if defined WIN32 + // hack, hack. just assume that x: might be a drive + // letter, and try again + if (!(strlen(tmp) == 2 && + !strcmp(tmp + 1, ":"))) +#endif + return -1; + } + +#ifdef _MKDIR_TEST_ + printf("%s\n", tmp); +#endif + *p = '/'; + } + } + return 0; +} + +#ifdef _MKDIR_TEST_ +int main(int argc, char** argv) { + if (argc < 2) exit(1); + mkdir_r(argv[1]); +} +#endif diff --git a/src/utils/mkdir.h b/src/utils/mkdir.h index 07f3dda4..9369b4e7 100644 --- a/src/utils/mkdir.h +++ b/src/utils/mkdir.h @@ -21,6 +21,6 @@ #ifndef _MKDIR_H #define _MKDIR_H -int mkdir_r(char *pathname); +int mkdir_r(const char *pathname); #endif -- cgit v1.2.3-70-g09d2