From ead04ffa5ea31b7c18d37347090532efaeff0089 Mon Sep 17 00:00:00 2001 From: Waldemar Kornewald Date: Thu, 8 Apr 2004 13:06:00 +0000 Subject: [PATCH] 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 --- src/kits/network/libnet/compat.c | 26 ++++++++++-------- src/kits/network/libnet/select.c | 3 +++ src/kits/network/libnet/socket.c | 46 +++++++++++++++++++------------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/kits/network/libnet/compat.c b/src/kits/network/libnet/compat.c index adf9f379ae..5cf90b9cb0 100644 --- a/src/kits/network/libnet/compat.c +++ b/src/kits/network/libnet/compat.c @@ -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 @@ -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; diff --git a/src/kits/network/libnet/select.c b/src/kits/network/libnet/select.c index fe317387f1..df5ca10b6a 100644 --- a/src/kits/network/libnet/select.c +++ b/src/kits/network/libnet/select.c @@ -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) diff --git a/src/kits/network/libnet/socket.c b/src/kits/network/libnet/socket.c index 931dfd48cc..c90e29c952 100644 --- a/src/kits/network/libnet/socket.c +++ b/src/kits/network/libnet/socket.c @@ -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; }