AmendHub

Download (as of this amendment):

julienxx

/

EasyNet

/

amendments

/

6

initial API implem


julienxx made amendment 6 about 15 hours ago
--- EasyNet.c Sun Oct 25 17:40:19 2026 +++ EasyNet.c Sun Oct 25 17:40:19 2026 @@ -0,0 +1,180 @@ +#include <stdlib.h> +#include <string.h> +#include <Events.h> +#include <OpenTransport.h> +#include <OpenTptInternet.h> +#include "EasyNet.h" + +struct EasyNetConn { + EndpointRef ep; + UInt32 timeoutTicks; +}; + +static void GiveTime(void) +{ + EventRecord event; + + WaitNextEvent(0, &event, 1, NULL); +} + +OSStatus EasyNet_Init(void) +{ + return InitOpenTransport(); +} + +void EasyNet_Shutdown(void) +{ + CloseOpenTransport(); +} + +OSStatus EasyNet_Connect(const char *host, UInt16 port, long timeoutSecs, EasyNetConn **outConn) +{ + OSStatus err; + InetSvcRef inetServices; + InetHostInfo hostInfo; + EasyNetConn *conn; + InetAddress addr; + TCall sndCall; + OTResult event; + UInt32 deadline; + + *outConn = NULL; + + /* look up host */ + inetServices = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err); + if(err != noErr) + return err; + err = OTInetStringToAddress(inetServices, (char *) host, &hostInfo); + OTCloseProvider(inetServices); + if(err != noErr) + return err; + + conn = (EasyNetConn *) malloc(sizeof(EasyNetConn)); + if(conn == NULL) + return memFullErr; + conn->ep = kOTInvalidEndpointRef; + conn->timeoutTicks = timeoutSecs * 60; + + /* create endpoint */ + conn->ep = OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, NULL, &err); + if(err != noErr) + goto fail; + OTSetSynchronous(conn->ep); + OTSetNonBlocking(conn->ep); + + err = OTBind(conn->ep, NULL, NULL); + if(err != noErr) + goto fail; + + /* connect */ + OTInitInetAddress(&addr, port, hostInfo.addrs[0]); + OTMemzero(&sndCall, sizeof(TCall)); + sndCall.addr.buf = (UInt8 *) &addr; + sndCall.addr.len = sizeof(InetAddress); + + err = OTConnect(conn->ep, &sndCall, NULL); + if(err == kOTLookErr) + err = kOTNoDataErr; + + /* wait for conn */ + deadline = TickCount() + conn->timeoutTicks; + while(err == kOTNoDataErr) { + event = OTLook(conn->ep); + if(event == T_CONNECT) { + err = OTRcvConnect(conn->ep, NULL); + } else if(event == T_DISCONNECT) { + OTRcvDisconnect(conn->ep, NULL); + err = kEasyNetConnectFailedErr; + } else if(TickCount() > deadline) { + err = kEasyNetTimeoutErr; + } else { + GiveTime(); + } + } + if(err != noErr) + goto fail; + + *outConn = conn; + return noErr; + +fail: + if(conn->ep != kOTInvalidEndpointRef) + OTCloseProvider(conn->ep); + free(conn); + return err; +} + +OSStatus EasyNet_Send(EasyNetConn *conn, const void *data, long length) +{ + const char *p = (const char *) data; + OTResult result; + UInt32 deadline; + + deadline = TickCount() + conn->timeoutTicks; + while(length > 0) { + result = OTSnd(conn->ep, (void *) p, length, 0); + if(result >0) { + p+= result; + length -= result; + deadline = TickCount() + conn->timeoutTicks; + } else if(result == kOTFlowErr) { + if(TickCount() > deadline) + return kEasyNetTimeoutErr; + GiveTime(); + } else if(result == kOTLookErr) { + return kEasyNetDisconnectedErr; + } else { + return result; + } + } + return noErr; +} + +OSStatus EasyNet_SendString(EasyNetConn *conn, const char *s) +{ + return EasyNet_Send(conn, s, strlen(s)); +} + +long EasyNet_Receive(EasyNetConn *conn, void *buf, long size) +{ + OTResult result; + OTResult event; + OTFlags flags; + UInt32 deadline; + + deadline = TickCount() + conn->timeoutTicks; + for(;;) { + result = OTRcv(conn->ep, buf, size, &flags); + if(result > 0) + return result; + + if(result == kOTLookErr) { + event = OTLook(conn->ep); + if(event == T_ORDREL) { + OTRcvOrderlyDisconnect(conn->ep); + return 0; + } + if(event == T_DISCONNECT) { + OTRcvDisconnect(conn->ep, NULL); + return kEasyNetDisconnectedErr; + } + } else if(result != kOTNoDataErr) { + return result; + } + + if(TickCount() > deadline) + return kEasyNetTimeoutErr; + GiveTime(); + } +} + +void EasyNet_Close(EasyNetConn *conn) +{ + if(conn == NULL) + return; + OTSndOrderlyDisconnect(conn->ep); + OTCloseProvider(conn->ep); + free(conn); +} + + --- EasyNet.h Sun Oct 25 16:52:34 2026 +++ EasyNet.h Sun Oct 25 17:35:46 2026 @@ -8,7 +8,7 @@ enum { kEasyNetTimeoutErr = -30200, kEasyNetConnectFailedErr = -30201, - kEasyNetDisconnectedErr = -30202, + kEasyNetDisconnectedErr = -30202 }; typedef struct EasyNetConn EasyNetConn; --- HelloWorld.c Sun Oct 25 16:19:21 2026 +++ HelloWorld.c Sun Oct 25 17:35:16 2026 @@ -1,175 +1,38 @@ -/* - * © 1997-2000 Metrowerks Corp. - * - * Questions and comments to: - * <mailto:support@metrowerks.com> - * <http://www.metrowerks.com/> - */ - #include <stdio.h> -#include <string.h> -#include <Events.h> -#include <OpenTransport.h> -#include <OpenTptInternet.h> +#include "EasyNet.h" -#define kHost "typed-hole.org" -#define kPort 79 -#define kQuery "julien\015\012" /* julien + CRLF */ -#define kTimeoutTicks (15 * 60) - -static void GiveTime(void) -{ - EventRecord event; - - WaitNextEvent(0, &event, 1, NULL); -} - -static void ReportDisconnect(EndpointRef ep) -{ - TDiscon discon; - - OTMemzero(&discon, sizeof(discon)); - OTRcvDisconnect(ep, &discon); - printf("Connection failed: %ld\n", discon.reason); -} - int main(void) { OSStatus err; - InetSvcRef inetServices = NULL; - InetHostInfo hostInfo; - EndpointRef ep = kOTInvalidEndpointRef; - InetAddress addr; - TCall sndCall; - OTResult result; - OTResult event; - OTFlags flags; - UInt32 deadline; - char addrString[16]; + EasyNetConn *conn; + long n; char buf[512]; - err = InitOpenTransport(); - if(err != noErr){ - printf("InitOpenTransport failed: %ld\n", err); + err = EasyNet_Init(); + if(err != noErr) { + printf("EasyNet_Init failed: %ld\n", err); return 1; } - inetServices = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err); - if(err != noErr){ - printf("OTOpenInternetServices failed: %ld\n", err); - goto done; - } - - err = OTInetStringToAddress(inetServices, kHost, &hostInfo); - if(err != noErr){ - printf("DNS lookup failed: %ld\n", err); - goto done; - } - - /* create TCP endpoint */ - ep = OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, NULL, &err); - if(err != noErr){ - printf("OTOpenEndpoint failed: %ld\n", err); - goto done; - } - OTSetSynchronous(ep); - OTSetBlocking(ep); - - /* bind to local addr */ - err = OTBind(ep, NULL, NULL); - if(err != noErr){ - printf("OTBind failed: %ld\n", err); - goto done; - } - - /* connect server */ - OTInitInetAddress(&addr, kPort, hostInfo.addrs[0]); - OTMemzero(&sndCall, sizeof(TCall)); - sndCall.addr.buf = (UInt8 *) &addr; - sndCall.addr.len = sizeof(InetAddress); - - OTInetHostToString(hostInfo.addrs[0], addrString); - printf("Address: %s port %d\n", addrString, kPort); - - printf("Connecting...\n"); - err = OTConnect(ep, &sndCall, NULL); - if(err == kOTLookErr){ - event = OTLook(ep); - if(event == T_DISCONNECT){ - ReportDisconnect(ep); + err = EasyNet_Connect("typed-hole.org", 79, 15, &conn); + if(err != noErr) { + printf("Connect failed: %ld\n", err); + } else { + err = EasyNet_SendString(conn, "julien" kEasyNetCRLF); + if(err != noErr) { + printf("Send failed: %ld\n", err); } else { - printf("OTConnect: unexpected event %ld\n", event); - } - goto done; - } - if(err != noErr && err != kOTNoDataErr){ - printf("OTConnect failed: %ld\n", err); - goto done; - } - - deadline = TickCount() + kTimeoutTicks; - while(err == kOTNoDataErr){ - event = OTLook(ep); - if(event == T_CONNECT){ - err = OTRcvConnect(ep, NULL); - } else if(event == T_DISCONNECT){ - ReportDisconnect(ep); - } else if(TickCount() > deadline){ - printf("Connect timed out\n"); - goto done; - } else { - GiveTime(); - } - } - if(err != noErr){ - printf("OTRcvConnect failed: %ld\n", err); - goto done; - } - - /* send query */ - result = OTSnd(ep, kQuery, strlen(kQuery), 0); - if(result < 0){ - printf("OTSend failed: %ld\n", err); - goto done; - } - - /* read until conn closed */ - deadline = TickCount() + kTimeoutTicks; - for(;;){ - result = OTRcv(ep, buf, sizeof(buf) - 1, &flags); - if(result > 0){ - buf[result] = '\0'; - printf("%s", buf); - deadline = TickCount() + kTimeoutTicks; - } else if(result == kOTNoDataErr){ - if(TickCount() > deadline) { - printf("\nReceive timed out\n"); - goto done; + while((n = EasyNet_Receive(conn, buf, sizeof(buf) - 1)) > 0) { + buf[n] = '\0'; + printf("%s", buf); } - GiveTime(); - } else { - break; + if(n < 0) + printf("\nReceive failed: %ld\n", n); } + EasyNet_Close(conn); } - /* handle disconnect */ - if(result == kOTLookErr){ - event = OTLook(ep); - if(event == T_ORDREL){ - OTRcvOrderlyDisconnect(ep); - OTSndOrderlyDisconnect(ep); - } else if(event == T_DISCONNECT) { - OTRcvDisconnect(ep, NULL); - } - } else { - printf("OTRcv failed: %ld\n", result); - } - -done: - if(ep != kOTInvalidEndpointRef) - OTCloseProvider(ep); - if(inetServices != NULL) - OTCloseProvider(inetServices); - CloseOpenTransport(); + EasyNet_Shutdown(); return 0; -} \ No newline at end of file +} +