pkgsrc-wip/alive/patches/patch-ad

345 lines
9 KiB
Text

$NetBSD: patch-ad,v 1.1.1.1 2005/03/04 19:04:20 oht Exp $
--- src/http.c.orig 2004-12-21 16:46:14.000000000 +0100
+++ src/http.c 2005-03-04 19:22:02.000000000 +0100
@@ -38,7 +38,6 @@
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
-
#include "http.h"
#include "log.h"
@@ -57,17 +56,80 @@
* socket descriptior.
*/
+ char * xtrprxsrv (char * proxyenv, char * p1)
+{
+ char *p2;
+ p1 = strchr (proxyenv,':');
+ p1++;
+ p1++;
+ p1++;
+ p2 = strrchr (proxyenv,':');
+ *(p2)= '\0';
+ return (p1);
+}
+
+ int xtrprxprt (char * proxyenv)
+{
+ char *p1;
+ char *p2;
+ p1 = strrchr (proxyenv,':');
+ p1++;
+ p2 = strrchr (proxyenv,'/');
+ *(p2)= '\0';
+ return(atoi(p1));
+}
+ char * xtrprxprtcl (char * proxyenv, char * p1)
+{
+ char *p2;
+ p2 = strchr (proxyenv,':');
+ *(p2)= '\0';
+ return (p1);
+}
+char chk_proxy (char *name, int verbose)
+{
+ char prtclstring[250];
+ char * proxprot = NULL;
+ char * proxyenv = getenv("no_proxy");
+ if ( proxyenv != NULL)
+ {
+ if ((strncmp(proxyenv, name ,sizeof(name)))==0)
+ {
+ DEBUG ("noprox=name \n ");
+ return 0;
+ }
+ }
+ proxyenv = getenv("http_proxy");
+ if ( proxyenv == NULL)
+ return 0;
+ proxprot = prtclstring;
+ strlcpy (prtclstring, proxyenv, sizeof (prtclstring));
+
+ proxprot = xtrprxprtcl(proxprot , proxprot );
+ if ((strncmp( proxprot, "http" ,sizeof(proxprot)))!=0)
+ {
+ DEBUG ("no http \n ");
+ return 0;
+ }
+ return 1;
+}
+
+
static int
http_open_server (char *name, short port, int verbose)
{
int result, sockfd;
+ int proxport;
struct hostent *he;
struct sockaddr_in address;
-
+ char proxy = 1;
/* Try to find the login host */
he = gethostbyname (name);
+ DEBUG (_("h_name= %s"),he->h_name);
+
if (he == NULL)
{
+ if ((he = gethostbyname(name)) == NULL)
+ {
ERROR (_("DNS lookup of login server %s failed to resolve to an IP#"), name);
ERROR (_("Try the commands nslookup, host or dig for more details."));
ERROR (_("gethostbyname() returns: %s"), strerror (errno));
@@ -75,6 +137,41 @@
}
else
{
+ result =1;
+ }
+ }
+ else
+ {
+ if ( chk_proxy (name, verbose))
+ {
+ char srvstring[250];
+ char prtclstring[250];
+ char *proxyenv= NULL;
+ char * proxserv= NULL;
+ proxy = 1;
+ proxyenv = getenv("http_proxy");
+ DEBUG (_("proxyenv: %s "), proxyenv);
+ proxserv = srvstring;
+ strlcpy (srvstring,proxyenv , sizeof (srvstring));
+ strlcpy (prtclstring, proxyenv, sizeof (prtclstring));
+ proxserv= xtrprxsrv (proxserv, proxserv );
+ DEBUG (_("proxserv : %s "),proxserv );
+ proxport= xtrprxprt (proxyenv );
+ DEBUG (_("proxyport : %d "),proxport );
+ he = gethostbyname(proxserv);
+ DEBUG (_("proxserv h_name= %s port = %d "),he->h_name, proxport );
+ }
+ else
+ {
+ proxy = 0;
+ he = gethostbyname(name);
+ }
+
+
+ result =1;
+ }
+ if ( result > 0 )
+ {
/* Setup a socket */
sockfd = socket (PF_INET, SOCK_STREAM, 0);
if (-1 == sockfd)
@@ -86,7 +183,11 @@
{
/* Setup address to connecto to ... */
address.sin_family = PF_INET;
+ if (proxy)
+ address.sin_port = htons (proxport);
+ else
address.sin_port = htons (port);
+
address.sin_addr = *((struct in_addr *) he->h_addr);
memset (&(address.sin_zero), 0, sizeof (address.sin_zero));
@@ -95,8 +196,14 @@
if (-1 == result)
{
close (sockfd);
- ERROR (_("Failed to connect to login server (%s): %s"),
- name, strerror (errno));
+ if (proxy )
+ {
+ ERROR (_("Failed to connect to proxy server (%s): %s"),name, strerror (errno));
+ }
+ else
+ {
+ ERROR (_("Failed to connect to login server (%s): %s"), name, strerror (errno));
+ }
}
else
{
@@ -169,10 +276,20 @@
}
/* Register and get login page */
+ if ( chk_proxy (config->login_server , verbose))
+ {
+ snprintf (config->send_msg,sizeof(config->send_msg),PRX_PRLGN_MSG,
+ config->login_server, config->server_port, config->init_page,
+ config->login_server,
+ config->login_server);
+ }
+ else
+ {
sprintf (config->send_msg, PRELOGIN_MSG,
config->init_page,
config->login_server,
config->login_server);
+ }
DEBUG (config->send_msg);
@@ -254,9 +371,13 @@
static int __http_internet_login (config_data_t *config, int verbose)
{
- int result = 0, length;
+ int result = 0;
+ size_t length;
char *login_string, *temp;
-
+ char tmpstr1[512];
+ char tmpstr2[512];
+ login_string = tmpstr1;
+ temp = tmpstr2;
/* Clear the read string to make sure we don't rely on previous results. */
config->get_msg [0] = 0;
config->logged_in = 0;
@@ -278,8 +399,8 @@
+ strlen (config->password_key) + strlen (config->password)
+ strlen (config->login_string_footer) + strlen ("Plus approximately 10%");
- temp = (char *) alloca (length);
- if (!temp)
+
+ if (!length)
{
close (config->sockfd);
ERROR (_("Failed to allocate memory (%d bytes): %s"),
@@ -289,20 +410,20 @@
if (config->login_string_header)
{
- result = sprintf (temp, "%s&", config->login_string_header);
+ result = snprintf (temp, sizeof (tmpstr2), "%s&",config->login_string_header);
}
- result += sprintf (&temp[result], "%s=%s&%s=%s",
+ result += snprintf (&temp[result],sizeof (tmpstr2), "%s=%s&%s=%s",
config->username_key,
config->username,
config->password_key,
config->password);
- if (config->login_string_footer) result += sprintf (&temp[result], "&%s", config->login_string_footer);
+ if (config->login_string_footer)
+ result += snprintf (&temp[result], sizeof (tmpstr2), "&%s", config->login_string_footer);
DEBUG (_("Login string: %s"), temp);
- login_string = (char *) alloca (length);
if (!login_string)
{
close (config->sockfd);
@@ -313,23 +434,40 @@
/* Encode the the login string. No spaces! */
{
int i;
-
- length = strlen (temp) + 1;
+ length = strlen (temp);
for (i = 0; i < length; i++)
{
- if (' ' == temp [i]) login_string [i] = '+';
- else login_string [i] = temp [i];
+ if (' ' == temp [i])
+ login_string [i] = '+';
+ else
+ login_string [i] = temp [i];
}
}
+
/* Paste it all into the login template */
+ if ( chk_proxy (config->login_server , verbose))
+ {
+ snprintf (config->send_msg,sizeof (config->send_msg), PRX_LGN_MSG ,
+ config->login_server, config->server_port, config->login_page,
+ config->login_server,
+ getenv ("OSTYPE"),
+ config->login_server,config->server_port, config->init_page,
+ (int) length,
+ login_string );
+ }
+ else
+ {
sprintf (config->send_msg, LOGIN_MSG,
config->login_page,
config->login_server,
config->login_server,
config->init_page,
- length,
+ (int) length,
login_string);
+ }
+ DEBUG (_("login_string= : %s"), login_string);
+ strlcat (config->send_msg ,login_string,sizeof (config->send_msg));
/* Send login string to server */
DEBUG (config->send_msg);
@@ -409,6 +547,10 @@
LOG (_("%s(): Start %s with --verbose --debug to see whole reply."), __FUNCTION__, PACKAGE_NAME);
}
}
+ else if (config->logged_in == 1)
+ {
+ ERROR(_("SUCCESSFUL LOGIN"));
+ }
return result;
}
@@ -444,10 +586,20 @@
}
/* Send logout request */
+ if ( chk_proxy (config->login_server, verbose))
+ {
+ snprintf (config->send_msg, sizeof (config->send_msg),
+ PRX_LGT_MSG, config->login_server,config->server_port,config->logout_page,
+ config->login_server,config->server_port, config->init_page,
+ config->login_server);
+ }
+ else
+ {
sprintf (config->send_msg,
LOGOUT_MSG,
config->logout_page, config->login_server,
config->init_page, config->login_server);
+ }
DEBUG (config->send_msg);
@@ -460,6 +612,9 @@
return -1;
}
+ DEBUG (config->send_msg);
+ result = send (config->sockfd, config->send_msg, strlen (config->send_msg), 0);
+
LOG (_("Waiting for logout reply, 5 second timeout ..."));
result = http_poll_read (config->sockfd, 5);
@@ -491,11 +646,12 @@
close (config->sockfd);
ERROR(_("LOGOUT FAILED"));
config->logged_in = 0;
-
+ DEBUG (_("config->get_msg 0:%s \n "),config->get_msg);
+ DEBUG (_("config->logged_out_string 0:%s \n "), config->logged_out_string );
return -1;
}
- LOG (_("SUCCESSFUL LOGOUT"));
+ ERROR (_("SUCCESSFUL LOGOUT"));
/* Make sure to close the connection before leaving. */
close (config->sockfd);
@@ -629,3 +785,4 @@
* indent-tabs-mode: nil;
* End:
*/
+