OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Thomas Lotterer
  Root:   /e/openpkg/cvs                   Email:  [EMAIL PROTECTED]
  Module: openpkg-src openpkg-web          Date:   14-Oct-2003 22:34:43
  Branch: HEAD                             Handle: 2003101421344102

  Added files:
    openpkg-src/imapd       imapd.patch.group
  Modified files:
    openpkg-src/imapd       imapd.spec
    openpkg-web             news.txt

  Log:
    add patch to support system independent groups and port it to FreeBSD

  Summary:
    Revision    Changes     Path
    1.1         +217 -0     openpkg-src/imapd/imapd.patch.group
    1.98        +9  -1      openpkg-src/imapd/imapd.spec
    1.7006      +1  -0      openpkg-web/news.txt
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-src/imapd/imapd.patch.group
  ============================================================================
  $ cvs diff -u -r0 -r1.1 imapd.patch.group
  --- /dev/null 2003-10-14 22:34:43.000000000 +0200
  +++ imapd.patch.group 2003-10-14 22:34:43.000000000 +0200
  @@ -0,0 +1,217 @@
  +--- lib/auth_unix.c.orig     2003-05-13 17:33:26.000000000 +0200
  ++++ lib/auth_unix.c  2003-10-08 10:29:55.000000000 +0200
  +@@ -48,12 +48,133 @@
  + #include <stdlib.h>
  + #include <pwd.h>
  + #include <grp.h>
  ++#include <stdio.h>
  + #include <ctype.h>
  + #include <string.h>
  + 
  + #include "auth.h"
  + #include "xmalloc.h"
  + 
  ++#ifdef __FreeBSD__
  ++/*
  ++ * __getgrent.c - This file is part of the libc-8086/grp package for ELKS,
  ++ * Copyright (C) 1995, 1996 Nat Friedman <[EMAIL PROTECTED]>.
  ++ * 
  ++ *  This library is free software; you can redistribute it and/or
  ++ *  modify it under the terms of the GNU Library General Public
  ++ *  License as published by the Free Software Foundation; either
  ++ *  version 2 of the License, or (at your option) any later version.
  ++ *
  ++ *  This library is distributed in the hope that it will be useful,
  ++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  ++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  ++ *  Library General Public License for more details.
  ++ *
  ++ *  You should have received a copy of the GNU Library General Public
  ++ *  License along with this library; if not, write to the Free
  ++ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  ++ *
  ++ */
  ++
  ++#include <unistd.h>
  ++#include <string.h>
  ++#include <errno.h>
  ++
  ++static struct group *__getgrent(int grp_fd, char *line_buff, char **members)
  ++{
  ++    short line_index;
  ++    short buff_size;
  ++    static struct group group;
  ++    register char *ptr;
  ++    char *field_begin;
  ++    short member_num;
  ++    char *endptr;
  ++    int line_len;
  ++
  ++    /* We use the restart label to handle malformatted lines */
  ++    restart:
  ++    line_index = 0;
  ++    buff_size = 256;
  ++
  ++    line_buff = realloc(line_buff, buff_size);
  ++    while (1) {
  ++        if ((line_len = read(grp_fd, line_buff + line_index,
  ++                        buff_size - line_index)) <= 0) {
  ++            return NULL;
  ++        }
  ++        field_begin = strchr(line_buff, '\n');
  ++        if (field_begin != NULL) {
  ++            lseek(grp_fd,
  ++                    (long) (1 + field_begin -
  ++                            (line_len + line_index + line_buff)), SEEK_CUR);
  ++            *field_begin = '\0';
  ++            if (*line_buff == '#' || *line_buff == ' '
  ++                    || *line_buff == '\n' || *line_buff == '\t')
  ++                goto restart;
  ++            break;
  ++        } else {
  ++            /* Allocate some more space */
  ++            line_index = buff_size;
  ++            buff_size += 256;
  ++            line_buff = realloc(line_buff, buff_size);
  ++        }
  ++    }
  ++
  ++    /* Now parse the line */
  ++    group.gr_name = line_buff;
  ++    ptr = strchr(line_buff, ':');
  ++    if (ptr == NULL)
  ++        goto restart;
  ++    *ptr++ = '\0';
  ++
  ++    group.gr_passwd = ptr;
  ++    ptr = strchr(ptr, ':');
  ++    if (ptr == NULL)
  ++        goto restart;
  ++    *ptr++ = '\0';
  ++
  ++    field_begin = ptr;
  ++    ptr = strchr(ptr, ':');
  ++    if (ptr == NULL)
  ++        goto restart;
  ++    *ptr++ = '\0';
  ++
  ++    group.gr_gid = (gid_t) strtoul(field_begin, &endptr, 10);
  ++    if (*endptr != '\0')
  ++        goto restart;
  ++
  ++    member_num = 0;
  ++    field_begin = ptr;
  ++
  ++    if (members != NULL)
  ++        free(members);
  ++    members = (char **) malloc((member_num + 1) * sizeof(char *));
  ++    for ( ; field_begin && *field_begin != '\0'; field_begin = ptr) {
  ++        if ((ptr = strchr(field_begin, ',')) != NULL)
  ++            *ptr++ = '\0';
  ++        members[member_num++] = field_begin;
  ++        members = (char **) realloc(members,
  ++                (member_num + 1) * sizeof(char *));
  ++    }
  ++    members[member_num] = NULL;
  ++
  ++    group.gr_mem = members;
  ++    return &group;
  ++}
  ++    
  ++static char *line_buff = NULL;
  ++static char **members  = NULL;
  ++
  ++struct group *fgetgrent(FILE *file)
  ++{
  ++    if (file == NULL) {
  ++        errno = EINTR;
  ++        return NULL;
  ++    }
  ++    return __getgrent(fileno(file), line_buff, members);
  ++}
  ++#endif /* __FreeBSD__ */
  ++
  + const char *auth_method_desc = "unix";
  + 
  + struct auth_state {
  +@@ -143,6 +264,25 @@
  +     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  + };
  + 
  ++static struct group* fgetgrnam(const char* name)
  ++{
  ++    struct group *grp;
  ++    FILE *groupfile;
  ++
  ++    groupfile = fopen("/etc/imapd.group", "r");
  ++    if (!groupfile) groupfile = fopen("/etc/group", "r");
  ++    if (groupfile) {
  ++       while ((grp = fgetgrent(groupfile))) {
  ++         if (strcmp(grp->gr_name, name) == 0) {
  ++           fclose(groupfile);
  ++           return grp;
  ++         }
  ++       }
  ++    } 
  ++    if (groupfile) fclose(groupfile);
  ++    return NULL;
  ++} 
  ++
  + /*
  +  * Convert 'identifier' into canonical form.
  +  * Returns a pointer to a static buffer containing the canonical form
  +@@ -185,7 +325,7 @@
  +      */
  +     
  +     if (!strncmp(retbuf, "group:", 6)) {
  +-    grp = getgrnam(retbuf+6);
  ++    grp = fgetgrnam(retbuf+6);
  +     if (!grp) return 0;
  +     strcpy(retbuf+6, grp->gr_name);
  +     return retbuf;
  +@@ -228,6 +368,7 @@
  +     struct passwd *pwd;
  +     struct group *grp;
  +     char **mem;
  ++    FILE *groupfile;
  + 
  +     identifier = auth_canonifyid(identifier, 0);
  +     if (!identifier) return 0;
  +@@ -241,20 +382,23 @@
  +     newstate->ngroups = 0;
  +     newstate->group = (char **) 0;
  + 
  +-    setgrent();
  +-    while ((grp = getgrent())) {
  +-    for (mem = grp->gr_mem; *mem; mem++) {
  +-        if (!strcmp(*mem, identifier)) break;
  +-    }
  +-
  +-    if (*mem || (pwd && pwd->pw_gid == grp->gr_gid)) {
  +-        newstate->ngroups++;
  +-        newstate->group = (char **)xrealloc((char *)newstate->group,
  +-                                            newstate->ngroups * sizeof(char *));
  +-        newstate->group[newstate->ngroups-1] = xstrdup(grp->gr_name);
  +-    }
  +-    }
  +-    endgrent();
  ++    groupfile = fopen("/etc/imapd.group", "r");
  ++    if (!groupfile) groupfile = fopen("/etc/group", "r");
  ++    if (groupfile) {
  ++       while ((grp = fgetgrent(groupfile))) {
  ++         for (mem = grp->gr_mem; *mem; mem++) {
  ++            if (!strcmp(*mem, identifier)) break;
  ++         }
  ++
  ++         if (*mem || (pwd && pwd->pw_gid == grp->gr_gid)) {
  ++            newstate->ngroups++;
  ++            newstate->group = (char **)xrealloc((char *)newstate->group,
  ++                                                newstate->ngroups * sizeof(char 
*));
  ++            newstate->group[newstate->ngroups-1] = xstrdup(grp->gr_name);
  ++         }
  ++       }
  ++       fclose(groupfile);
  ++    } 
  +     return newstate;
  + }
  + 
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/imapd/imapd.spec
  ============================================================================
  $ cvs diff -u -r1.97 -r1.98 imapd.spec
  --- openpkg-src/imapd/imapd.spec      22 Sep 2003 11:13:04 -0000      1.97
  +++ openpkg-src/imapd/imapd.spec      14 Oct 2003 20:34:43 -0000      1.98
  @@ -33,11 +33,12 @@
   Group:        Mail
   License:      BSD
   Version:      2.1.15
  -Release:      20030922
  +Release:      20031014
   
   #   package options
   %option       with_fsl    yes
   %option       with_vhost  no
  +%option       with_group  no
   
   #   list of sources
   Source0:      ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-imapd-%{version}.tar.gz
  @@ -47,6 +48,7 @@
   Source4:      fsl.imapd
   Patch0:       imapd.patch
   Patch1:       imapd.patch.vhost
  +Patch2:       imapd.patch.group
   
   #   build information
   Prefix:       %{l_prefix}
  @@ -75,6 +77,12 @@
       %patch0 -p0
   %if "%{with_vhost}" == "yes"
       %patch1 -p0
  +%endif
  +%if "%{with_group}" == "yes"
  +    %patch2 -p0
  +    %{l_shtool} subst \
  +        -e 's;/etc/imapd\.group;%{l_prefix}/etc/imapd/imapd.group;' \
  +        lib/auth_unix.c
   %endif
       %{l_shtool} subst \
           -e 's;-L/usr/local/lib;;g' \
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-web/news.txt
  ============================================================================
  $ cvs diff -u -r1.7005 -r1.7006 news.txt
  --- openpkg-web/news.txt      14 Oct 2003 18:33:26 -0000      1.7005
  +++ openpkg-web/news.txt      14 Oct 2003 20:34:41 -0000      1.7006
  @@ -1,3 +1,4 @@
  +14-Oct-2003: Upgraded package: P<imapd-2.1.15-20031014>
   14-Oct-2003: Upgraded package: P<blender-2.28c-20031014>
   14-Oct-2003: Upgraded package: P<samba3-3.0.0-20031014>
   14-Oct-2003: Upgraded package: P<pound-1.5-20031014>
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [EMAIL PROTECTED]

Reply via email to