From 2c2e261648d5ae1befe5c4f269a655cc06b6e1e9 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Fri, 27 Aug 2010 12:38:25 +0000 Subject: [PATCH] Use system headers a bit more: use host's fcntl.h for O_RDONLY etc. Removes the need to fix up those in the simulator. Also work around some posix-mingw incompatibilities (e.g. getcwd()). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27904 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libtta/ttadec.c | 18 ++++++++-------- apps/language.c | 2 +- apps/metadata.h | 2 +- apps/tree.c | 4 ++-- apps/tree.h | 8 ++++++- firmware/export/load_code.h | 8 ++++++- firmware/include/file.h | 29 ++++++++----------------- firmware/libc/include/fcntl.h | 40 +++++++++++++++++++++++++++++++++++ firmware/load_code.c | 8 +++---- uisimulator/common/io.c | 9 +++++--- 10 files changed, 85 insertions(+), 43 deletions(-) create mode 100644 firmware/libc/include/fcntl.h diff --git a/apps/codecs/libtta/ttadec.c b/apps/codecs/libtta/ttadec.c index 9d53a327f2..cdaffcd9d9 100644 --- a/apps/codecs/libtta/ttadec.c +++ b/apps/codecs/libtta/ttadec.c @@ -77,7 +77,7 @@ static unsigned char *bitpos IBSS_ATTR; /********************* rockbox helper functions *************************/ /* emulate stdio functions */ -static int fread(void *ptr, size_t size, size_t nobj) +static size_t tta_fread(void *ptr, size_t size, size_t nobj) { size_t read_size; unsigned char *buffer = ci->request_buffer(&read_size, size * nobj); @@ -90,7 +90,7 @@ static int fread(void *ptr, size_t size, size_t nobj) return read_size; } -static int fseek(long offset, int origin) +static int tta_fseek(long offset, int origin) { switch (origin) { @@ -129,7 +129,7 @@ crc32 (unsigned char *buffer, unsigned int len) { #define GET_BINARY(value, bits) \ while (bit_count < bits) { \ if (bitpos == iso_buffers_end) { \ - if (!fread(isobuffers, 1, ISO_BUFFERS_SIZE)) { \ + if (!tta_fread(isobuffers, 1, ISO_BUFFERS_SIZE)) { \ ttainfo->STATE = READ_ERROR; \ return -1; \ } \ @@ -149,7 +149,7 @@ crc32 (unsigned char *buffer, unsigned int len) { value = 0; \ while (!(bit_cache ^ bit_mask[bit_count])) { \ if (bitpos == iso_buffers_end) { \ - if (!fread(isobuffers, 1, ISO_BUFFERS_SIZE)) { \ + if (!tta_fread(isobuffers, 1, ISO_BUFFERS_SIZE)) { \ ttainfo->STATE = READ_ERROR; \ return -1; \ } \ @@ -207,7 +207,7 @@ static int done_buffer_read(void) { if (rbytes < sizeof(int)) { ci->memcpy(isobuffers, bitpos, 4); - if (!fread(isobuffers + rbytes, 1, ISO_BUFFERS_SIZE - rbytes)) + if (!tta_fread(isobuffers + rbytes, 1, ISO_BUFFERS_SIZE - rbytes)) return -1; bitpos = isobuffers; } @@ -249,10 +249,10 @@ int set_tta_info (tta_info *info) ci->memset (info, 0, sizeof(tta_info)); /* skip id3v2 tags */ - fseek(ci->id3->id3v2len, SEEK_SET); + tta_fseek(ci->id3->id3v2len, SEEK_SET); /* read TTA header */ - if (fread (&ttahdr, 1, sizeof (ttahdr)) == 0) { + if (tta_fread (&ttahdr, 1, sizeof (ttahdr)) == 0) { info->STATE = READ_ERROR; return -1; } @@ -374,7 +374,7 @@ int set_position (unsigned int pos, enum tta_seek_type type) return -1; } seek_pos = ttainfo->DATAPOS + seek_table[data_pos = pos]; - if (fseek(seek_pos, SEEK_SET) < 0) { + if (tta_fseek(seek_pos, SEEK_SET) < 0) { ttainfo->STATE = READ_ERROR; return -1; } @@ -418,7 +418,7 @@ int player_init (tta_info *info) { } /* read seek table */ - if (!fread(seek_table, st_size, 1)) { + if (!tta_fread(seek_table, st_size, 1)) { ttainfo->STATE = READ_ERROR; return -1; } diff --git a/apps/language.c b/apps/language.c index fea4fb3264..39903c4346 100644 --- a/apps/language.c +++ b/apps/language.c @@ -19,7 +19,7 @@ * ****************************************************************************/ -#include +#include "file.h" #include "language.h" #include "lang.h" diff --git a/apps/metadata.h b/apps/metadata.h index b73d92b83f..39da30e1a5 100644 --- a/apps/metadata.h +++ b/apps/metadata.h @@ -23,8 +23,8 @@ #define _METADATA_H #include -#include "file.h" #include "config.h" +#include "file.h" /* Audio file types. */ diff --git a/apps/tree.c b/apps/tree.c index 4d915ca3b8..730c59f611 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -511,13 +511,13 @@ void resume_directory(const char *dir) /* Returns the current working directory and also writes cwd to buf if non-NULL. In case of error, returns NULL. */ -char *getcwd(char *buf, size_t size) +char *getcwd(char *buf, getcwd_size_t size) { if (!buf) return tc.currdir; else if (size) { - if (strlcpy(buf, tc.currdir, size) < size) + if ((getcwd_size_t)strlcpy(buf, tc.currdir, size) < size) return buf; } /* size == 0, or truncation in strlcpy */ diff --git a/apps/tree.h b/apps/tree.h index e33fee00d7..993d1b4569 100644 --- a/apps/tree.h +++ b/apps/tree.h @@ -79,7 +79,13 @@ void set_current_file(char *path); int rockbox_browse(const char *root, int dirfilter); bool create_playlist(void); void resume_directory(const char *dir); -char *getcwd(char *buf, size_t size); +#ifdef WIN32 +/* it takes an int on windows */ +#define getcwd_size_t int +#else +#define getcwd_size_t size_t +#endif +char *getcwd(char *buf, getcwd_size_t size); void reload_directory(void); bool check_rockboxdir(void); struct tree_context* tree_get_context(void); diff --git a/firmware/export/load_code.h b/firmware/export/load_code.h index f4fa8f9b46..e37af786df 100644 --- a/firmware/export/load_code.h +++ b/firmware/export/load_code.h @@ -42,7 +42,13 @@ static inline void lc_close(void *handle) { (void)handle; } /* don't call these directly for loading code * they're to be wrapped by platform specific functions */ -extern void *_lc_open(const char *filename, char *buf, size_t buf_size); +#ifdef WIN32 +/* windows' LoadLibrary can only handle ucs2, no utf-8 */ +#define _lc_open_char wchar_t +#else +#define _lc_open_char char +#endif +extern void *_lc_open(const _lc_open_char *filename, char *buf, size_t buf_size); extern void *_lc_get_header(void *handle); extern void _lc_close(void *handle); diff --git a/firmware/include/file.h b/firmware/include/file.h index a9d1d05a11..7799f3d625 100644 --- a/firmware/include/file.h +++ b/firmware/include/file.h @@ -25,31 +25,19 @@ #include #include "config.h" #include "gcc_extensions.h" +#include +#ifdef WIN32 +/* this has SEEK_SET et al */ +#include +#endif + #undef MAX_PATH /* this avoids problems when building simulator */ #define MAX_PATH 260 #define MAX_OPEN_FILES 11 -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef O_RDONLY -#define O_RDONLY 0 -#define O_WRONLY 1 -#define O_RDWR 2 -#define O_CREAT 4 -#define O_APPEND 8 -#define O_TRUNC 0x10 -#endif - -#if (CONFIG_PLATFORM & PLATFORM_HOSTED) && !defined(PLUGIN) && !defined(CODEC) +#if !defined(PLUGIN) && !defined(CODEC) +#if (CONFIG_PLATFORM & PLATFORM_HOSTED) #define open(x, ...) sim_open(x, __VA_ARGS__) #define creat(x,m) sim_creat(x,m) #define remove(x) sim_remove(x) @@ -96,4 +84,5 @@ extern int ftruncate(int fd, off_t length); extern off_t filesize(int fd); extern int release_files(int volume); int fdprintf (int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3); +#endif /* !CODEC && !PLUGIN */ #endif diff --git a/firmware/libc/include/fcntl.h b/firmware/libc/include/fcntl.h new file mode 100644 index 0000000000..34740c9ca2 --- /dev/null +++ b/firmware/libc/include/fcntl.h @@ -0,0 +1,40 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Björn Stenberg + * + * 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 (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef __FCNTL_H__ +#define __FCNTL_H__ + +#ifndef O_RDONLY +#define O_RDONLY 0 +#define O_WRONLY 1 +#define O_RDWR 2 +#define O_CREAT 4 +#define O_APPEND 8 +#define O_TRUNC 0x10 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + +#endif /* __FCNTL_H__ */ diff --git a/firmware/load_code.c b/firmware/load_code.c index 9e8e71f9af..75bac8b2ac 100644 --- a/firmware/load_code.c +++ b/firmware/load_code.c @@ -80,13 +80,12 @@ static inline char *_dlerror(void) #else /* unix */ #include -#define O_BINARY 0 #endif #include #include "rbpaths.h" #include "general.h" -void * _lc_open(const char *filename, char *buf, size_t buf_size) +void * _lc_open(const _lc_open_char *filename, char *buf, size_t buf_size) { (void)buf; (void)buf_size; @@ -116,14 +115,13 @@ void *lc_open_from_mem(void *addr, size_t blob_size) char name[MAX_PATH]; const char *_name = get_user_file_path(ROCKBOX_DIR, NEED_WRITE, name, sizeof(name)); snprintf(temp_filename, sizeof(temp_filename), - "%slibtemp_binary_%d.dll", _name, i); + "%s/libtemp_binary_%d.dll", _name, i); #endif - fd = open(temp_filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0766); + fd = open(temp_filename, O_WRONLY|O_CREAT|O_TRUNC, 0700); if (fd >= 0) break; /* Created a file ok */ } - DEBUGF("Creating %s\n", temp_filename); if (fd < 0) { DEBUGF("open failed\n"); diff --git a/uisimulator/common/io.c b/uisimulator/common/io.c index 9862b4a7a2..6547421668 100644 --- a/uisimulator/common/io.c +++ b/uisimulator/common/io.c @@ -179,9 +179,10 @@ struct mydir { typedef struct mydir MYDIR; -#if 1 /* maybe this needs disabling for MSVC... */ static unsigned int rockbox2sim(int opt) { +#if 0 +/* this shouldn't be needed since we use the host's versions */ int newopt = O_BINARY; if(opt & 1) @@ -196,8 +197,10 @@ static unsigned int rockbox2sim(int opt) newopt |= O_TRUNC; return newopt; -} +#else + return opt|O_BINARY; #endif +} /** Simulator I/O engine routines **/ #define IO_YIELD_THRESHOLD 512 @@ -537,7 +540,7 @@ int sim_fsync(int fd) void *lc_open(const char *filename, char *buf, size_t buf_size) { const char *sim_path = get_sim_pathname(filename); - void *handle = _lc_open((const char*)UTF8_TO_OS(sim_path), buf, buf_size); + void *handle = _lc_open(UTF8_TO_OS(sim_path), buf, buf_size); if (handle == NULL) {