You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.5 KiB
140 lines
3.5 KiB
15 years ago
|
/*
|
||
|
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);
|
||
|
}
|