Vector modifications in perl.c and perm.c
Erik Klavon
erik at eriq.org
Fri Mar 8 00:25:00 UTC 2002
Greetings
Enclosed is a patch which reworks the implementation of perl_access:
using vectors.
Erik
diff -r -C3 inn/nnrpd/nnrpd.h inn_patch/nnrpd/nnrpd.h
*** inn/nnrpd/nnrpd.h Sun Mar 3 17:27:09 2002
--- inn_patch/nnrpd/nnrpd.h Thu Mar 7 14:21:12 2002
***************
*** 21,28 ****
#include "nntp.h"
#include "paths.h"
#include "storage.h"
-
/*
** Maximum input line length, sigh.
*/
--- 21,28 ----
#include "nntp.h"
#include "paths.h"
#include "storage.h"
+ #include "inn/vector.h"
/*
** Maximum input line length, sigh.
*/
***************
*** 251,257 ****
extern int TrackClient(char *client, char* user);
#ifdef DO_PERL
! extern char **perlAccess(char *clientHost, char *clientIpString, char *serverHost, char *user);
extern int perlAuthenticate(char *clientHost, char *clientIpString, char *serverHost, char *user, char *passwd, char *accesslist, char *errorstring);
extern int perlAuthInit(void);
#endif /* DO_PERL */
--- 251,257 ----
extern int TrackClient(char *client, char* user);
#ifdef DO_PERL
! extern void perlAccess(char *clientHost, char *clientIpString, char *serverHost, char *user, struct vector *access_vec);
extern int perlAuthenticate(char *clientHost, char *clientIpString, char *serverHost, char *user, char *passwd, char *accesslist, char *errorstring);
extern int perlAuthInit(void);
#endif /* DO_PERL */
diff -r -C3 inn/nnrpd/perl.c inn_patch/nnrpd/perl.c
*** inn/nnrpd/perl.c Sun Mar 3 17:27:09 2002
--- inn_patch/nnrpd/perl.c Thu Mar 7 14:21:13 2002
***************
*** 202,244 ****
PerlLoaded = TRUE;
}
! static char *itoa(int n) {
! static char s[32]; /* definitely more than log10(maxint) */
! snprintf(s, sizeof(s), "%d", n);
! return s;
! }
!
! char **perlAccess(char *clientHost, char *clientIpString, char *serverHost, char *user) {
dSP;
HV *attribs;
SV *sv;
int rc, i;
! char *p, *key, *val, **access_array;
if (!PerlFilterActive)
! return 0;
ENTER;
SAVETMPS;
!
attribs = perl_get_hv("attributes", TRUE);
! hv_store(attribs, "hostname", 8, newSVpv(clientHost, 0), 0);
! hv_store(attribs, "ipaddress", 9, newSVpv(clientIpString, 0), 0);
! hv_store(attribs, "interface", 9, newSVpv(serverHost, 0), 0);
hv_store(attribs, "username", 8, newSVpv(user, 0), 0);
PUSHMARK(SP);
if (perl_get_cv("access", 0) != NULL)
! rc = perl_call_pv("access", G_EVAL|G_ARRAY);
SPAGAIN;
if (rc == 0 ) { /* Error occured, same as checking $@ */
! syslog(L_ERROR, "Perl function access died: %s",
! SvPV(ERRSV, PL_na));
! Reply("%d Internal Error (1). Goodbye\r\n", NNTP_ACCESS_VAL);
! ExitWithStats(1, TRUE);
}
if ((rc % 2) != 0) {
--- 202,238 ----
PerlLoaded = TRUE;
}
! void perlAccess(char *ClientHost, char *ClientIP, char *ServerHost, char *user, struct vector *access_vec) {
dSP;
HV *attribs;
SV *sv;
int rc, i;
! char *p, *key, *val;
if (!PerlFilterActive)
! return;
ENTER;
SAVETMPS;
!
attribs = perl_get_hv("attributes", TRUE);
! hv_store(attribs, "hostname", 8, newSVpv(ClientHost, 0), 0);
! hv_store(attribs, "ipaddress", 9, newSVpv(ClientIP, 0), 0);
! hv_store(attribs, "interface", 9, newSVpv(ServerHost, 0), 0);
hv_store(attribs, "username", 8, newSVpv(user, 0), 0);
PUSHMARK(SP);
if (perl_get_cv("access", 0) != NULL)
! rc = perl_call_pv("access", G_EVAL|G_ARRAY);
SPAGAIN;
if (rc == 0 ) { /* Error occured, same as checking $@ */
! syslog(L_ERROR, "Perl function access died: %s",
! SvPV(ERRSV, PL_na));
! Reply("%d Internal Error (1). Goodbye\r\n", NNTP_ACCESS_VAL);
! ExitWithStats(1, TRUE);
}
if ((rc % 2) != 0) {
***************
*** 246,261 ****
Reply("%d Internal Error (2). Goodbye\r\n", NNTP_ACCESS_VAL);
ExitWithStats(1, TRUE);
}
!
! i = (rc / 2) + 1;
! access_array = calloc(i, sizeof(char *));
! i--;
! p = itoa(i);
! access_array[0] = COPY(p);
! free(p);
!
! i = 0;
!
for (i = (rc / 2); i >= 1; i--) {
sv = POPs;
p = SvPV_nolen(sv);
--- 240,248 ----
Reply("%d Internal Error (2). Goodbye\r\n", NNTP_ACCESS_VAL);
ExitWithStats(1, TRUE);
}
!
! vector_resize(access_vec, (rc / 2));
!
for (i = (rc / 2); i >= 1; i--) {
sv = POPs;
p = SvPV_nolen(sv);
***************
*** 263,274 ****
sv = POPs;
p = SvPV_nolen(sv);
key = COPY(p);
!
key = strcat(key, ": \"");
key = strcat(key, val);
key = strcat(key, "\"\n");
! access_array[i] = COPY(key);
!
free(key);
free(val);
}
--- 250,261 ----
sv = POPs;
p = SvPV_nolen(sv);
key = COPY(p);
!
key = strcat(key, ": \"");
key = strcat(key, val);
key = strcat(key, "\"\n");
! vector_add(access_vec, key);
!
free(key);
free(val);
}
***************
*** 277,283 ****
FREETMPS;
LEAVE;
- return access_array;
}
int perlAuthInit(void) {
--- 264,269 ----
diff -r -C3 inn/nnrpd/perm.c inn_patch/nnrpd/perm.c
*** inn/nnrpd/perm.c Sun Mar 3 17:27:09 2002
--- inn_patch/nnrpd/perm.c Thu Mar 7 14:21:13 2002
***************
*** 81,87 ****
static char *AuthenticateUser(AUTHGROUP*, char*, char*, char*);
static void GrowArray(void***, void*);
! static void PERMarraytoaccess(ACCESSGROUP *acc, const char *name, char **array, int array_len);
/* global variables */
static AUTHGROUP **auth_realms;
--- 81,87 ----
static char *AuthenticateUser(AUTHGROUP*, char*, char*, char*);
static void GrowArray(void***, void*);
! static void PERMvectortoaccess(ACCESSGROUP *acc, const char *name, struct vector *acccess_vec);
/* global variables */
static AUTHGROUP **auth_realms;
***************
*** 986,992 ****
}
}
! static void PERMarraytoaccess(ACCESSGROUP *acc, const char *name, char **array, int array_len) {
CONFTOKEN *tok = NULL;
CONFFILE *file;
char *str;
--- 986,992 ----
}
}
! static void PERMvectortoaccess(ACCESSGROUP *acc, const char *name, struct vector *access_vec) {
CONFTOKEN *tok = NULL;
CONFFILE *file;
char *str;
***************
*** 994,1001 ****
file = NEW(CONFFILE, 1);
memset(file, 0, sizeof(CONFFILE));
! file->array = array;
! file->array_len = array_len;
memset(ConfigBit, '\0', ConfigBitsize);
--- 994,1001 ----
file = NEW(CONFFILE, 1);
memset(file, 0, sizeof(CONFFILE));
! file->array = access_vec->strings;
! file->array_len = access_vec->count;
memset(ConfigBit, '\0', ConfigBitsize);
***************
*** 1003,1009 ****
str = COPY(name);
acc->name = str;
! for (i = 0; i <= array_len; i++) {
tok = CONFgettoken(PERMtoks, file);
if (tok != NULL) {
--- 1003,1009 ----
str = COPY(name);
acc->name = str;
! for (i = 0; i <= access_vec->count; i++) {
tok = CONFgettoken(PERMtoks, file);
if (tok != NULL) {
***************
*** 1469,1479 ****
char *cp, **list;
char *user[2];
static ACCESSGROUP *noaccessconf;
! char **access_array;
! char *p, *uname;
char *cpp, *perl_path;
char **args;
! int array_len = 0;
if (ConfigBit == NULL) {
if (PERMMAX % 8 == 0)
--- 1469,1478 ----
char *cp, **list;
char *user[2];
static ACCESSGROUP *noaccessconf;
! char *uname;
char *cpp, *perl_path;
char **args;
! struct vector *access_vec;
if (ConfigBit == NULL) {
if (PERMMAX % 8 == 0)
***************
*** 1508,1525 ****
uname = COPY(PERMuser);
DISPOSE(args);
! args = perlAccess(ClientHost, ClientIpString, ServerHost, uname);
! p = args[0];
! array_len = atoi(p);
! access_array = args;
! access_array++;
DISPOSE(uname);
access_realms[0] = NEW(ACCESSGROUP, 1);
memset(access_realms[0], 0, sizeof(ACCESSGROUP));
! PERMarraytoaccess(access_realms[0], "perl-dyanmic", access_array, array_len);
} else {
syslog(L_ERROR, "No script specified in auth method.\n");
Reply("%d NNTP server unavailable. Try later.\r\n", NNTP_TEMPERR_VAL);
--- 1507,1523 ----
uname = COPY(PERMuser);
DISPOSE(args);
! access_vec = vector_new();
+ perlAccess(ClientHost, ClientIpString, ServerHost, uname, access_vec);
DISPOSE(uname);
access_realms[0] = NEW(ACCESSGROUP, 1);
memset(access_realms[0], 0, sizeof(ACCESSGROUP));
! PERMvectortoaccess(access_realms[0], "perl-dyanmic", access_vec);
!
! vector_free(access_vec);
} else {
syslog(L_ERROR, "No script specified in auth method.\n");
Reply("%d NNTP server unavailable. Try later.\r\n", NNTP_TEMPERR_VAL);
--
erik | "It is idle to think that, by means of words, | Maurice
kl at von | any real communication can ever pass | Maeterlinck
eriq.org | from one [human] to another." | Silence
More information about the inn-patches
mailing list