summaryrefslogtreecommitdiff
path: root/gen-soconn/gen-soccon.c
blob: 79701bbad1029468e4306b6689acbeff44f64bf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
/****************************************************************************
 *                                                                          *
 *                          GNAT SYSTEM UTILITIES                           *
 *                                                                          *
 *                           G E N - S O C C O N                            *
 *                                                                          *
 *          Copyright (C) 2004-2007, Free Software Foundation, Inc.         *
 *                                                                          *
 * GNAT is free software;  you can  redistribute it  and/or modify it under *
 * terms of the  GNU General Public License as published  by the Free Soft- *
 * ware  Foundation;  either version 2,  or (at your option) any later ver- *
 * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
 * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License *
 * for  more details.  You should have  received  a copy of the GNU General *
 * Public License  distributed with GNAT;  see file COPYING.  If not, write *
 * to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, *
 * Boston, MA 02110-1301, USA.                                              *
 *                                                                          *
 * GNAT was originally developed  by the GNAT team at  New York University. *
 * Extensive contributions were provided by Ada Core Technologies Inc.      *
 *                                                                          *
 ****************************************************************************/

/* This program generates g-soccon.ads */

/*
 * To build using DEC C:
 *
 * CC/DEFINE="TARGET=""OpenVMS""" gen-soccon
 * LINK gen-soccon
 * RUN gen-soccon
 *
 * Note: OpenVMS versions older than 8.3 provide an incorrect value in
 * the DEC C header files for MSG_WAITALL. To generate the VMS version
 * of g-soccon.ads, gen-soccon should be run on an 8.3 or later machine.
 */

#ifndef TARGET
# error Please define TARGET
#endif

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>

#ifdef __MINGW32__
#include <fcntl.h>
#endif

#include "gsocket.h"

struct line {
  char *text;
  char *value;
  char *comment;
  struct line *next;
};

struct line *first = NULL, *last = NULL;

#define TXT(_text) add_line(_text, NULL, NULL);
/* Plain text */

#define _NL TXT("")
/* Empty line */

#define itoad(n) f_itoa ("%d", (n))
#define itoax(n) f_itoa ("16#%08x#", (n))

#define CND(name,comment) add_line(#name, itoad (name), comment);
/* Constant (decimal) */

#define CNX(name,comment) add_line(#name, itoax (name), comment);
/* Constant (hexadecimal) */

#define CN_(name,comment) add_line(#name, name, comment);
/* Constant (generic) */

#define STR(p) STR1(p)
#define STR1(p) #p

void output (void);
/* Generate output spec */

char *f_itoa (char *, int);
/* int to string */

void add_line (char *, char*, char*);

#ifdef __MINGW32__
unsigned int _CRT_fmode = _O_BINARY;
#endif

int
main (void) {

TXT("------------------------------------------------------------------------------")
TXT("--                                                                          --")
TXT("--                         GNAT COMPILER COMPONENTS                         --")
TXT("--                                                                          --")
TXT("--               G N A T . S O C K E T S . C O N S T A N T S                --")
TXT("--                                                                          --")
TXT("--                                 S p e c                                  --")
TXT("--                                                                          --")
TXT("--          Copyright (C) 2000-2007, Free Software Foundation, Inc.         --")
TXT("--                                                                          --")
TXT("-- GNAT is free software;  you can  redistribute it  and/or modify it under --")
TXT("-- terms of the  GNU General Public License as published  by the Free Soft- --")
TXT("-- ware  Foundation;  either version 2,  or (at your option) any later ver- --")
TXT("-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --")
TXT("-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --")
TXT("-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --")
TXT("-- for  more details.  You should have  received  a copy of the GNU General --")
TXT("-- Public License  distributed with GNAT;  see file COPYING.  If not, write --")
TXT("-- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --")
TXT("-- Boston, MA 02110-1301, USA.                                              --")
TXT("--                                                                          --")
TXT("-- As a special exception,  if other files  instantiate  generics from this --")
TXT("-- unit, or you link  this unit with other files  to produce an executable, --")
TXT("-- this  unit  does not  by itself cause  the resulting  executable  to  be --")
TXT("-- covered  by the  GNU  General  Public  License.  This exception does not --")
TXT("-- however invalidate  any other reasons why  the executable file  might be --")
TXT("-- covered by the  GNU Public License.                                      --")
TXT("--                                                                          --")
TXT("-- GNAT was originally developed  by the GNAT team at  New York University. --")
TXT("-- Extensive contributions were provided by Ada Core Technologies Inc.      --")
TXT("--                                                                          --")
TXT("------------------------------------------------------------------------------")
_NL
TXT("--  This package provides target dependent definitions of constant for use")
TXT("--  by the GNAT.Sockets package (g-socket.ads). This package should not be")
TXT("--  directly with'ed by an applications program.")
_NL
TXT("--  This is the version for " TARGET)
TXT("--  This file is generated automatically, do not modify it by hand! Instead,")
TXT("--  make changes to gen-soccon.c and re-run it on each target.")
_NL
TXT("package GNAT.Sockets.Constants is")
_NL
TXT("   --------------")
TXT("   -- Families --")
TXT("   --------------")
_NL

#ifndef AF_INET
#define AF_INET -1
#endif
CND(AF_INET, "IPv4 address family")

#ifndef AF_INET6
#define AF_INET6 -1
#endif
CND(AF_INET6, "IPv6 address family")
_NL
TXT("   -----------")
TXT("   -- Modes --")
TXT("   -----------")
_NL

#ifndef SOCK_STREAM
#define SOCK_STREAM -1
#endif
CND(SOCK_STREAM, "Stream socket")

#ifndef SOCK_DGRAM
#define SOCK_DGRAM -1
#endif
CND(SOCK_DGRAM, "Datagram socket")
_NL
TXT("   -------------------")
TXT("   -- Socket errors --")
TXT("   -------------------")
_NL

#ifndef EACCES
#define EACCES -1
#endif
CND(EACCES, "Permission denied")

#ifndef EADDRINUSE
#define EADDRINUSE -1
#endif
CND(EADDRINUSE, "Address already in use")

#ifndef EADDRNOTAVAIL
#define EADDRNOTAVAIL -1
#endif
CND(EADDRNOTAVAIL, "Cannot assign address")

#ifndef EAFNOSUPPORT
#define EAFNOSUPPORT -1
#endif
CND(EAFNOSUPPORT, "Addr family not supported")

#ifndef EALREADY
#define EALREADY -1
#endif
CND(EALREADY, "Operation in progress")

#ifndef EBADF
#define EBADF -1
#endif
CND(EBADF, "Bad file descriptor")

#ifndef ECONNABORTED
#define ECONNABORTED -1
#endif
CND(ECONNABORTED, "Connection aborted")

#ifndef ECONNREFUSED
#define ECONNREFUSED -1
#endif
CND(ECONNREFUSED, "Connection refused")

#ifndef ECONNRESET
#define ECONNRESET -1
#endif
CND(ECONNRESET, "Connection reset by peer")

#ifndef EDESTADDRREQ
#define EDESTADDRREQ -1
#endif
CND(EDESTADDRREQ, "Destination addr required")

#ifndef EFAULT
#define EFAULT -1
#endif
CND(EFAULT, "Bad address")

#ifndef EHOSTDOWN
#define EHOSTDOWN -1
#endif
CND(EHOSTDOWN, "Host is down")

#ifndef EHOSTUNREACH
#define EHOSTUNREACH -1
#endif
CND(EHOSTUNREACH, "No route to host")

#ifndef EINPROGRESS
#define EINPROGRESS -1
#endif
CND(EINPROGRESS, "Operation now in progress")

#ifndef EINTR
#define EINTR -1
#endif
CND(EINTR, "Interrupted system call")

#ifndef EINVAL
#define EINVAL -1
#endif
CND(EINVAL, "Invalid argument")

#ifndef EIO
#define EIO -1
#endif
CND(EIO, "Input output error")

#ifndef EISCONN
#define EISCONN -1
#endif
CND(EISCONN, "Socket already connected")

#ifndef ELOOP
#define ELOOP -1
#endif
CND(ELOOP, "Too many symbolic lynks")

#ifndef EMFILE
#define EMFILE -1
#endif
CND(EMFILE, "Too many open files")

#ifndef EMSGSIZE
#define EMSGSIZE -1
#endif
CND(EMSGSIZE, "Message too long")

#ifndef ENAMETOOLONG
#define ENAMETOOLONG -1
#endif
CND(ENAMETOOLONG, "Name too long")

#ifndef ENETDOWN
#define ENETDOWN -1
#endif
CND(ENETDOWN, "Network is down")

#ifndef ENETRESET
#define ENETRESET -1
#endif
CND(ENETRESET, "Disconn. on network reset")

#ifndef ENETUNREACH
#define ENETUNREACH -1
#endif
CND(ENETUNREACH, "Network is unreachable")

#ifndef ENOBUFS
#define ENOBUFS -1
#endif
CND(ENOBUFS, "No buffer space available")

#ifndef ENOPROTOOPT
#define ENOPROTOOPT -1
#endif
CND(ENOPROTOOPT, "Protocol not available")

#ifndef ENOTCONN
#define ENOTCONN -1
#endif
CND(ENOTCONN, "Socket not connected")

#ifndef ENOTSOCK
#define ENOTSOCK -1
#endif
CND(ENOTSOCK, "Operation on non socket")

#ifndef EOPNOTSUPP
#define EOPNOTSUPP -1
#endif
CND(EOPNOTSUPP, "Operation not supported")

#ifndef EPFNOSUPPORT
#define EPFNOSUPPORT -1
#endif
CND(EPFNOSUPPORT, "Unknown protocol family")

#ifndef EPROTONOSUPPORT
#define EPROTONOSUPPORT -1
#endif
CND(EPROTONOSUPPORT, "Unknown protocol")

#ifndef EPROTOTYPE
#define EPROTOTYPE -1
#endif
CND(EPROTOTYPE, "Unknown protocol type")

#ifndef ESHUTDOWN
#define ESHUTDOWN -1
#endif
CND(ESHUTDOWN, "Cannot send once shutdown")

#ifndef ESOCKTNOSUPPORT
#define ESOCKTNOSUPPORT -1
#endif
CND(ESOCKTNOSUPPORT, "Socket type not supported")

#ifndef ETIMEDOUT
#define ETIMEDOUT -1
#endif
CND(ETIMEDOUT, "Connection timed out")

#ifndef ETOOMANYREFS
#define ETOOMANYREFS -1
#endif
CND(ETOOMANYREFS, "Too many references")

#ifndef EWOULDBLOCK
#define EWOULDBLOCK -1
#endif
CND(EWOULDBLOCK, "Operation would block")
_NL
TXT("   -----------------")
TXT("   -- Host errors --")
TXT("   -----------------")
_NL

#ifndef HOST_NOT_FOUND
#define HOST_NOT_FOUND -1
#endif
CND(HOST_NOT_FOUND, "Unknown host")

#ifndef TRY_AGAIN
#define TRY_AGAIN -1
#endif
CND(TRY_AGAIN, "Host name lookup failure")

#ifndef NO_DATA
#define NO_DATA -1
#endif
CND(NO_DATA, "No data record for name")

#ifndef NO_RECOVERY
#define NO_RECOVERY -1
#endif
CND(NO_RECOVERY, "Non recoverable errors")
_NL
TXT("   -------------------")
TXT("   -- Control flags --")
TXT("   -------------------")
_NL

#ifndef FIONBIO
#define FIONBIO -1
#endif
CND(FIONBIO, "Set/clear non-blocking io")

#ifndef FIONREAD
#define FIONREAD -1
#endif
CND(FIONREAD, "How many bytes to read")
_NL
TXT("   --------------------")
TXT("   -- Shutdown modes --")
TXT("   --------------------")
_NL

#ifndef SHUT_RD
#define SHUT_RD -1
#endif
CND(SHUT_RD, "No more recv")

#ifndef SHUT_WR
#define SHUT_WR -1
#endif
CND(SHUT_WR, "No more send")

#ifndef SHUT_RDWR
#define SHUT_RDWR -1
#endif
CND(SHUT_RDWR, "No more recv/send")
_NL
TXT("   ---------------------")
TXT("   -- Protocol levels --")
TXT("   ---------------------")
_NL

#ifndef SOL_SOCKET
#define SOL_SOCKET -1
#endif
CND(SOL_SOCKET, "Options for socket level")

#ifndef IPPROTO_IP
#define IPPROTO_IP -1
#endif
CND(IPPROTO_IP, "Dummy protocol for IP")

#ifndef IPPROTO_UDP
#define IPPROTO_UDP -1
#endif
CND(IPPROTO_UDP, "UDP")

#ifndef IPPROTO_TCP
#define IPPROTO_TCP -1
#endif
CND(IPPROTO_TCP, "TCP")
_NL
TXT("   -------------------")
TXT("   -- Request flags --")
TXT("   -------------------")
_NL

#ifndef MSG_OOB
#define MSG_OOB -1
#endif
CND(MSG_OOB, "Process out-of-band data")

#ifndef MSG_PEEK
#define MSG_PEEK -1
#endif
CND(MSG_PEEK, "Peek at incoming data")

#ifndef MSG_EOR
#define MSG_EOR -1
#endif
CND(MSG_EOR, "Send end of record")

#ifndef MSG_WAITALL
#define MSG_WAITALL -1
#endif
CND(MSG_WAITALL, "Wait for full reception")

#ifndef MSG_NOSIGNAL
#define MSG_NOSIGNAL -1
#endif
CND(MSG_NOSIGNAL, "No SIGPIPE on send")

#ifdef __linux__
# define MSG_Forced_Flags "MSG_NOSIGNAL"
#else
# define MSG_Forced_Flags "0"
#endif
CN_(MSG_Forced_Flags, "")
TXT("   --  Flags set on all send(2) calls")

_NL
TXT("   --------------------")
TXT("   -- Socket options --")
TXT("   --------------------")
_NL

#ifndef TCP_NODELAY
#define TCP_NODELAY -1
#endif
CND(TCP_NODELAY, "Do not coalesce packets")

#ifndef SO_REUSEADDR
#define SO_REUSEADDR -1
#endif
CND(SO_REUSEADDR, "Bind reuse local address")

#ifndef SO_REUSEPORT
#define SO_REUSEPORT -1
#endif
CND(SO_REUSEPORT, "Bind reuse port number")

#ifndef SO_KEEPALIVE
#define SO_KEEPALIVE -1
#endif
CND(SO_KEEPALIVE, "Enable keep-alive msgs")

#ifndef SO_LINGER
#define SO_LINGER -1
#endif
CND(SO_LINGER, "Defer close to flush data")

#ifndef SO_BROADCAST
#define SO_BROADCAST -1
#endif
CND(SO_BROADCAST, "Can send broadcast msgs")

#ifndef SO_SNDBUF
#define SO_SNDBUF -1
#endif
CND(SO_SNDBUF, "Set/get send buffer size")

#ifndef SO_RCVBUF
#define SO_RCVBUF -1
#endif
CND(SO_RCVBUF, "Set/get recv buffer size")

#ifndef SO_SNDTIMEO
#define SO_SNDTIMEO -1
#endif
CND(SO_SNDTIMEO, "Emission timeout")

#ifndef SO_RCVTIMEO
#define SO_RCVTIMEO -1
#endif
CND(SO_RCVTIMEO, "Reception timeout")

#ifndef SO_ERROR
#define SO_ERROR -1
#endif
CND(SO_ERROR, "Get/clear error status")

#ifndef IP_MULTICAST_IF
#define IP_MULTICAST_IF -1
#endif
CND(IP_MULTICAST_IF, "Set/get mcast interface")

#ifndef IP_MULTICAST_TTL
#define IP_MULTICAST_TTL -1
#endif
CND(IP_MULTICAST_TTL, "Set/get multicast TTL")

#ifndef IP_MULTICAST_LOOP
#define IP_MULTICAST_LOOP -1
#endif
CND(IP_MULTICAST_LOOP, "Set/get mcast loopback")

#ifndef IP_ADD_MEMBERSHIP
#define IP_ADD_MEMBERSHIP -1
#endif
CND(IP_ADD_MEMBERSHIP, "Join a multicast group")

#ifndef IP_DROP_MEMBERSHIP
#define IP_DROP_MEMBERSHIP -1
#endif
CND(IP_DROP_MEMBERSHIP, "Leave a multicast group")

_NL
TXT("   -------------------")
TXT("   -- System limits --")
TXT("   -------------------")
_NL

#ifndef IOV_MAX
#define IOV_MAX INT_MAX
#endif
CND(IOV_MAX, "Maximum writev iovcnt")

_NL
TXT("   ----------------------")
TXT("   -- Type definitions --")
TXT("   ----------------------")
_NL

{
  struct timeval tv;
TXT("   --  Sizes (in bytes) of the components of struct timeval")
_NL
#define SIZEOF_tv_sec (sizeof tv.tv_sec)
CND(SIZEOF_tv_sec, "tv_sec")
#define SIZEOF_tv_usec (sizeof tv.tv_usec)
CND(SIZEOF_tv_usec, "tv_usec")
}

_NL
TXT("   ----------------------------------------")
TXT("   -- Properties of supported interfaces --")
TXT("   ----------------------------------------")
_NL

CND(Need_Netdb_Buffer, "Need buffer for Netdb ops")

#ifdef __vxworks
_NL
TXT("   --------------------------------")
TXT("   -- VxWorks-specific constants --")
TXT("   --------------------------------")
_NL
TXT("   --  These constants may be used only within the VxWorks version of")
TXT("   --  GNAT.Sockets.Thin.")
_NL

CND(OK,    "VxWorks generic success")
CND(ERROR, "VxWorks generic error")
#endif

#ifdef __MINGW32__
_NL
TXT("   ------------------------------")
TXT("   -- MinGW-specific constants --")
TXT("   ------------------------------")
_NL
TXT("   --  These constants may be used only within the MinGW version of")
TXT("   --  GNAT.Sockets.Thin.")
_NL

CND(WSASYSNOTREADY,     "System not ready")
CND(WSAVERNOTSUPPORTED, "Version not supported")
CND(WSANOTINITIALISED,  "Winsock not intialized")
CND(WSAEDISCON,         "Disconnected")

#endif

_NL
TXT("   ----------------------")
TXT("   -- Additional flags --")
TXT("   ----------------------")
_NL
TXT("   Thread_Blocking_IO : constant Boolean := True;")
TXT("   --  Set False for contexts where socket i/o are process blocking")

_NL
TXT("end GNAT.Sockets.Constants;")

  output ();
  return 0;
}

void
output (void) {
  int text_max = 0, value_max = 0, l;
  struct line *p;
  char fmt[64];
#define UPD_MAX(x) do { \
  l = strlen (p->x); \
  if (l > x ## _max) x ## _max = l; \
} while (0)

  for (p = first; p != NULL; p = p->next) {
    if (p->value != NULL) {
      UPD_MAX(text);
      UPD_MAX(value);
    }
  }
  sprintf (fmt, "   %%-%ds : constant := %%%ds;%%s%%s\n",
    text_max, value_max);

  for (p = first; p != NULL; p = p->next) {
    if (p->value == NULL) {
      printf ("%s\n", p->text);
    } else {
      char *comment_sep = (strlen (p->comment) > 0)
                          ? " --  " : "";
      printf (fmt, p->text, p->value, comment_sep, p->comment);
    }
  }
}

char *
f_itoa (char *fmt, int n) {
  char buf[32], *ret;
  sprintf (buf, fmt, n);
  ret = malloc (strlen (buf) + 1);
  if (ret != NULL)
    strcpy (ret, buf);
  return ret;
}

void
add_line (char *_text, char *_value, char *_comment) {
  struct line *l = (struct line *) malloc (sizeof (struct line));

  l->text = _text;
  l->value = _value;
  l->comment = _comment;
  l->next = NULL;
  if (last == NULL)
    first = last = l;
  else {
    last->next = l;
    last = l;
  }
}