diff options
| author | Marc G. Fournier <scrappy@hub.org> | 1998-02-24 15:27:04 +0000 | 
|---|---|---|
| committer | Marc G. Fournier <scrappy@hub.org> | 1998-02-24 15:27:04 +0000 | 
| commit | 0227a4e1141ae83ac3ae145fa283ede13e86e23e (patch) | |
| tree | 587d06ca0b71c88ae2c1ac4a90bd5bba13a5c668 /src/backend/libpq/hba.c | |
| parent | 96316211c3a1300b304d452e09c726fb775aa502 (diff) | |
From: "Denis V. Dmitrienko" <denis@null.net>
What it does:
It solves stupid problem with cyrillic charsets IP-based on-fly recoding.
take a look at /data/charset.conf for details.
You can use any tables for any charset.
Tables are from Russian Apache project.
Tables in this patch contains also Ukrainian characters.
Then run ./configure --enable-recode
Diffstat (limited to 'src/backend/libpq/hba.c')
| -rw-r--r-- | src/backend/libpq/hba.c | 188 | 
1 files changed, 187 insertions, 1 deletions
| diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index 857f324a0e7..872601293c7 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -7,7 +7,7 @@   *   *   * IDENTIFICATION - *	  $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.27 1998/01/27 03:24:56 scrappy Exp $ + *	  $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.28 1998/02/24 15:18:41 scrappy Exp $   *   *-------------------------------------------------------------------------   */ @@ -846,6 +846,192 @@ authident(struct sockaddr_in *raddr, struct sockaddr_in *laddr,  } +#ifdef CYR_RECODE +#define CHARSET_FILE "charset.conf" +#define MAX_CHARSETS   10 +#define KEY_HOST       1 +#define KEY_BASE       2 +#define KEY_TABLE      3 + +struct CharsetItem +{ +  char Orig[MAX_TOKEN]; +  char Dest[MAX_TOKEN]; +  char Table[MAX_TOKEN]; +}; + +int InRange(char *buf,int host) +{ +  int valid,i,FromAddr,ToAddr,tmp; +  struct in_addr file_ip_addr; +  char *p; +  unsigned int one=0x80000000,NetMask=0; +  unsigned char mask; +  p = strchr(buf,'/'); +  if(p) +  { +    *p++ = '\0'; +    valid = inet_aton(buf, &file_ip_addr); +    if(valid) +    { +      mask = strtoul(p,0,0); +      FromAddr = ntohl(file_ip_addr.s_addr); +      ToAddr = ntohl(file_ip_addr.s_addr); +      for(i=0;i<mask;i++) +      { +        NetMask |= one; +        one >>= 1; +      } +      FromAddr &= NetMask; +      ToAddr = ToAddr | ~NetMask; +      tmp = ntohl(host); +      return ((unsigned)tmp>=(unsigned)FromAddr && +              (unsigned)tmp<=(unsigned)ToAddr); +    } +  } +  else +  { +    p = strchr(buf,'-'); +    if(p) +    { +      *p++ = '\0'; +      valid = inet_aton(buf, &file_ip_addr); +      if(valid) +      { +        FromAddr = ntohl(file_ip_addr.s_addr); +        valid = inet_aton(p, &file_ip_addr); +        if(valid) +        { +          ToAddr = ntohl(file_ip_addr.s_addr); +          tmp = ntohl(host); +          return ((unsigned)tmp>=(unsigned)FromAddr && +                  (unsigned)tmp<=(unsigned)ToAddr); +        } +      } +    } +    else +    { +      valid = inet_aton(buf, &file_ip_addr); +      if(valid) +      { +        FromAddr = file_ip_addr.s_addr; +        return ((unsigned)FromAddr == (unsigned)host); +      } +    } +  } +  return false; +} + +void GetCharSetByHost(char TableName[],int host, const char DataDir[]) +{ +  FILE *file; +  char buf[MAX_TOKEN],BaseCharset[MAX_TOKEN], +    OrigCharset[MAX_TOKEN],DestCharset[MAX_TOKEN],HostCharset[MAX_TOKEN]; +  char c,eof=false; +  char *map_file; +  int key=0,i; +  struct CharsetItem* ChArray[MAX_CHARSETS]; +  int ChIndex=0; + +  *TableName = '\0'; +  map_file = (char *) malloc((strlen(DataDir) + +                              strlen(CHARSET_FILE)+2)*sizeof(char)); +  sprintf(map_file, "%s/%s", DataDir, CHARSET_FILE); +  file = fopen(map_file, "r"); +  if (file == NULL) +    return; +  while (!eof) +  { +    c = getc(file); +    ungetc(c, file); +    if (c == EOF) +      eof = true; +    else +    { +      if (c == '#') +        read_through_eol(file); +      else +      { +        /* Read the key */ +        next_token(file, buf, sizeof(buf)); +        if (buf[0] != '\0') +        { +          if (strcasecmp(buf, "HostCharset") == 0) +            key = KEY_HOST; +          if (strcasecmp(buf, "BaseCharset") == 0) +            key = KEY_BASE; +          if (strcasecmp(buf, "RecodeTable") == 0) +            key = KEY_TABLE; +          switch(key) +          { +            case KEY_HOST: +              /* Read the host */ +              next_token(file, buf, sizeof(buf)); +              if (buf[0] != '\0') +              { +                if (InRange(buf,host)) +                { +                  /* Read the charset */ +                  next_token(file, buf, sizeof(buf)); +                  if (buf[0] != '\0') +                  { +                    strcpy(HostCharset,buf); +                  } +                } +              } +              break; +            case KEY_BASE: +              /* Read the base charset */ +              next_token(file, buf, sizeof(buf)); +              if (buf[0] != '\0') +              { +                strcpy(BaseCharset,buf); +              } +              break; +            case KEY_TABLE: +              /* Read the original charset */ +              next_token(file, buf, sizeof(buf)); +              if (buf[0] != '\0') +              { +                strcpy(OrigCharset,buf); +                /* Read the destination charset */ +                next_token(file, buf, sizeof(buf)); +                if (buf[0] != '\0') +                { +                  strcpy(DestCharset,buf); +                  /* Read the table filename */ +                  next_token(file, buf, sizeof(buf)); +                  if (buf[0] != '\0') +                  { +                    ChArray[ChIndex] = (struct CharsetItem *) malloc(sizeof(struct CharsetItem)); +                    strcpy(ChArray[ChIndex]->Orig,OrigCharset); +                    strcpy(ChArray[ChIndex]->Dest,DestCharset); +                    strcpy(ChArray[ChIndex]->Table,buf); +                    ChIndex++; +                  } +                } +              } +              break; +          } +          read_through_eol(file); +        } +      } +    } +  } +  fclose(file); +  free(map_file); +   +  for(i=0; i<ChIndex; i++) +  { +    if(!strcasecmp(BaseCharset,ChArray[i]->Orig) && +       !strcasecmp(HostCharset,ChArray[i]->Dest)) +    { +      strncpy(TableName,ChArray[i]->Table,79); +    } +    free((struct CharsetItem *) ChArray[i]); +  } +} +#endif  extern int  hba_getauthmethod(SockAddr *raddr, char *database, char *auth_arg, | 
