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