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