Our netstack works now! I used Vision and Net+ and it did not crash!!!
But I would not consider it stable. Not tested on R5 net_server, only BONE (replaced BONE stack)! Not compatible to BONE applications (you must use net_server apps or OBOS apps)! Removed debug output from compat.c. Fixed DNS bug (well, it's very hacky). NOTE FOR BONE USERS: Uncomment the definition of BONE_VERSION in select.c! git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7185 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
/* These routines are included in libnet simply because R5 expects them
|
||||
* to be there. They should mostly be no-ops...
|
||||
* Some of them are hacks! We must fix this!!!
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
@@ -75,19 +76,21 @@ _EXPORT int _netconfig_find(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* XXX: HACK HACK HACK! FIXME! */
|
||||
/* This is a terrible hack :(
|
||||
* We should really get these settings values by parsing $HOME/config/settings/network file, which
|
||||
* will make both R5 and BONE compatible
|
||||
* TODO: We should really get these settings values by parsing
|
||||
* $HOME/config/settings/network file, which will make both R5 and BONE compatible.
|
||||
*/
|
||||
|
||||
_EXPORT char * find_net_setting(net_settings * ncw, const char * heading, const char * name, char * value, unsigned nbytes)
|
||||
_EXPORT char * find_net_setting(net_settings * ncw, const char * heading,
|
||||
const char * name, char * value, unsigned nbytes)
|
||||
{
|
||||
|
||||
printf("find_net_setting\n");
|
||||
// printf("find_net_setting\n");
|
||||
|
||||
if (strcmp(heading, "GLOBAL") != 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
if (strcmp(name, "HOSTNAME") == 0)
|
||||
strncpy(value, "hostname", nbytes);
|
||||
else if (strcmp(name, "USERNAME") == 0)
|
||||
@@ -96,12 +99,13 @@ _EXPORT char * find_net_setting(net_settings * ncw, const char * heading, const
|
||||
strncpy(value, "password", nbytes);
|
||||
else
|
||||
return NULL;
|
||||
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
_EXPORT status_t set_net_setting(net_settings * ncw, const char * heading, const char * name, const char * value)
|
||||
_EXPORT status_t set_net_setting(net_settings * ncw, const char * heading,
|
||||
const char * name, const char * value)
|
||||
{
|
||||
printf("set_net_setting\n");
|
||||
return B_UNSUPPORTED;
|
||||
@@ -110,7 +114,7 @@ _EXPORT status_t set_net_setting(net_settings * ncw, const char * heading, const
|
||||
|
||||
_EXPORT int gethostname(char * name, size_t length)
|
||||
{
|
||||
printf("gethostname\n");
|
||||
// printf("gethostname\n");
|
||||
if (find_net_setting(NULL, "GLOBAL", "HOSTNAME", name, length) == NULL)
|
||||
return B_ERROR;
|
||||
|
||||
@@ -120,7 +124,7 @@ _EXPORT int gethostname(char * name, size_t length)
|
||||
|
||||
_EXPORT int getusername(char * name, size_t length)
|
||||
{
|
||||
printf("getusername\n");
|
||||
// printf("getusername\n");
|
||||
if (find_net_setting(NULL, "GLOBAL", "USERNAME", name, length) == NULL)
|
||||
return B_ERROR;
|
||||
|
||||
@@ -130,7 +134,7 @@ _EXPORT int getusername(char * name, size_t length)
|
||||
|
||||
_EXPORT int getpassword(char * pwd, size_t length)
|
||||
{
|
||||
printf("getpassword\n");
|
||||
// printf("getpassword\n");
|
||||
if (find_net_setting(NULL, "GLOBAL", "PASSWORD", pwd, length) == NULL)
|
||||
return B_ERROR;
|
||||
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
|
||||
#include "net_stack_driver.h"
|
||||
|
||||
// uncomment this line if you have BONE
|
||||
// #define BONE_VERSION 1
|
||||
|
||||
#ifndef BONE_VERSION
|
||||
|
||||
static int fd_set_count(fd_set * bits, int nbits)
|
||||
|
||||
@@ -77,7 +77,7 @@ _EXPORT int socket(int family, int type, int protocol)
|
||||
/* also convert AF_INET */
|
||||
if (family == 1)
|
||||
family = AF_INET;
|
||||
};
|
||||
}
|
||||
|
||||
args.u.socket.family = family;
|
||||
args.u.socket.type = type;
|
||||
@@ -126,12 +126,21 @@ _EXPORT int connect(int sock, const struct sockaddr *addr, int addrlen)
|
||||
struct sockaddr temp;
|
||||
struct stack_driver_args args;
|
||||
|
||||
if (g_beos_r5_compatibility) {
|
||||
// XXX: HACK! FIXME!
|
||||
// Our DNS resolver uses the new stack codes, but old apps set R5 compatibility.
|
||||
// So, resolving an address AFTER the app opens a socket fails because
|
||||
// connect() thinks we are in compatibility mode and thus translates the
|
||||
// new style address family into the old style (and sockaddr format).
|
||||
// So, we check if the address family is our AF_INET (might indicate that we
|
||||
// are using the new stack mixed with the old one.
|
||||
// We can to solve this problem by making R5 compatibility socket-specific.
|
||||
// This would need a new ioctl() for retrieving the socket mode.
|
||||
if (g_beos_r5_compatibility && addr->sa_family != AF_INET) {
|
||||
convert_from_beos_r5_sockaddr(&temp, addr);
|
||||
addr = &temp;
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
}
|
||||
|
||||
|
||||
args.u.sockaddr.addr = (struct sockaddr *) addr;
|
||||
args.u.sockaddr.addrlen = addrlen;
|
||||
|
||||
@@ -160,7 +169,7 @@ _EXPORT int accept(int sock, struct sockaddr *addr, int *addrlen)
|
||||
new_sock = open(get_stack_driver_path(), O_RDWR);
|
||||
if (new_sock < 0)
|
||||
return new_sock;
|
||||
|
||||
|
||||
// The network stack driver will need to know to which net_stack_cookie to
|
||||
// *bind* with the new accepted socket. He can't know himself find out
|
||||
// the net_stack_cookie of our new_sock file descriptor, the just open() one...
|
||||
@@ -170,12 +179,12 @@ _EXPORT int accept(int sock, struct sockaddr *addr, int *addrlen)
|
||||
close(new_sock);
|
||||
return rv;
|
||||
};
|
||||
|
||||
|
||||
args.u.accept.cookie = cookie; // this way driver can use the right fd/cookie for the new_sock!
|
||||
|
||||
|
||||
args.u.accept.addr = g_beos_r5_compatibility ? &temp : addr;
|
||||
args.u.accept.addrlen = g_beos_r5_compatibility ? sizeof(temp) : *addrlen;
|
||||
|
||||
|
||||
rv = ioctl(sock, NET_STACK_ACCEPT, &args, sizeof(args));
|
||||
if (rv < 0) {
|
||||
close(new_sock);
|
||||
@@ -187,7 +196,7 @@ _EXPORT int accept(int sock, struct sockaddr *addr, int *addrlen)
|
||||
*addrlen = sizeof(struct beosr5_sockaddr_in);
|
||||
} else
|
||||
*addrlen = args.u.accept.addrlen;
|
||||
|
||||
|
||||
return new_sock;
|
||||
}
|
||||
|
||||
@@ -199,9 +208,9 @@ _EXPORT ssize_t recvfrom(int sock, void *buffer, size_t buflen, int flags,
|
||||
struct msghdr mh;
|
||||
struct iovec iov;
|
||||
int rv;
|
||||
|
||||
|
||||
/* XXX - would this be better done as scatter gather? */
|
||||
mh.msg_name = g_beos_r5_compatibility ? (caddr_t)&temp : (caddr_t)addr;
|
||||
mh.msg_name = g_beos_r5_compatibility ? (caddr_t)&temp : (caddr_t)addr;
|
||||
mh.msg_namelen = g_beos_r5_compatibility ? sizeof(temp) : addrlen ? *addrlen : 0;
|
||||
mh.msg_flags = flags;
|
||||
mh.msg_control = NULL;
|
||||
@@ -210,11 +219,11 @@ _EXPORT ssize_t recvfrom(int sock, void *buffer, size_t buflen, int flags,
|
||||
iov.iov_len = buflen;
|
||||
mh.msg_iov = &iov;
|
||||
mh.msg_iovlen = 1;
|
||||
|
||||
|
||||
rv = ioctl(sock, NET_STACK_RECVFROM, &mh, sizeof(mh));
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
|
||||
if (g_beos_r5_compatibility && addr)
|
||||
convert_to_beos_r5_sockaddr(addr, &temp);
|
||||
|
||||
@@ -224,7 +233,7 @@ _EXPORT ssize_t recvfrom(int sock, void *buffer, size_t buflen, int flags,
|
||||
else
|
||||
*addrlen = mh.msg_namelen;
|
||||
}
|
||||
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -234,13 +243,14 @@ _EXPORT ssize_t sendto(int sock, const void *buffer, size_t buflen, int flags,
|
||||
struct sockaddr temp;
|
||||
struct msghdr mh;
|
||||
struct iovec iov;
|
||||
|
||||
if (g_beos_r5_compatibility) {
|
||||
|
||||
// XXX: DNS HACK!
|
||||
if (g_beos_r5_compatibility && addr->sa_family != AF_INET) {
|
||||
convert_from_beos_r5_sockaddr(&temp, addr);
|
||||
addr = &temp;
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
}
|
||||
|
||||
|
||||
/* XXX - would this be better done as scatter gather? */
|
||||
mh.msg_name = (caddr_t)addr;
|
||||
mh.msg_namelen = addrlen;
|
||||
@@ -251,7 +261,7 @@ _EXPORT ssize_t sendto(int sock, const void *buffer, size_t buflen, int flags,
|
||||
iov.iov_len = buflen;
|
||||
mh.msg_iov = &iov;
|
||||
mh.msg_iovlen = 1;
|
||||
|
||||
|
||||
return ioctl(sock, NET_STACK_SENDTO, &mh, sizeof(mh));
|
||||
}
|
||||
|
||||
@@ -389,7 +399,7 @@ _EXPORT int getsockname(int sock, struct sockaddr *addr, int *addrlen)
|
||||
*addrlen = sizeof(struct beosr5_sockaddr_in);
|
||||
} else
|
||||
*addrlen = args.u.sockaddr.addrlen;
|
||||
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user