Skip to content

Commit 2365e64

Browse files
committed
Add getPeerName; wraps getpeername + getnameinfo from C std library
1 parent 4cf718c commit 2365e64

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

Diff for: M2/Macaulay2/d/actors2.dd

+15
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use evaluate;
44
use struct;
55
use sets;
66

7+
header "#include <netdb.h>"; -- for NI_MAXHOST and NI_MAXSERV
8+
79
dbmfirst(e:Expr):Expr := (
810
when e
911
is f:Database do dbmfirst(f)
@@ -510,6 +512,19 @@ isListener(e:Expr):Expr := (
510512
is f:file do toExpr(f.listener)
511513
else False);
512514
setupfun("isListener",isListener);
515+
getPeerName(e:Expr):Expr := (
516+
when e
517+
is f:file do (
518+
if f.input then (
519+
host := new string len Ccode(int, "NI_MAXHOST") do provide ' ';
520+
serv := new string len Ccode(int, "NI_MAXSERV") do provide ' ';
521+
r := getpeername(f.infd, host, serv);
522+
if r < 0 then buildErrorPacket(
523+
"can't get peer name: " + netstrerror(r))
524+
else seq(toExpr(host), toExpr(serv)))
525+
else WrongArg("an input file"))
526+
else WrongArg("a file"));
527+
setupfun("getPeerName", getPeerName);
513528

514529
header "
515530
#if WITH_MYSQL

Diff for: M2/Macaulay2/d/scclib.c

+22
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,28 @@ int system_openlistener(M2_string interface0,M2_string serv) {
781781
return sd;
782782
}
783783

784+
int system_getpeername(int sockfd, M2_string host, M2_string serv) {
785+
struct sockaddr addr;
786+
socklen_t addrlen;
787+
int r;
788+
char hostbuf[NI_MAXHOST], servbuf[NI_MAXSERV];
789+
790+
addrlen = sizeof addr;
791+
r = getpeername(sockfd, &addr, &addrlen);
792+
if (r == ERROR)
793+
return ERROR;
794+
795+
r = getnameinfo(&addr, addrlen, hostbuf, sizeof hostbuf,
796+
servbuf, sizeof servbuf, 0);
797+
if (r != 0)
798+
return r + ERROR; /* see note above system_netstrerror */
799+
800+
strncpy(host->array, hostbuf, host->len);
801+
strncpy(serv->array, servbuf, serv->len);
802+
803+
return 0;
804+
}
805+
784806
int system_errno(void) {
785807
return
786808
#ifdef HAVE_HERROR

Diff for: M2/Macaulay2/d/system.d

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ import openlistener(interface:string,serv:string):int;
108108
import netstrerror(errcode:int):string;
109109
import acceptBlocking(sd:int):int;
110110
import acceptNonblocking(sd:int):int;
111+
import getpeername(sockd:int,host:string,serv:string):int;
111112
import syserrmsg():string; -- uses errno
112113
import atend(f:function():void):void;
113114
import run(command:string):int;

Diff for: M2/Macaulay2/m2/exports.m2

+1
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,7 @@ export {
731731
"getIOThreadMode",
732732
"getNetFile",
733733
"getNonUnit",
734+
"getPeerName",
734735
"getPrimeWithRootOfUnity",
735736
"getSymbol",
736737
"getWWW",

0 commit comments

Comments
 (0)