Skip to content

Commit d78b6ec

Browse files
committed
Add getSocketName function
1 parent 93f8cf1 commit d78b6ec

File tree

4 files changed

+32
-2
lines changed

4 files changed

+32
-2
lines changed

M2/Macaulay2/d/actors2.dd

+16
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,22 @@ getPeerName(e:Expr):Expr := (
526526
else WrongArg("an input file"))
527527
else WrongArg("a file"));
528528
setupfun("getPeerName", getPeerName);
529+
getSocketName(e:Expr):Expr := (
530+
when e
531+
-- # typical value: getSocketName, File, Sequence
532+
is f:file do (
533+
fd := 0;
534+
if f.listener then fd = f.listenerfd
535+
else if f.output then fd = f.outfd
536+
else return WrongArg("a listener or output file");
537+
host := new string len Ccode(int, "NI_MAXHOST") do provide ' ';
538+
serv := new string len Ccode(int, "NI_MAXSERV") do provide ' ';
539+
r := getsockname(fd, host, serv);
540+
if r < 0 then buildErrorPacket(
541+
"can't get socket name: " + netstrerror(r))
542+
else seq(toExpr(host), toExpr(serv)))
543+
else WrongArg("a file"));
544+
setupfun("getSocketName", getSocketName);
529545

530546
header "
531547
#if WITH_MYSQL

M2/Macaulay2/d/scclib.c

+14-2
Original file line numberDiff line numberDiff line change
@@ -781,14 +781,18 @@ 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) {
784+
int getpeerorsockname(int sockfd, M2_string host, M2_string serv, int peer) {
785785
struct sockaddr addr;
786786
socklen_t addrlen;
787787
int i, r;
788788
char hostbuf[NI_MAXHOST], servbuf[NI_MAXSERV];
789789

790790
addrlen = sizeof addr;
791-
r = getpeername(sockfd, &addr, &addrlen);
791+
if (peer)
792+
r = getpeername(sockfd, &addr, &addrlen);
793+
else
794+
r = getsockname(sockfd, &addr, &addrlen);
795+
792796
if (r == ERROR)
793797
return ERROR;
794798

@@ -809,6 +813,14 @@ int system_getpeername(int sockfd, M2_string host, M2_string serv) {
809813
return 0;
810814
}
811815

816+
int system_getpeername(int sockfd, M2_string host, M2_string serv) {
817+
return getpeerorsockname(sockfd, host, serv, 1);
818+
}
819+
820+
int system_getsockname(int sockfd, M2_string host, M2_string serv) {
821+
return getpeerorsockname(sockfd, host, serv, 0);
822+
}
823+
812824
int system_errno(void) {
813825
return
814826
#ifdef HAVE_HERROR

M2/Macaulay2/d/system.d

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ import netstrerror(errcode:int):string;
109109
import acceptBlocking(sd:int):int;
110110
import acceptNonblocking(sd:int):int;
111111
import getpeername(sockd:int,host:string,serv:string):int;
112+
import getsockname(sockd:int,host:string,serv:string):int;
112113
import syserrmsg():string; -- uses errno
113114
import atend(f:function():void):void;
114115
import run(command:string):int;

M2/Macaulay2/m2/exports.m2

+1
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,7 @@ export {
733733
"getNonUnit",
734734
"getPeerName",
735735
"getPrimeWithRootOfUnity",
736+
"getSocketName",
736737
"getSymbol",
737738
"getWWW",
738739
"getc",

0 commit comments

Comments
 (0)