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
+}
+