Skip to content

Commit 6e2af00

Browse files
committed
feat: ioctl outq
1 parent 35dfc90 commit 6e2af00

File tree

4 files changed

+32
-2
lines changed

4 files changed

+32
-2
lines changed

erts/emulator/nifs/common/prim_socket_nif.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2405,6 +2405,7 @@ ERL_NIF_TERM esock_atom_socket_tag; // This has a "special" name ('$socket')
24052405
LOCAL_ATOM_DECL(nread); \
24062406
LOCAL_ATOM_DECL(nspace); \
24072407
LOCAL_ATOM_DECL(nwrite); \
2408+
LOCAL_ATOM_DECL(outq); \
24082409
LOCAL_ATOM_DECL(null); \
24092410
LOCAL_ATOM_DECL(num_acceptors); \
24102411
LOCAL_ATOM_DECL(num_cnt_bits); \
@@ -4881,6 +4882,10 @@ ERL_NIF_TERM esock_supports_ioctl_requests(ErlNifEnv* env)
48814882
requests = MKC(env, MKT2(env, atom_nspace, MKUL(env, FIONSPACE)), requests);
48824883
#endif
48834884

4885+
#if defined(TIOCOUTQ)
4886+
requests = MKC(env, MKT2(env, atom_outq, MKUL(env, TIOCOUTQ)), requests);
4887+
#endif
4888+
48844889
#if defined(SIOCATMARK)
48854890
requests = MKC(env, MKT2(env, atom_atmark, MKUL(env, SIOCATMARK)), requests);
48864891
#endif

erts/emulator/nifs/unix/unix_socket_syncio.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,13 @@ static ERL_NIF_TERM essio_ioctl_gifconf(ErlNifEnv* env,
450450
#define IOCTL_FIONSPACE_FUNC2_DEF
451451
#endif
452452

453+
/* esock_ioctl_tiocoutq */
454+
#if defined(TIOCOUTQ)
455+
#define IOCTL_TIOCOUTQ_FUNC2_DEF IOCTL_GET_FUNC2_DEF(siocoutq)
456+
#else
457+
#define IOCTL_TIOCOUTQ_FUNC2_DEF
458+
#endif
459+
453460
/* esock_ioctl_siocatmark */
454461
#if defined(SIOCATMARK)
455462
#define IOCTL_SIOCATMARK_FUNC2_DEF IOCTL_GET_FUNC2_DEF(siocatmark)
@@ -461,6 +468,7 @@ static ERL_NIF_TERM essio_ioctl_gifconf(ErlNifEnv* env,
461468
IOCTL_FIONREAD_FUNC2_DEF; \
462469
IOCTL_FIONWRITE_FUNC2_DEF; \
463470
IOCTL_FIONSPACE_FUNC2_DEF; \
471+
IOCTL_TIOCOUTQ_FUNC2_DEF; \
464472
IOCTL_SIOCATMARK_FUNC2_DEF;
465473
#define IOCTL_GET_FUNC2_DEF(F) \
466474
static ERL_NIF_TERM essio_ioctl_##F(ErlNifEnv* env, \
@@ -3865,6 +3873,12 @@ ERL_NIF_TERM essio_ioctl2(ErlNifEnv* env,
38653873
break;
38663874
#endif
38673875

3876+
#if defined(TIOCOUTQ)
3877+
case TIOCOUTQ:
3878+
return essio_ioctl_siocoutq(env, descP);
3879+
break;
3880+
#endif
3881+
38683882
#if defined(SIOCATMARK)
38693883
case SIOCATMARK:
38703884
return essio_ioctl_siocatmark(env, descP);
@@ -4193,10 +4207,19 @@ ERL_NIF_TERM essio_ioctl_gifconf(ErlNifEnv* env,
41934207
#define IOCTL_FIONSPACE_FUNC2_DECL
41944208
#endif
41954209

4210+
/* *** essio_ioctl_siocoutq *** */
4211+
#if defined(TIOCOUTQ)
4212+
#define IOCTL_TIOCOUTQ_FUNC2_DECL \
4213+
IOCTL_GET_REQUEST2_DECL(siocoutq, TIOCOUTQ, ivalue)
4214+
#else
4215+
#define IOCTL_TIOCOUTQ_FUNC2_DECL
4216+
#endif
4217+
41964218
#define IOCTL_GET_FUNCS2 \
41974219
IOCTL_FIONREAD_FUNC2_DECL \
41984220
IOCTL_FIONWRITE_FUNC2_DECL \
41994221
IOCTL_FIONSPACE_FUNC2_DECL \
4222+
IOCTL_TIOCOUTQ_FUNC2_DECL \
42004223
IOCTL_SIOCATMARK_FUNC2_DECL
42014224

42024225
#define IOCTL_GET_REQUEST2_DECL(OR, R, EF) \

lib/kernel/doc/src/socket.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2246,6 +2246,7 @@
22462246
</item>
22472247

22482248
<tag><c>nwrite</c></tag>
2249+
<tag><c>@TODO outq</c></tag>
22492250
<item>
22502251
<p>The number of bytes in the send queue. </p>
22512252
<p>Result, number of bytes, is a <c>integer()</c>. </p>

lib/kernel/src/socket.erl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4443,7 +4443,7 @@ peername(Socket) ->
44434443
Socket :: socket(),
44444444
Reason :: posix() | 'closed';
44454445

4446-
(Socket, GetRequest :: 'nread' | 'nwrite' | 'nspace') ->
4446+
(Socket, GetRequest :: 'nread' | 'nwrite' | 'outq' | 'nspace') ->
44474447
{'ok', NumBytes :: non_neg_integer()} | {'error', Reason} when
44484448
Socket :: socket(),
44494449
Reason :: posix() | 'closed';
@@ -4458,12 +4458,13 @@ peername(Socket) ->
44584458
Socket :: socket(),
44594459
Reason :: posix() | 'closed'.
44604460

4461-
%% gifconf | nread | nwrite | nspace | atmark |
4461+
%% gifconf | nread | nwrite | nspace | outq | atmark |
44624462
%% {gifaddr, string()} | {gifindex, string()} | {gifname, integer()}
44634463
ioctl(?socket(SockRef), gifconf = GetRequest) ->
44644464
prim_socket:ioctl(SockRef, GetRequest);
44654465
ioctl(?socket(SockRef), GetRequest) when (nread =:= GetRequest) orelse
44664466
(nwrite =:= GetRequest) orelse
4467+
(outq =:= GetRequest) orelse
44674468
(nspace =:= GetRequest) ->
44684469
prim_socket:ioctl(SockRef, GetRequest);
44694470
ioctl(?socket(SockRef), GetRequest) when (atmark =:= GetRequest) ->

0 commit comments

Comments
 (0)