Skip to content

Commit

Permalink
Merge branch 'maint'
Browse files Browse the repository at this point in the history
  • Loading branch information
bmk committed Sep 4, 2024
2 parents bd14955 + 02f2a58 commit e54c6ec
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 25 deletions.
29 changes: 25 additions & 4 deletions erts/emulator/nifs/common/prim_socket_nif.c
Original file line number Diff line number Diff line change
Expand Up @@ -827,11 +827,29 @@ const ESockFlag esock_ioctl_flags[] = {
// FreeBSD, ...
{
#ifdef IFF_NOGROUP
IFF_NOGROUP,
IFF_NOGROUP,
#else
0,
0,
#endif
&esock_atom_nogroup},

// Solaris, ...
{
#ifdef IFF_DHCPRUNNING
IFF_DHCPRUNNING,
#else
0,
#endif
&esock_atom_nogroup}
&esock_atom_dhcprunning},

// Solaris, ...
{
#ifdef IFF_PRIVATE
IFF_PRIVATE,
#else
0,
#endif
&esock_atom_private}
};
const int esock_ioctl_flags_length = NUM(esock_ioctl_flags);

Expand Down Expand Up @@ -2007,6 +2025,7 @@ static const struct in6_addr in6addr_loopback =
GLOBAL_ATOM_DECL(default_send_params); \
GLOBAL_ATOM_DECL(delayed_ack_time); \
GLOBAL_ATOM_DECL(dgram); \
GLOBAL_ATOM_DECL(dhcprunning); \
GLOBAL_ATOM_DECL(disable_fragments); \
GLOBAL_ATOM_DECL(dlci); \
GLOBAL_ATOM_DECL(dma); \
Expand Down Expand Up @@ -2182,6 +2201,7 @@ static const struct in6_addr in6addr_loopback =
GLOBAL_ATOM_DECL(primary_addr); \
GLOBAL_ATOM_DECL(prim_file); \
GLOBAL_ATOM_DECL(priority); \
GLOBAL_ATOM_DECL(private); \
GLOBAL_ATOM_DECL(promisc); \
GLOBAL_ATOM_DECL(pronet); \
GLOBAL_ATOM_DECL(protocol); \
Expand Down Expand Up @@ -2361,7 +2381,7 @@ ERL_NIF_TERM esock_atom_socket_tag; // This has a "special" name ('$socket')
LOCAL_ATOM_DECL(exclude); \
LOCAL_ATOM_DECL(false); \
LOCAL_ATOM_DECL(frag_needed); \
LOCAL_ATOM_DECL(genhwaddr); \
LOCAL_ATOM_DECL(genaddr); \
LOCAL_ATOM_DECL(gifaddr); \
LOCAL_ATOM_DECL(gifbrdaddr); \
LOCAL_ATOM_DECL(gifconf); \
Expand Down Expand Up @@ -4881,6 +4901,7 @@ ERL_NIF_TERM esock_supports_ioctl_requests(ErlNifEnv* env)

requests = MKEL(env);


/* --- GET REQUESTS --- */
#if defined(SIOCGIFCONF)
requests = MKC(env, MKT2(env, atom_gifconf, MKUL(env, SIOCGIFCONF)), requests);
Expand Down
4 changes: 3 additions & 1 deletion erts/emulator/nifs/common/socket_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ typedef long ssize_t;
GLOBAL_ATOM_DEF(default_send_params); \
GLOBAL_ATOM_DEF(delayed_ack_time); \
GLOBAL_ATOM_DEF(dgram); \
GLOBAL_ATOM_DEF(dhcprunning); \
GLOBAL_ATOM_DEF(disable_fragments); \
GLOBAL_ATOM_DEF(dlci); \
GLOBAL_ATOM_DEF(dma); \
Expand Down Expand Up @@ -454,8 +455,9 @@ typedef long ssize_t;
GLOBAL_ATOM_DEF(portrange); \
GLOBAL_ATOM_DEF(portsel); \
GLOBAL_ATOM_DEF(primary_addr); \
GLOBAL_ATOM_DEF(priority); \
GLOBAL_ATOM_DEF(prim_file); \
GLOBAL_ATOM_DEF(priority); \
GLOBAL_ATOM_DEF(private); \
GLOBAL_ATOM_DEF(promisc); \
GLOBAL_ATOM_DEF(pronet); \
GLOBAL_ATOM_DEF(protocol); \
Expand Down
56 changes: 40 additions & 16 deletions erts/emulator/nifs/unix/unix_socket_syncio.c
Original file line number Diff line number Diff line change
Expand Up @@ -518,10 +518,10 @@ static ERL_NIF_TERM essio_ioctl_gifname(ErlNifEnv* env,
#endif

/* esock_ioctl_gifenaddr */
#if defined(SIOCGENHWADDR) && defined(ESOCK_USE_ENADDR)
#define IOCTL_GIFENADDR_FUNC3_DEF IOCTL_GET_FUNC3_DEF(gifenaddr)
#if defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR)
#define IOCTL_GENADDR_FUNC3_DEF IOCTL_GET_FUNC3_DEF(genaddr)
#else
#define IOCTL_GIFENADDR_FUNC3_DEF
#define IOCTL_GENADDR_FUNC3_DEF
#endif

/* esock_ioctl_gifmap */
Expand All @@ -547,7 +547,7 @@ static ERL_NIF_TERM essio_ioctl_gifname(ErlNifEnv* env,
IOCTL_GIFNETMASK_FUNC3_DEF; \
IOCTL_GIFMTU_FUNC3_DEF; \
IOCTL_GIFHWADDR_FUNC3_DEF; \
IOCTL_GIFENADDR_FUNC3_DEF; \
IOCTL_GENADDR_FUNC3_DEF; \
IOCTL_GIFMAP_FUNC3_DEF; \
IOCTL_GIFTXQLEN_FUNC3_DEF;
#define IOCTL_GET_FUNC3_DEF(F) \
Expand Down Expand Up @@ -650,12 +650,16 @@ static ERL_NIF_TERM encode_ioctl_ifrmap(ErlNifEnv* env,
ESockDescriptor* descP,
struct ifmap* mapP);
#endif
#if (defined(SIOCGIFHWADDR) && defined(ESOCK_USE_HWADDR)) || \
(defined(SIOCGIFENADDR) && defined(ESOCK_USE_ENADDR))
#if (defined(SIOCGIFHWADDR) && defined(ESOCK_USE_HWADDR))
static ERL_NIF_TERM encode_ioctl_hwaddr(ErlNifEnv* env,
ESockDescriptor* descP,
struct sockaddr* addrP);
#endif
#if (defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR))
static ERL_NIF_TERM encode_ioctl_enaddr(ErlNifEnv* env,
ESockDescriptor* descP,
char* addrP);
#endif
static ERL_NIF_TERM encode_ioctl_ifraddr(ErlNifEnv* env,
ESockDescriptor* descP,
struct sockaddr* addrP);
Expand Down Expand Up @@ -4110,6 +4114,7 @@ ERL_NIF_TERM essio_ioctl2(ErlNifEnv* env,
* gifnetmask name string
* gifmtu name string
* gifhwaddr name string
* genaddr name string
* gifmap name string
* giftxqlen name string
*/
Expand Down Expand Up @@ -4177,9 +4182,9 @@ ERL_NIF_TERM essio_ioctl3(ErlNifEnv* env,
break;
#endif

#if defined(SIOCGENHWADDR) && defined(ESOCK_USE_ENADDR)
case SIOCGIFENADDR:
return essio_ioctl_gifenaddr(env, descP, arg);
#if defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR)
case SIOCGENADDR:
return essio_ioctl_genaddr(env, descP, arg);
break;
#endif

Expand Down Expand Up @@ -4543,12 +4548,12 @@ IOCTL_GET_FUNCS2
#define IOCTL_GIFHWADDR_FUNC3_DECL
#endif

/* *** essio_ioctl_gifenaddr *** */
/* *** essio_ioctl_genaddr *** */
#if defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR)
#define IOCTL_GIFENADDR_FUNC3_DECL \
IOCTL_GET_REQUEST3_DECL(gifenaddr, SIOCGENENADDR, hwaddr, &ifreq.ifr_enaddr)
#define IOCTL_GENADDR_FUNC3_DECL \
IOCTL_GET_REQUEST3_DECL(genaddr, SIOCGENADDR, enaddr, ifreq.ifr_enaddr)
#else
#define IOCTL_GIFENADDR_FUNC3_DECL
#define IOCTL_GENADDR_FUNC3_DECL
#endif

/* *** essio_ioctl_gifmap *** */
Expand Down Expand Up @@ -4576,7 +4581,7 @@ IOCTL_GET_FUNCS2
IOCTL_GIFNETMASK_FUNC3_DECL \
IOCTL_GIFMTU_FUNC3_DECL \
IOCTL_GIFHWADDR_FUNC3_DECL \
IOCTL_GIFENADDR_FUNC3_DECL \
IOCTL_GENADDR_FUNC3_DECL \
IOCTL_GIFMAP_FUNC3_DECL \
IOCTL_GIFTXQLEN_FUNC3_DECL

Expand Down Expand Up @@ -5092,8 +5097,7 @@ ERL_NIF_TERM encode_ioctl_ifrmap(ErlNifEnv* env,
#endif


#if (defined(SIOCGIFHWADDR) && defined(ESOCK_USE_HWADDR)) || \
(defined(SIOCGIFENADDR) && defined(ESOCK_USE_ENADDR))
#if (defined(SIOCGIFHWADDR) && defined(ESOCK_USE_HWADDR))
static
ERL_NIF_TERM encode_ioctl_hwaddr(ErlNifEnv* env,
ESockDescriptor* descP,
Expand All @@ -5113,6 +5117,26 @@ ERL_NIF_TERM encode_ioctl_hwaddr(ErlNifEnv* env,
#endif


#if (defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR))
static
ERL_NIF_TERM encode_ioctl_enaddr(ErlNifEnv* env,
ESockDescriptor* descP,
char* enaddr)
{
ERL_NIF_TERM eenaddr;
struct ifreq foo;
SOCKLEN_T len = sizeof(foo.ifr_enaddr);

eenaddr = esock_make_new_binary(env, enaddr, len);

SSDBG( descP, ("UNIX-ESSIO", "encode_ioctl_enaddr -> done with"
"\r\n Gen Addr: %T"
"\r\n", eenaddr) );

return esock_make_ok2(env, eenaddr);;
}
#endif

static
ERL_NIF_TERM encode_ioctl_ifraddr(ErlNifEnv* env,
ESockDescriptor* descP,
Expand Down
14 changes: 10 additions & 4 deletions lib/kernel/src/socket.erl
Original file line number Diff line number Diff line change
Expand Up @@ -6226,6 +6226,12 @@ ioctl(Socket, GetRequest) ->
%% Name :: string(),
%% HWAddr :: sockaddr(),
%% Reason :: posix() | 'closed';
%% (Socket, GetRequest, Name) -> {'ok', GenAddr} | {'error', Reason} when
%% Socket :: socket(),
%% GetRequest :: 'genaddr',
%% Name :: string(),
%% GenAddr :: binary(),
%% Reason :: posix() | 'closed';
%% (Socket, GetRequest, Name) -> {'ok', MTU} | {'error', Reason} when
%% Socket :: socket(),
%% GetRequest :: 'gifmtu',
Expand Down Expand Up @@ -6291,10 +6297,10 @@ Also, see the note above.
Result; the network mask of the interface, `t:sockaddr/0`.
- **`gifhwaddr` | `gifenaddr`** - Get the hardware address for the interface with the
- **`gifhwaddr` | `genaddr`** - Get the hardware address for the interface with the
specified name.
Result; the hardware address of the interface, `t:sockaddr/0`.
Result; the hardware address of the interface, `t:sockaddr/0` | `t:binary/0`.
The family field contains the 'ARPHRD' device type (or an integer).
- **`gifmtu`** - Get the MTU (Maximum Transfer Unit) for the interface with the
Expand Down Expand Up @@ -6372,7 +6378,7 @@ the `Value` for the request parameter *(since OTP 26.1)*.
Socket :: socket(),
GetRequest :: 'gifname' | 'gifindex' |
'gifaddr' | 'gifdstaddr' | 'gifbrdaddr' |
'gifnetmask' | 'gifhwaddr' | 'gifhwaddr' |
'gifnetmask' | 'gifhwaddr' | 'genaddr' |
'gifmtu' | 'giftxqlen' | 'gifflags' |
'tcp_info',
NameOrIndex :: string() | integer(),
Expand Down Expand Up @@ -6413,7 +6419,7 @@ ioctl(?socket(SockRef), gifmtu = GetRequest, Name)
ioctl(?socket(SockRef), gifhwaddr = GetRequest, Name)
when is_list(Name) ->
prim_socket:ioctl(SockRef, GetRequest, Name);
ioctl(?socket(SockRef), gifenaddr = GetRequest, Name)
ioctl(?socket(SockRef), genaddr = GetRequest, Name)
when is_list(Name) ->
prim_socket:ioctl(SockRef, GetRequest, Name);
ioctl(?socket(SockRef), giftxqlen = GetRequest, Name)
Expand Down

0 comments on commit e54c6ec

Please sign in to comment.