diff -uNr a/udp/echodemo/udp_echo_demo.adb b/udp/echodemo/udp_echo_demo.adb --- a/udp/echodemo/udp_echo_demo.adb 8338a018f49bee220073e50372407c6a47e2cd77847aec8c73734dd0dc7060e750a5df4306b8d955c220d49560926987dab99b35615f5e5c7721d818ec0fac22 +++ b/udp/echodemo/udp_echo_demo.adb a6e98002db245b44e419a00d9072828ecaf768b7bf82590cc37d6880d6bdfad05ac64c4ec39d7a3871ecf7c247a1f413185d14cc97ae2ebc7507dc40c0cf7d8a @@ -64,6 +64,8 @@ end if; + UDP.Close_Socket(Socket); + Put_Line("Done."); end UDP_Echo_Demo; diff -uNr a/udp/libudp/restrict.adc b/udp/libudp/restrict.adc --- a/udp/libudp/restrict.adc 68ce604c3473b8e39860974754a353618ba8f1f34a3038c111d0cf64e4558a9bc909f63368bf71d076c4895129ac2efb5f44e27f03b7fb38d515acd4e6da2e62 +++ b/udp/libudp/restrict.adc 0ce47e877e69cdc718556d94802736a36d5289bac7d5c58f4faffc75f0fe8f461f4799705e9b29f89e071c51141bd88b2d73917271170f7fd771ed288ad07215 @@ -45,6 +45,7 @@ pragma Restrictions(No_Floating_Point); pragma Restrictions(No_Implementation_Aspect_Specifications); pragma Restrictions(No_Implementation_Units); +pragma Restrictions(No_Implicit_Conditionals); pragma Restrictions(No_Implicit_Dynamic_Code); pragma Restrictions(No_Implicit_Heap_Allocations); pragma Restrictions(No_Implicit_Protected_Object_Allocations); diff -uNr a/udp/libudp/udp.adb b/udp/libudp/udp.adb --- a/udp/libudp/udp.adb 08d9e728f35338aca8cbd7b2d0d1a124f731e286c15df2e65c4d7c9bb6bf750cd44acbb818eca656bfd3402b77927c300693978576622e6e241c2f00824cc7fe +++ b/udp/libudp/udp.adb de0cec9ced66f9d083e9c7dd1f2e02586e36481701f3b8c988f500f521454dc8ca51797961e1e773edffb7a96ad6d9b4f277b47aab056b7e313c23b8677baff3 @@ -71,7 +71,7 @@ end Open_Socket; - -- Permanently close the given open given socket + -- Permanently close the given open socket procedure Close_Socket(S : in out Socket) is begin Unix_UDP_Socket_Close(Socket => S'Address); @@ -94,8 +94,11 @@ Close_Socket(S); raise UDP_Failed_Transmit; when others => - -- No eggog - null; + -- No eggog, but must check if sent all bytes: + if (Result /= Payload'Length) then + Close_Socket(S); + raise UDP_Truncated_Send; + end if; end case; end Transmit; diff -uNr a/udp/libudp/udp.ads b/udp/libudp/udp.ads --- a/udp/libudp/udp.ads e5225e08aad2ecdaa42e10638fff93c70f5756ad293cc7fca22dfb156583dbef132eeaf48eb36b6614637dd22efefb5cfc43fd724456e9e80e39acc1742d157e +++ b/udp/libudp/udp.ads 41d0512d8759cbcb10d753a22a86b6bdaf96fccf779e2bbdabf4a1c7efca7a4f8f9047984d6cc2350b7625715aac26c0ccd49c7baca765811e0c0bcc0ababf22 @@ -30,7 +30,6 @@ type Payload is array(1 .. Payload_Size) of Unsigned_8; - -- type IP_Address is array(1 .. 4) of Unsigned_8; subtype IP_Address is Unsigned_32; subtype IP_Port is Unsigned_16; @@ -63,7 +62,7 @@ procedure Open_Socket(S : out Socket; Local_Endpoint : in Endpoint); - -- Permanently close the given open given socket + -- Permanently close the given open socket procedure Close_Socket(S : in out Socket); -- Transmit the Payload, via Socket, to given Destination @@ -84,6 +83,7 @@ UDP_Failed_SetOpt : exception; UDP_Failed_Bind : exception; UDP_Failed_Transmit : exception; + UDP_Truncated_Send : exception; UDP_Failed_Receive : exception; private diff -uNr a/udp/libudp/unix_udp.c b/udp/libudp/unix_udp.c --- a/udp/libudp/unix_udp.c 1ce3fce5802bd1c1df524a6c3e1c9b2a45c62535d72602be8c7ef81e47cc543ce4d150ae2f1dca99d7b77f64209d2f47789ae08dee79473009f0531df1b77aa0 +++ b/udp/libudp/unix_udp.c 575886decfb03275e991dad5372d9f29627e287a3ae29e920b817f7f57f72fd672e09e800bc07166fa6ed97436d66e4c9f0cb06329468b13102758db3b76f90e @@ -41,6 +41,7 @@ char *txt = inet_ntoa(addr); strncpy(buf, txt, buf_size); } +/* Should be replaced with native routine */ /* string to local-endian ip conversion */ @@ -51,6 +52,7 @@ *ip = ntohl(addr.s_addr); return 0; } +/* Should be replaced with native routine */ int unix_udp_socket_open(UDP_Socket *S, diff -uNr a/udp/manifest b/udp/manifest --- a/udp/manifest 5e6a00d7ade4d49943694a4158f8e30c101a0fd47116632d6ab4ec42358d506b0e4ebce8d199a5dfbd6b6684a3e2da67f50509e4ad19707f405cfe4e07599242 +++ b/udp/manifest c2719877ad84bd2cf788458df5eb16341e0151e867afa8b8b20faf9f10a8b1723123f19b581dab0627458350e6ab26be87ec84ac94f80f29d61778df5705a969 @@ -1 +1,2 @@ 543080 udp_genesis diana_coman Regrind of asciilifeform's UDP lib genesis, to bring it to current format (Keccak hashes, manifest file and standard compliant names for vpatches). A minimal library for UDP communications with fixed-size payloads sent/received over the wire. Uses Ada and C code. +543081 udp_errata_asciilifeform diana_coman Regrind of asciilifeform's errata on his UDP lib: adds closing socket calls, corrects and adds to comments. diff -uNr a/udp/txdemo/udp_tx_demo.adb b/udp/txdemo/udp_tx_demo.adb --- a/udp/txdemo/udp_tx_demo.adb 40398049eb151a9d306259d68a3865847c6591020ad12da0d9e374df9b5b8b7c2812576ed9298e83b115ac6636fe402b398c0810287e0cbf7904a05d2632f918 +++ b/udp/txdemo/udp_tx_demo.adb ac6e202cf85466c26f782a0984478965c720f519fd72df0759839692ba751f7853826adf7281a110a527dfb369dfbbc0aedd3b66d20cf34502a937675ec33980 @@ -88,6 +88,8 @@ end if; + UDP.Close_Socket(Socket); + Put_Line("Done."); end UDP_Tx_Demo;