summaryrefslogtreecommitdiffstats
path: root/win/kde_file_win.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/kde_file_win.c')
-rw-r--r--win/kde_file_win.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/win/kde_file_win.c b/win/kde_file_win.c
new file mode 100644
index 000000000..269f0fab6
--- /dev/null
+++ b/win/kde_file_win.c
@@ -0,0 +1,139 @@
+/*
+ This file is part of the KDE libraries
+ Copyright (C) 2004 Jaroslaw Staniek <js@iidea.pl>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <sys/stat.h>
+#include <stdarg.h>
+
+#include "kde_file_win.h"
+
+KDEWIN32_EXPORT int kdewin32_stat(const char *file_name, struct stat *buf)
+{
+ char fixed_file_name[4];
+ char *fixed_file_name2;
+ int len, result;
+ len = strlen(file_name);
+ if ((len==2 || len==3) && file_name[1]==':' && isalpha(file_name[0])) {
+ /* 1) */
+ if (len==3)
+ return stat(file_name, buf);
+ strncpy(fixed_file_name, file_name, len);
+ fixed_file_name[2]='\\';
+ fixed_file_name[3]=0;
+ return stat(fixed_file_name, buf);
+ }
+ if (len>1 && (file_name[len-1]=='\\' || file_name[len-1]=='/')) {
+ /* 2) */
+ fixed_file_name2 = strndup(file_name, len);
+ fixed_file_name2[len-1]=0;
+ result = stat(fixed_file_name2, buf);
+ free(fixed_file_name2);
+ return result;
+ }
+//TODO: is stat("/") ok?
+ return stat(file_name, buf);
+}
+
+KDEWIN32_EXPORT int kdewin32_lstat(const char *file_name, struct stat *buf)
+{
+ return kdewin32_stat(file_name, buf);
+}
+
+/** @internal */
+int kdewin32_fix_flags(int flags)
+{
+ if ((flags & O_TEXT) == 0 && (flags & O_BINARY) == 0)
+ return flags | O_BINARY;
+ return flags;
+}
+
+/*KDEWIN32_EXPORT int kdewin32_open(const char *path, int flags)
+{
+ return open(path, kdewin32_fix_flags(flags));
+}*/
+
+KDEWIN32_EXPORT int kdewin32_open(const char *path, int flags, ... /*mode_t mode*/)
+{
+ mode_t mode = 0;
+ if (flags & O_CREAT) {
+ va_list list;
+ va_start(list, flags);
+ mode = (mode_t)va_arg(list, int);
+ va_end(list);
+ }
+ return open(path, kdewin32_fix_flags(flags), mode);
+}
+
+/** @internal */
+int kdewin32_fix_mode_string(char *fixed_mode, const char *mode)
+{
+ if (strlen(mode)<1 || strlen(mode)>3)
+ return 1;
+
+ strncpy(fixed_mode, mode, 3);
+ if (fixed_mode[0]=='b' || fixed_mode[1]=='b' || fixed_mode[0]=='t' || fixed_mode[1]=='t')
+ return 0;
+ /* no 't' or 'b': append 'b' */
+ if (fixed_mode[1]=='+') {
+ fixed_mode[1]='b';
+ fixed_mode[2]='+';
+ fixed_mode[3]=0;
+ }
+ else {
+ fixed_mode[1]='b';
+ fixed_mode[2]=0;
+ }
+ return 0;
+}
+
+KDEWIN32_EXPORT FILE *kdewin32_fopen(const char *path, const char *mode)
+{
+ char fixed_mode[4];
+ if (0!=kdewin32_fix_mode_string(fixed_mode, mode))
+ return 0;
+ return fopen(path, fixed_mode);
+}
+
+KDEWIN32_EXPORT FILE *kdewin32_fdopen(int fd, const char *mode)
+{
+ char fixed_mode[4];
+ if (0!=kdewin32_fix_mode_string(fixed_mode, mode))
+ return 0;
+ return fdopen(fd, fixed_mode);
+}
+
+KDEWIN32_EXPORT FILE *kdewin32_freopen(const char *path, const char *mode, FILE *stream)
+{
+ char fixed_mode[4];
+ if (0!=kdewin32_fix_mode_string(fixed_mode, mode))
+ return 0;
+ return freopen(path, fixed_mode, stream);
+}
+
+KDEWIN32_EXPORT int kdewin32_rename(const char *src, const char *dest)
+{
+ if (0==access(dest, 0/*exists*/)
+ && 0 != remove(dest))
+ return -1;
+ return rename(src, dest);
+}
+
+KDEWIN32_EXPORT int kdewin32_mkdir(const char *path, mode_t mode)
+{
+ return mkdir(path);
+}