Detect unsigned time_t and adjust y2038 detection.
[gnupg.git] / util / assuan-defs.h
1 /* assuan-defs.c - Internal definitions to Assuan
2  *      Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
3  *      Copyright (C) 2005 Free Software Foundation, Inc.
4  *
5  * This file is part of Assuan.
6  *
7  * Assuan is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as
9  * published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  *
12  * Assuan is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 /* Please note that this is a stripped down and modified version of
22    the orginal Assuan code from libassuan. */
23
24
25 #ifndef ASSUAN_DEFS_H
26 #define ASSUAN_DEFS_H
27
28 #include <sys/types.h>
29 #ifndef HAVE_W32_SYSTEM
30 #include <sys/socket.h>
31 #include <sys/un.h>
32 #else
33 #include <windows.h>
34 #endif
35 #include <unistd.h>
36
37 #include "assuan.h"
38 #include "memory.h"
39
40 #ifndef HAVE_W32_SYSTEM
41 #define DIRSEP_C '/'
42 #else
43 #define DIRSEP_C '\\'
44 #endif
45
46 #ifdef HAVE_W32_SYSTEM
47 #define AF_LOCAL AF_UNIX
48 /* We need to prefix the structure with a sockaddr_in header so we can
49    use it later for sendto and recvfrom. */
50 struct sockaddr_un
51 {
52   short          sun_family;
53   unsigned short sun_port;
54   struct         in_addr sun_addr;
55   char           sun_path[108-2-4]; /* Path name.  */
56 };
57
58 /* Not needed anymore because the current mingw32 defines this in
59    sys/types.h */
60 /* typedef int ssize_t; */
61
62 /* Missing W32 functions */
63 int putc_unlocked (int c, FILE *stream);
64 void * memrchr (const void *block, int c, size_t size);
65 char * stpcpy (char *dest, const char *src);
66 #endif
67
68 #define LINELENGTH ASSUAN_LINELENGTH
69
70 struct cmdtbl_s
71 {
72   const char *name;
73   int (*handler)(assuan_context_t, char *line);
74 };
75
76 struct assuan_io
77 {
78   /* Routine to read from input_fd.  */
79   ssize_t (*readfnc) (assuan_context_t, void *, size_t);
80   /* Routine to write to output_fd.  */
81   ssize_t (*writefnc) (assuan_context_t, const void *, size_t);
82   /* Send a file descriptor.  */
83   assuan_error_t (*sendfd) (assuan_context_t, int);
84   /* Receive a file descriptor.  */
85   assuan_error_t (*receivefd) (assuan_context_t, int *);
86 };  
87
88 struct assuan_context_s
89 {
90   assuan_error_t err_no;
91   const char *err_str;
92   int os_errno;  /* last system error number used with certain error codes*/
93
94   int confidential;
95   int is_server;  /* set if this is context belongs to a server */
96   int in_inquire;
97   char *hello_line;
98   char *okay_line; /* see assan_set_okay_line() */
99   
100   void *user_pointer;  /* for assuan_[gs]et_pointer () */
101
102   FILE *log_fp;
103
104   struct {
105     int fd;
106     int eof;
107     char line[LINELENGTH];
108     int linelen;  /* w/o CR, LF - might not be the same as
109                      strlen(line) due to embedded nuls. However a nul
110                      is always written at this pos */
111     struct {
112       char line[LINELENGTH];
113       int linelen ;
114       int pending; /* i.e. at least one line is available in the attic */
115     } attic;
116   } inbound;
117
118   struct {
119     int fd;
120     struct {
121       FILE *fp;
122       char line[LINELENGTH];
123       int linelen; 
124       int error;
125     } data; 
126   } outbound;
127
128   int pipe_mode;  /* We are in pipe mode, i.e. we can handle just one
129                      connection and must terminate then */
130   pid_t pid;      /* The the pid of the peer. */
131   int listen_fd;  /* The fd we are listening on (used by socket servers) */
132   int connected_fd; /* helper */
133
134   /* Used for Unix domain sockets.  */
135   struct sockaddr_un myaddr;
136   struct sockaddr_un serveraddr;
137   /* When reading from datagram sockets, we must read an entire
138      message at a time.  This means that we have to do our own
139      buffering to be able to get the semantics of read.  */
140   void *domainbuffer;
141   /* Offset of start of buffer.  */
142   int domainbufferoffset;
143   /* Bytes buffered.  */
144   int domainbuffersize;
145   /* Memory allocated.  */
146   int domainbufferallocated;
147
148   int *pendingfds;
149   int pendingfdscount;
150
151   void (*deinit_handler)(assuan_context_t);  
152   int (*accept_handler)(assuan_context_t);
153   int (*finish_handler)(assuan_context_t);
154
155   struct cmdtbl_s *cmdtbl;
156   size_t cmdtbl_used; /* used entries */
157   size_t cmdtbl_size; /* allocated size of table */
158
159   void (*bye_notify_fnc)(assuan_context_t);
160   void (*reset_notify_fnc)(assuan_context_t);
161   void (*cancel_notify_fnc)(assuan_context_t);
162   int  (*option_handler_fnc)(assuan_context_t,const char*, const char*);
163   void (*input_notify_fnc)(assuan_context_t, const char *);
164   void (*output_notify_fnc)(assuan_context_t, const char *);
165
166   int input_fd;   /* set by INPUT command */
167   int output_fd;  /* set by OUTPUT command */
168
169   /* io routines.  */
170   struct assuan_io *io;
171 };
172
173 /*-- assuan-pipe-server.c --*/
174 int _assuan_new_context (assuan_context_t *r_ctx);
175 void _assuan_release_context (assuan_context_t ctx);
176
177 /*-- assuan-domain-connect.c --*/
178 /* Make a connection to the Unix domain socket NAME and return a new
179    Assuan context in CTX.  SERVER_PID is currently not used but may
180    become handy in the future.  */
181 assuan_error_t _assuan_domain_init (assuan_context_t *r_ctx,
182                                  int rendezvousfd,
183                                  pid_t peer);
184
185 /*-- assuan-handler.c --*/
186 int _assuan_register_std_commands (assuan_context_t ctx);
187
188 /*-- assuan-buffer.c --*/
189 int _assuan_read_line (assuan_context_t ctx);
190 int _assuan_cookie_write_data (void *cookie, const char *buffer, size_t size);
191 int _assuan_cookie_write_flush (void *cookie);
192 assuan_error_t _assuan_write_line (assuan_context_t ctx, const char *prefix,
193                                    const char *line, size_t len);
194
195 /*-- assuan-client.c --*/
196 assuan_error_t _assuan_read_from_server (assuan_context_t ctx, int *okay, int *off);
197
198
199 /*-- assuan-util.c --*/
200
201 #define set_error(c,e,t) assuan_set_error ((c), ASSUAN_ ## e, (t))
202
203 void _assuan_log_print_buffer (FILE *fp, const void *buffer, size_t  length);
204 void _assuan_log_sanitized_string (const char *string);
205
206 #ifdef HAVE_W32_SYSTEM
207 const char *_assuan_w32_strerror (int ec);
208 #define w32_strerror(e) _assuan_w32_strerror ((e))
209 #endif /*HAVE_W32_SYSTEM*/
210
211
212 /*-- assuan-logging.c --*/
213 void _assuan_set_default_log_stream (FILE *fp);
214
215 void _assuan_log_printf (const char *format, ...)
216 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
217  __attribute__ ((format (printf,1,2)))
218 #endif
219      ;
220
221 /*-- assuan-io.c --*/
222 ssize_t _assuan_simple_read (assuan_context_t ctx, void *buffer, size_t size);
223 ssize_t _assuan_simple_write (assuan_context_t ctx, const void *buffer,
224                               size_t size);
225
226 /*-- assuan-socket.c --*/
227 int _assuan_close (int fd);
228 int _assuan_sock_new (int domain, int type, int proto);
229 int _assuan_sock_connect (int sockfd, struct sockaddr *addr, int addrlen);
230
231 #ifdef HAVE_FOPENCOOKIE
232 /* We have to implement funopen in terms of glibc's fopencookie. */
233 FILE *_assuan_funopen(void *cookie,
234                       cookie_read_function_t *readfn,
235                       cookie_write_function_t *writefn,
236                       cookie_seek_function_t *seekfn,
237                       cookie_close_function_t *closefn);
238 #define funopen(a,r,w,s,c) _assuan_funopen ((a), (r), (w), (s), (c))
239 #endif /*HAVE_FOPENCOOKIE*/
240
241 #endif /*ASSUAN_DEFS_H*/
242