1 /* w32lib.h - Posix emulation layer for Sylpheed (Claws) 2 * 3 * This file is part of w32lib. 4 * 5 * w32lib is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * w32lib is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 * The code has been taken from the package 19 * http://claws.sylpheed.org/win32/sylpheed/w32lib-dev-2004.2.3.0.zip 20 * on 2005-11-17 by Werner Koch <wk@gnupg.org>. There are no regular 21 * copyright notices but the file version.rc from the ZIP archive 22 * claims: 23 * 24 * #define FILEVER "2004.2.3.0\0" 25 * #define PRODVER "2004.2.3\0" 26 * 27 * [...] 28 * VALUE "FileDescription", "Posix emulation layer for Sylpheed (Claws)\0" 29 * VALUE "FileVersion", FILEVER 30 * VALUE "ProductVersion", PRODVER 31 * VALUE "LegalCopyright", "GPL\0" 32 * VALUE "CompanyName", "GNU / Free Software Foundation\0" 33 * VALUE "ProductName", "w32lib\0" 34 * 35 * Along with the fact that Sylpheed is under the GPL we can assume 36 * that this code is under the GPL. No author information or 37 * changelogs have been found. 38 * Files taken form the package are: 39 * w32_dirent.c w32_reg.c w32_stat.c w32_stdlib.c w32_time.c w32_wait.c 40 * w32_gettext.c w32_signal.c w32_stdio.c w32_string.c w32_unistd.c 41 */ 42 43 /* Changes are: 44 45 2007-05-21 Werner Koch <wk@g10code.com> 46 47 * src/common/w32_account.c: New. 48 49 * src/common/w32lib.h: Undef "interface". 50 51 2005-11-17 Werner Koch <wk@g10code.com> 52 53 Add boilerplate text to all files and explain legal status. 54 55 * w32_reg.c: Replaced g_free and g_strdup by regular C functions. 56 (get_content_type_from_registry_with_ext): Ditto. 57 * w32_dirent.c (readdir): Ditto. 58 (opendir): Ditto. 59 (closedir): Reformatted. 60 (readdir): Reformatted, replaced use of g_strdup_printf and other 61 g-style malloc function by regular ones. Use DIR structure from mingw. 62 * w32lib.h: Don't define finddata_t for mingw. Replaced replacement 63 DIR structure by the one form mingw. Allocate filename in dirent 64 statically to match the defintion ussed by mingw. 65 * w32_reg.c (read_w32_registry_string): Return error for invalid root 66 key. 67 68 */ 69 70 71 #ifndef _W32LIB_H_ 72 #define _W32LIB_H_ 73 74 #include <windows.h> 75 #include <io.h> 76 #include <stdio.h> 77 78 #ifdef __MINGW32__ 79 # include <_mingw.h> 80 # define MINGW32_VERSION (__MINGW32_MAJOR_VERSION * 100 \ 81 + __MINGW32_MINOR_VERSION) 82 # define MINGW64_VERSION (__MINGW64_VERSION_MAJOR * 100 \ 83 + __MINGW64_VERSION_MINOR) 84 # include <wchar.h> 85 # include <dirent.h> 86 # include <sys/time.h> 87 # if MINGW64_VERSION >= 200 88 # include <sys/types.h> 89 # endif 90 #endif /* __MINGW32__ */ 91 92 #include <glib/gstdio.h> 93 94 /* Mingw32 3.4.4 defines interface to struct and thus breaks our own 95 use of that symbol. Undef it here. */ 96 #if defined(_BASETYPS_H) && defined(interface) 97 #undef interface 98 #endif 99 100 101 /* types */ 102 /*** ??? ***/ 103 #ifndef __MINGW32__ 104 typedef long int off_t; 105 typedef int pid_t; 106 typedef unsigned char u_char; 107 #endif /* __MINGW32__ */ 108 typedef unsigned int uid_t; 109 110 #ifndef __MINGW32__ 111 /*** stat ***/ 112 #define S_IRUSR _S_IREAD 113 #define S_IWUSR _S_IWRITE 114 #define S_IXUSR _S_IEXEC 115 #define S_IRWXU (_S_IREAD|_S_IWRITE|_S_IEXEC) 116 #endif /* __MINGW32__ */ 117 118 119 /* (signal?) */ 120 #define SIGPIPE _S_IFIFO 121 122 123 /* (directory) */ 124 #define __S_ISTYPE(mode, mask) (((mode) & _S_IFMT) == (mask)) 125 #ifndef __MINGW32__ 126 #define S_ISFIFO(mode) __S_ISTYPE((mode), _S_IFIFO) 127 #define S_ISDIR(mode) __S_ISTYPE((mode), _S_IFDIR) 128 #define S_ISREG(mode) __S_ISTYPE((mode), _S_IFREG) 129 #endif /* __MINGW32__ */ 130 131 /* functions */ 132 /*** str ***/ 133 #if MINGW64_VERSION < 200 134 int strcasecmp( const char *s1, const char *s2 ); 135 int strncasecmp( const char *s1, const char *s2, size_t n ); 136 #endif 137 138 /*** dir ***/ 139 #ifndef __MINGW32__ 140 typedef void * HANDLE; 141 142 #ifndef _FINDDATA_T_DEFINED 143 typedef unsigned long _fsize_t; /* Could be 64 bits for Win32 */ 144 struct _finddata_t { 145 unsigned attrib; 146 time_t time_create; /* -1 for FAT file systems */ 147 time_t time_access; /* -1 for FAT file systems */ 148 time_t time_write; 149 _fsize_t size; 150 char name[260]; 151 }; 152 #endif /* !_FINDDATA_T_DEFINED */ 153 154 struct dirent { 155 long d_ino; 156 unsigned short d_reclen; 157 unsigned short d_namlen; 158 char d_name[FILENAME_MAX]; 159 }; 160 161 typedef struct 162 { 163 struct _finddata_t dd_dta; 164 struct dirent dd_dir; 165 long dd_handle; 166 int dd_stat; 167 char dd_name[1]; 168 } DIR; 169 170 #endif /* !__MINGW32__ */ 171 172 #if defined (__MINGW32__) && MINGW32_VERSION < 312 173 # if MINGW64_VERSION < 200 174 struct timezone { 175 int tz_minuteswest; 176 int tz_dsttime; 177 }; 178 # endif 179 #endif 180 181 /*** stat ***/ 182 int lstat( const char *file_name, GStatBuf *buf ); 183 184 /*** sys/wait ***/ 185 pid_t waitpid( pid_t pid, int *status, int options ); 186 187 /*** sys/time ***/ 188 #if ! defined (__MINGW32__) || MINGW32_VERSION < 312 189 # if MINGW64_VERSION < 200 190 int gettimeofday( struct timeval *tv, struct timezone *tz ); 191 # endif 192 #endif 193 194 /*** unistd ***/ 195 int setpgid( pid_t pid, pid_t pgid ); 196 pid_t getppid( void ); 197 unsigned int sleep( unsigned int seconds ); 198 199 /*** stdlib ***/ 200 long int random( void ); 201 void srandom( unsigned int seed ); 202 #if MINGW64_VERSION < 200 203 int truncate( const char *path, off_t length ); 204 #endif 205 206 /*** signal ***/ 207 int kill( pid_t pid, int sig ); 208 209 /*** stdio ***/ 210 #if MINGW64_VERSION < 200 211 FILE *popen( const char *command, const char *type ); 212 int pclose( FILE *stream ); 213 #endif 214 215 /*** w32_account.c ***/ 216 int w32_is_administrator (void); 217 218 /*** misc ***/ 219 int write_w32_registry_string( char *parent, char *section, char *value, char *data ); 220 int write_w32_registry_dword( char *parent, char *section, char *value, int data ); 221 char *read_w32_registry_string( char *parent, char *section, char *key ); 222 char *get_content_type_from_registry_with_ext( char *ext ); 223 224 #endif 225