1#!/usr/bin/tclsh
2#*
3#* SRT - Secure, Reliable, Transport
4#* Copyright (c) 2020 Haivision Systems Inc.
5#*
6#* This Source Code Form is subject to the terms of the Mozilla Public
7#* License, v. 2.0. If a copy of the MPL was not distributed with this
8#* file, You can obtain one at http://mozilla.org/MPL/2.0/.
9#*
10#*/
11#
12#*****************************************************************************
13#written by
14#  Haivision Systems Inc.
15#*****************************************************************************
16
17set code_major {
18    UNKNOWN    -1
19    SUCCESS     0
20    SETUP       1
21    CONNECTION  2
22    SYSTEMRES   3
23    FILESYSTEM  4
24    NOTSUP      5
25    AGAIN       6
26    PEERERROR   7
27}
28
29set code_minor {
30    NONE             0
31    TIMEOUT          1
32    REJECTED         2
33    NORES            3
34    SECURITY         4
35    CLOSED           5
36
37
38    CONNLOST         1
39    NOCONN           2
40
41    THREAD           1
42    MEMORY           2
43    OBJECT           3
44
45    SEEKGFAIL        1
46    READFAIL         2
47    SEEKPFAIL        3
48    WRITEFAIL        4
49
50    ISBOUND          1
51    ISCONNECTED      2
52    INVAL            3
53    SIDINVAL         4
54    ISUNBOUND        5
55    NOLISTEN         6
56    ISRENDEZVOUS     7
57    ISRENDUNBOUND    8
58    INVALMSGAPI      9
59    INVALBUFFERAPI  10
60    BUSY            11
61    XSIZE           12
62    EIDINVAL        13
63    EEMPTY          14
64    BUSYPORT        15
65
66    WRAVAIL          1
67    RDAVAIL          2
68    XMTIMEOUT        3
69    CONGESTION       4
70}
71
72
73set errortypes {
74
75    SUCCESS "Success" {
76        NONE      ""
77    }
78
79    SETUP "Connection setup failure" {
80        NONE      ""
81        TIMEOUT   "connection timed out"
82        REJECTED  "connection rejected"
83        NORES     "unable to create/configure SRT socket"
84        SECURITY  "aborted for security reasons"
85        CLOSED    "socket closed during operation"
86    }
87
88    CONNECTION "" {
89        NONE     ""
90        CONNLOST "Connection was broken"
91        NOCONN   "Connection does not exist"
92    }
93
94    SYSTEMRES "System resource failure" {
95        NONE   ""
96        THREAD "unable to create new threads"
97        MEMORY "unable to allocate buffers"
98        OBJECT "unable to allocate a system object"
99    }
100
101    FILESYSTEM "File system failure" {
102        NONE      ""
103        SEEKGFAIL "cannot seek read position"
104        READFAIL  "failure in read"
105        SEEKPFAIL "cannot seek write position"
106        WRITEFAIL "failure in write"
107    }
108
109    NOTSUP "Operation not supported" {
110        NONE           ""
111        ISBOUND        "Cannot do this operation on a BOUND socket"
112        ISCONNECTED    "Cannot do this operation on a CONNECTED socket"
113        INVAL          "Bad parameters"
114        SIDINVAL       "Invalid socket ID"
115        ISUNBOUND      "Cannot do this operation on an UNBOUND socket"
116        NOLISTEN       "Socket is not in listening state"
117        ISRENDEZVOUS   "Listen/accept is not supported in rendezous connection setup"
118        ISRENDUNBOUND  "Cannot call connect on UNBOUND socket in rendezvous connection setup"
119        INVALMSGAPI    "Incorrect use of Message API (sendmsg/recvmsg)."
120        INVALBUFFERAPI "Incorrect use of Buffer API (send/recv) or File API (sendfile/recvfile)."
121        BUSY           "Another socket is already listening on the same port"
122        XSIZE          "Message is too large to send (it must be less than the SRT send buffer size)"
123        EIDINVAL       "Invalid epoll ID"
124        EEMPTY         "All sockets removed from epoll, waiting would deadlock"
125        BUSYPORT       "Another socket is bound to that port and is not reusable for requested settings"
126    }
127
128    AGAIN "Non-blocking call failure" {
129        NONE       ""
130        WRAVAIL    "no buffer available for sending"
131        RDAVAIL    "no data available for reading"
132        XMTIMEOUT  "transmission timed out"
133        CONGESTION "early congestion notification"
134    }
135
136    PEERERROR "The peer side has signaled an error" {
137        NONE ""
138    }
139
140}
141
142set main_array_item {
143const char** strerror_array_major [] = {
144$minor_array_list
145};
146}
147
148set major_size_item {
149const size_t strerror_array_sizes [] = {
150$minor_array_sizes
151};
152}
153
154set minor_array_item {
155const char* strerror_msgs_$majorlc [] = {
156$minor_message_items
157};
158}
159
160set strerror_function {
161const char* strerror_get_message(size_t major, size_t minor)
162{
163    static const char* const undefined = "UNDEFINED ERROR";
164
165    // Extract the major array
166    if (major >= sizeof(strerror_array_major)/sizeof(const char**))
167    {
168        return undefined;
169    }
170
171    const char** array = strerror_array_major[major];
172    size_t size = strerror_array_sizes[major];
173
174    if (minor >= size)
175    {
176        return undefined;
177    }
178
179    return array[minor];
180}
181
182}
183
184set globalheader {
185 /*
186  WARNING: Generated from ../scripts/generate-error-types.tcl
187
188  DO NOT MODIFY.
189
190  Copyright applies as per the generator script.
191 */
192
193#include <cstddef>
194
195}
196
197proc Generate:imp {} {
198
199    puts $::globalheader
200
201    puts "namespace srt\n\{"
202
203    # Generate major array
204    set majitem 0
205    set minor_array_sizes ""
206    foreach {mt mm cont} $::errortypes {
207
208        puts "// MJ_$mt '$mm'"
209
210        # Generate minor array
211        set majorlc [string tolower $mt]
212        set minor_message_items ""
213        set minitem 0
214        foreach {mnt mnm} $cont {
215            if {$mm == ""} {
216                set msg $mnm
217            } elseif {$mnm == ""} {
218                set msg $mm
219            } else {
220                set msg "$mm: $mnm"
221            }
222            append minor_message_items "    \"$msg\", // MN_$mnt = $minitem\n"
223            incr minitem
224        }
225        append minor_message_items "    \"\""
226        puts [subst -nobackslashes -nocommands $::minor_array_item]
227
228        append minor_array_list "    strerror_msgs_$majorlc, // MJ_$mt = $majitem\n"
229        #append minor_array_sizes "    [expr {$minitem}],\n"
230        append minor_array_sizes "    SRT_ARRAY_SIZE(strerror_msgs_$majorlc) - 1,\n"
231        incr majitem
232    }
233    append minor_array_list "    NULL"
234    append minor_array_sizes "    0"
235
236    puts [subst -nobackslashes -nocommands $::main_array_item]
237    puts {#define SRT_ARRAY_SIZE(ARR) sizeof(ARR) / sizeof(ARR[0])}
238    puts [subst -nobackslashes -nocommands $::major_size_item]
239
240    puts $::strerror_function
241
242    puts "\} // namespace srt"
243}
244
245
246set defmode imp
247if {[lindex $argv 0] != ""} {
248    set defmode [lindex $argv 0]
249}
250
251Generate:$defmode
252