1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2024-11-26 11:29:53 +03:00

Merge PR #438: Solaris: use DLPI style 1 attachment and check for /dev/net used by Illumos and Solaris 10+.

This commit is contained in:
Davide Beatrici 2018-07-26 09:06:54 +02:00 committed by GitHub
commit be0e3cfb61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 31 deletions

View File

@ -908,7 +908,6 @@ bool EthIsChangeMtuSupported(ETH *e)
ETH *OpenEthSolaris(char *name, bool local, bool tapmode, char *tapaddr) ETH *OpenEthSolaris(char *name, bool local, bool tapmode, char *tapaddr)
{ {
char devname[MAX_SIZE]; char devname[MAX_SIZE];
UINT devid;
int fd; int fd;
ETH *e; ETH *e;
CANCEL *c; CANCEL *c;
@ -921,12 +920,12 @@ ETH *OpenEthSolaris(char *name, bool local, bool tapmode, char *tapaddr)
} }
// Parse device name // Parse device name
if (ParseUnixEthDeviceName(devname, sizeof(devname), &devid, name) == false) if (ParseUnixEthDeviceName(devname, sizeof(devname), name) == false)
{ {
return NULL; return NULL;
} }
// Open the device // Open the device - use style 1 attachment
fd = open(devname, O_RDWR); fd = open(devname, O_RDWR);
if (fd == -1) if (fd == -1)
{ {
@ -934,22 +933,6 @@ ETH *OpenEthSolaris(char *name, bool local, bool tapmode, char *tapaddr)
return NULL; return NULL;
} }
// Attach to the device
if (DlipAttachRequest(fd, devid) == false)
{
// Failed
close(fd);
return NULL;
}
// Verify ACK message
if (DlipReceiveAck(fd) == false)
{
// Failed
close(fd);
return NULL;
}
// Bind to SAP // Bind to SAP
if (DlipBindRequest(fd) == false) if (DlipBindRequest(fd) == false)
{ {
@ -1174,12 +1157,16 @@ bool DlipReceiveAck(int fd)
#endif // UNIX_SOLARIS #endif // UNIX_SOLARIS
// Separate UNIX device name string into device name and id number // Separate UNIX device name string into device name and id number
bool ParseUnixEthDeviceName(char *dst_devname, UINT dst_devname_size, UINT *dst_devid, char *src_name) bool ParseUnixEthDeviceName(char *dst_devname, UINT dst_devname_size, char *src_name)
{ {
UINT len, i, j; UINT len, i;
struct stat s;
int err;
char *device_path;
int device_pathlen;
// Validate arguments // Validate arguments
if (dst_devname == NULL || dst_devid == NULL || src_name == NULL) if (dst_devname == NULL || src_name == NULL)
{ {
return false; return false;
} }
@ -1191,6 +1178,19 @@ bool ParseUnixEthDeviceName(char *dst_devname, UINT dst_devname_size, UINT *dst_
return false; return false;
} }
// Solaris 10 and higher make real and virtual devices available in /dev/net
err = stat("/dev/net", &s);
if (err != -1 && S_ISDIR(s.st_mode))
{
device_path = "/dev/net/";
}
else
{
device_path = "/dev/";
}
device_pathlen = strlen(device_path);
for (i = len-1; i+1 != 0; i--) for (i = len-1; i+1 != 0; i--)
{ {
// Find last non-numeric character // Find last non-numeric character
@ -1201,16 +1201,13 @@ bool ParseUnixEthDeviceName(char *dst_devname, UINT dst_devname_size, UINT *dst_
{ {
return false; return false;
} }
*dst_devid = ToInt(src_name + i + 1);
StrCpy(dst_devname, dst_devname_size, "/dev/");
for (j = 0; j<i+1 && j<dst_devname_size-6; j++)
{
dst_devname[j+5] = src_name[j];
} }
dst_devname[j+5]=0;
StrCpy(dst_devname, dst_devname_size, device_path);
StrCpy(dst_devname + device_pathlen, dst_devname_size-device_pathlen, src_name);
dst_devname[device_pathlen + len] = 0;
return true; return true;
} }
}
// All characters in the string was numeric: error // All characters in the string was numeric: error
return false; return false;
} }

View File

@ -201,7 +201,7 @@ ETH *OpenEth(char *name, bool local, bool tapmode, char *tapaddr);
ETH *OpenEthLinux(char *name, bool local, bool tapmode, char *tapaddr); ETH *OpenEthLinux(char *name, bool local, bool tapmode, char *tapaddr);
ETH *OpenEthSolaris(char *name, bool local, bool tapmode, char *tapaddr); ETH *OpenEthSolaris(char *name, bool local, bool tapmode, char *tapaddr);
ETH *OpenEthPcap(char *name, bool local, bool tapmode, char *tapaddr); ETH *OpenEthPcap(char *name, bool local, bool tapmode, char *tapaddr);
bool ParseUnixEthDeviceName(char *dst_devname, UINT dst_devname_size, UINT *dst_devid, char *src_name); bool ParseUnixEthDeviceName(char *dst_devname, UINT dst_devname_size, char *src_name);
void CloseEth(ETH *e); void CloseEth(ETH *e);
CANCEL *EthGetCancel(ETH *e); CANCEL *EthGetCancel(ETH *e);
UINT EthGetPacket(ETH *e, void **data); UINT EthGetPacket(ETH *e, void **data);