cvs: php4 /ext/sockets sockets.c
| From: | Jason Greene | Date: | Mon, 04 Mar 2002 05:27:05 +0000 |
| Subject: | cvs: php4 /ext/sockets sockets.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-9613@lists.php.net to get a copy of this message | ||
jason Mon Mar 4 00:27:05 2002 EDT
Modified files:
/php4/ext/sockets sockets.c
Log:
Patch 1 of 3 (2 in 3 still in progress) of sockets rework
Abstracted string -> ipv4 value conversion which unifies all functions
Standardized Host Lookups
Fixed Broken host error values
Fixed error detection in sendmsg
Added some safety struct zeroing
Modified bind to consitentlyy use sockaddr_storage(not just for AF_UNIX)
#Note this could potentially break the build on other platforms, as I have
#not tested them yet (Will soon though)
Index: php4/ext/sockets/sockets.c
diff -u php4/ext/sockets/sockets.c:1.90 php4/ext/sockets/sockets.c:1.91
--- php4/ext/sockets/sockets.c:1.90 Fri Feb 15 12:33:08 2002
+++ php4/ext/sockets/sockets.c Mon Mar 4 00:27:04 2002
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: sockets.c,v 1.90 2002/02/15 17:33:08 jason Exp $ */
+/* $Id: sockets.c,v 1.91 2002/03/04 05:27:04 jason Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -341,6 +341,7 @@
#ifndef PHP_WIN32
if (error < -10000) {
error += 10000;
+ error=-error;
#ifdef HAVE_HSTRERROR
buf = hstrerror(error);
@@ -361,6 +362,29 @@
return (buf ? (char *) buf : "");
}
+/* Sets addr by hostname, or by ip in string form (AF_INET) */
+int php_set_inet_addr(struct sockaddr_in *sin, char *string, php_socket *php_sock TSRMLS_DC) {
+ struct in_addr tmp;
+ struct hostent *host_entry;
+
+ if (inet_aton(string, &tmp)) {
+ sin->sin_addr.s_addr = tmp.s_addr;
+ } else {
+ if (! (host_entry = gethostbyname(string))) {
+ /* Note: < -10000 indicates a host lookup error */
+ PHP_SOCKET_ERROR(php_sock, "Host lookup failed", (-10000 - h_errno));
+ return 0;
+ }
+ if (host_entry->h_addrtype != AF_INET) {
+ php_error(E_WARNING, "%s() Host lookup failed: Non AF_INET domain returned on AF_INET
socket", get_active_function_name(TSRMLS_C));
+ return 0;
+ }
+ memcpy(&(sin->sin_addr.s_addr), host_entry->h_addr_list[0], host_entry->h_length);
+ }
+
+ return 1;
+}
+
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(sockets)
@@ -956,22 +980,11 @@
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short int)port);
-
- if (inet_aton(addr, &addr_buf)) {
- sin.sin_addr.s_addr = addr_buf.s_addr;
- } else {
- char *q = (char *) &(sin.sin_addr.s_addr);
- host_struct = gethostbyname(addr);
- if ((! host_struct) || (host_struct->h_addrtype != AF_INET)) {
- RETURN_FALSE;
- }
- q[0] = host_struct->h_addr_list[0][0];
- q[1] = host_struct->h_addr_list[0][1];
- q[2] = host_struct->h_addr_list[0][2];
- q[3] = host_struct->h_addr_list[0][3];
+ if (! php_set_inet_addr(&sin, addr, php_sock TSRMLS_CC)) {
+ RETURN_FALSE;
}
-
+
retval = connect(php_sock->bsd_socket, (struct sockaddr *)&sin, sizeof(struct
sockaddr_in));
break;
@@ -1037,20 +1050,18 @@
case AF_INET:
{
- struct sockaddr_in sa;
- struct hostent *hp;
+ struct sockaddr_in *sa = (struct sockaddr_in *) sock_type;
- memset(&sa, 0, sizeof(sa));
-
- if ((hp = gethostbyname(addr)) == NULL) {
- PHP_SOCKET_ERROR(php_sock, "unable to lookup host", h_errno - 10000);
+ memset(sa, 0, sizeof(sa_storage)); /* Apparently, Mac OSX needs this */
+
+ sa->sin_family = AF_INET;
+ sa->sin_port = htons((unsigned short) port);
+
+ if (! php_set_inet_addr(sa, addr, php_sock TSRMLS_CC)) {
RETURN_FALSE;
}
-
- memcpy((char *)&sa.sin_addr, hp->h_addr, hp->h_length);
- sa.sin_family = hp->h_addrtype;
- sa.sin_port = htons((unsigned short)port);
- retval = bind(php_sock->bsd_socket, (struct sockaddr *)&sa, sizeof(sa));
+
+ retval = bind(php_sock->bsd_socket, (struct sockaddr *)sa, sizeof(sa_storage));
break;
}
@@ -1443,21 +1454,12 @@
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
-
- if (inet_aton(addr, &addr_buf) == 0) {
- sin.sin_addr.s_addr = addr_buf.s_addr;
- } else {
- struct hostent *he;
-
- if ((he = gethostbyname(addr)) == NULL) {
- PHP_SOCKET_ERROR(php_sock, "unable to sendto", h_errno - 10000);
- RETURN_FALSE;
- }
-
- sin.sin_addr.s_addr = *(int *) (he->h_addr_list[0]);
+ sin.sin_port = htons((unsigned short) port);
+
+ if (! php_set_inet_addr(&sin, addr, php_sock TSRMLS_CC)) {
+ RETURN_FALSE;
}
-
- sin.sin_port = htons((unsigned short)port);
+
retval = sendto(php_sock->bsd_socket, buf, (len > buf_len) ? buf_len : len, flags, (struct
sockaddr *) &sin, sizeof(sin));
break;
@@ -1646,20 +1648,16 @@
hdr.msg_iov = iov->iov_array;
hdr.msg_iovlen = iov->count;
- if (inet_aton(addr, &sin->sin_addr) != 0) {
- struct hostent *he = gethostbyname(addr);
-
- if (!he) {
- PHP_SOCKET_ERROR(php_sock, "unable to send message", h_errno - 10000);
- RETURN_FALSE;
- }
-
- sin->sin_addr.s_addr = *(int *)(he->h_addr_list[0]);
+ memset(sin, 0, sizeof(sa));
+
+ sin->sin_family = AF_INET;
+ sin->sin_port = htons((unsigned short)port);
+
+ if (! php_set_inet_addr(sin, addr, php_sock TSRMLS_CC)) {
+ RETURN_FALSE;
}
- sin->sin_port = htons((unsigned short)port);
-
- if (sendmsg(php_sock->bsd_socket, &hdr, flags) != 0) {
+ if (sendmsg(php_sock->bsd_socket, &hdr, flags) == -1) {
PHP_SOCKET_ERROR(php_sock, "unable to send message", errno);
}
@@ -1681,7 +1679,7 @@
hdr.msg_namelen = SUN_LEN(s_un);
- if (sendmsg(php_sock->bsd_socket, &hdr, flags) != 0) {
+ if (sendmsg(php_sock->bsd_socket, &hdr, flags) == -1) {
PHP_SOCKET_ERROR(php_sock, "unable to send message", errno);
RETURN_FALSE;
}