41874dc87ede4f996e2bbfbc8c61cf94dc72860c
[claws.git] / src / common / w32lib.h
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 <wchar.h>
80 #include <dirent.h>
81 #endif
82
83 /* Mingw32 3.4.4 defines interface to struct and thus breaks our own
84    use of that symbol.  Undef it here. */
85 #if defined(_BASETYPS_H) && defined(interface) 
86 #undef interface
87 #endif
88
89
90 /* types */
91 /*** ??? ***/
92 #ifndef __MINGW32__
93 typedef long int off_t;
94 typedef int pid_t;
95 typedef unsigned char u_char;
96 #endif /* __MINGW32__ */
97 typedef unsigned int uid_t;
98
99 #ifndef __MINGW32__
100 /*** stat ***/
101 #define S_IRUSR _S_IREAD
102 #define S_IWUSR _S_IWRITE
103 #define S_IXUSR _S_IEXEC
104 #define S_IRWXU (_S_IREAD|_S_IWRITE|_S_IEXEC)
105 #endif /* __MINGW32__ */
106
107
108 /* (signal?) */
109 #define SIGPIPE _S_IFIFO
110
111
112 /* (directory) */
113 #define __S_ISTYPE(mode, mask)  (((mode) & _S_IFMT) == (mask))
114 #ifndef __MINGW32__
115 #define S_ISFIFO(mode)  __S_ISTYPE((mode), _S_IFIFO)
116 #define S_ISDIR(mode)   __S_ISTYPE((mode), _S_IFDIR)
117 #define S_ISREG(mode)   __S_ISTYPE((mode), _S_IFREG)
118 #endif /* __MINGW32__ */
119
120 /* functions */
121 /*** str ***/
122 int strcasecmp( const char *s1, const char *s2 );
123
124 int strncasecmp( const char *s1, const char *s2, size_t n );
125
126 /*** dir ***/
127 #ifndef __MINGW32__
128 typedef void * HANDLE;
129
130 #ifndef _FINDDATA_T_DEFINED
131 typedef unsigned long _fsize_t; /* Could be 64 bits for Win32 */
132 struct _finddata_t {
133     unsigned    attrib;
134     time_t      time_create;    /* -1 for FAT file systems */
135     time_t      time_access;    /* -1 for FAT file systems */
136     time_t      time_write;
137     _fsize_t    size;
138     char        name[260];
139 };
140 #endif /* !_FINDDATA_T_DEFINED */
141
142 struct dirent {
143         long d_ino;
144         unsigned short d_reclen;
145         unsigned short d_namlen;
146         char d_name[FILENAME_MAX];
147 };
148
149 typedef struct
150 {
151         struct _finddata_t      dd_dta;
152         struct dirent           dd_dir;
153         long                    dd_handle;
154         int                     dd_stat;
155         char                    dd_name[1];
156 } DIR;
157
158 #endif /* !__MINGW32__ */
159
160
161 DIR *opendir( const char *name );
162 int closedir( DIR *dir );
163 struct dirent *readdir( DIR *dir );
164
165 #ifdef __MINGW32__
166 struct timezone {
167   int tz_minuteswest;
168   int tz_dsttime;
169 };
170 #endif
171
172 /*** stat ***/
173 int lstat( const char *file_name, struct stat *buf );
174
175 /*** sys/wait ***/
176 pid_t waitpid( pid_t pid, int *status, int options );
177
178 /*** sys/time ***/
179 int gettimeofday( struct timeval *tv, struct timezone *tz );
180
181 /*** unistd ***/
182 uid_t getuid( void );
183 int setpgid( pid_t pid, pid_t pgid );
184 pid_t getppid( void );
185 pid_t fork( void );
186 unsigned int sleep( unsigned int seconds );
187 int link( const char *oldpath, const char *newpath );
188 int usleep( unsigned long usec );
189
190 /*** stdlib ***/
191 long int random( void );
192 void srandom( unsigned int seed );
193 int truncate( const char *path, off_t length );
194
195 /*** signal ***/
196 int kill( pid_t pid, int sig );
197
198 /*** stdio ***/
199 FILE *popen( const char *command, const char *type );
200 int pclose( FILE *stream );
201
202 /*** w32_account.c ***/
203 int w32_is_administrator (void);
204
205 /*** misc ***/
206 char *read_w32_registry_string( char *parent, char *section, char *key );
207 char *get_content_type_from_registry_with_ext( char *ext );
208
209 \f
210 /* Simulate thread-safe versions of some functions.  */
211 #define gmtime_r(time, resultp) gmtime (time)
212 #define localtime_r(time, resultp) localtime (time)
213 #define asctime_r(time, buffer) asctime (time)
214 #define ctime_r(time, buffer) ctime (time)
215
216 #endif