head 1.8; access; symbols OPENPKG_E1_MP_HEAD:1.6 OPENPKG_E1_MP:1.6 OPENPKG_E1_MP_2_STABLE:1.6 OPENPKG_E1_FP:1.6 OPENPKG_2_STABLE_MP:1.6 OPENPKG_2_STABLE_20061018:1.6 OPENPKG_2_STABLE_20060622:1.6 OPENPKG_2_STABLE:1.6.0.2 OPENPKG_2_STABLE_BP:1.6 OPENPKG_2_5_RELEASE:1.4 OPENPKG_2_5_SOLID:1.4.0.12 OPENPKG_2_5_SOLID_BP:1.4 OPENPKG_2_4_RELEASE:1.4 OPENPKG_2_4_SOLID:1.4.0.10 OPENPKG_2_4_SOLID_BP:1.4 OPENPKG_CW_FP:1.4 OPENPKG_2_3_RELEASE:1.4 OPENPKG_2_3_SOLID:1.4.0.8 OPENPKG_2_3_SOLID_BP:1.4 OPENPKG_2_2_RELEASE:1.4 OPENPKG_2_2_SOLID:1.4.0.6 OPENPKG_2_2_SOLID_BP:1.4 OPENPKG_2_1_RELEASE:1.4 OPENPKG_2_1_SOLID:1.4.0.4 OPENPKG_2_1_SOLID_BP:1.4 OPENPKG_2_0_RELEASE:1.4 OPENPKG_2_0_SOLID:1.4.0.2 OPENPKG_2_0_SOLID_BP:1.4; locks; strict; comment @# @; 1.8 date 2007.11.30.10.50.15; author kk; state Exp; branches; next 1.7; commitid jgq1NNrPY93ovAHs; 1.7 date 2007.02.08.08.35.47; author rse; state Exp; branches; next 1.6; commitid VosKuB5d5xBafF5s; 1.6 date 2006.02.22.19.09.51; author rse; state Exp; branches; next 1.5; commitid LRseObw8cE7c2Cmr; 1.5 date 2006.02.22.18.43.47; author rse; state Exp; branches; next 1.4; commitid kRLBlHHS5NTfTBmr; 1.4 date 2004.01.29.15.09.57; author ms; state Exp; branches; next 1.3; 1.3 date 2004.01.16.23.28.02; author ms; state Exp; branches; next 1.2; 1.2 date 2004.01.16.20.15.33; author ms; state Exp; branches; next 1.1; 1.1 date 2003.10.14.20.34.43; author thl; state Exp; branches; next ; desc @@ 1.8 log @Fixed the group patch that did not get updated to 2.3.10 in the last update round. Moved lmtpunix logging into the lmtp.log. @ text @diff -r e502c48f9ba9 lib/auth_unix.c --- a/lib/auth_unix.c Thu Oct 25 08:10:12 2007 +0200 +++ b/lib/auth_unix.c Fri Nov 30 11:33:23 2007 +0100 @@@@ -48,12 +48,133 @@@@ #include #include #include +#include #include #include #include "auth.h" #include "libcyr_cfg.h" #include "xmalloc.h" + +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +/* + * __getgrent.c - This file is part of the libc-8086/grp package for ELKS, + * Copyright (C) 1995, 1996 Nat Friedman . + * + * 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 +#include +#include + +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__ */ struct auth_state { char userid[81]; @@@@ -142,6 +263,25 @@@@ static char allowedchars[256] = { 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 @@@@ -177,7 +317,7 @@@@ size_t len; */ 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 @@@@ static struct auth_state *mynewstate(con int ret, ngroups = 0; #else char **mem; + FILE *groupfile; #endif identifier = mycanonifyid(identifier, 0); @@@@ -286,20 +427,23 @@@@ err: if (groupids) free(groupids); #else /* !HAVE_GETGROUPLIST */ - 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); + } #endif /* HAVE_GETGROUPLIST */ return newstate; @ 1.7 log @upgrade and package style cleanups @ text @d1 4 a4 4 Index: lib/auth_unix.c --- lib/auth_unix.c.orig 2006-11-30 18:11:22 +0100 +++ lib/auth_unix.c 2007-02-08 09:32:47 +0100 @@@@ -48,6 +48,7 @@@@ d12 1 a12 1 @@@@ -55,6 +56,126 @@@@ d15 1 a15 1 d135 1 a135 1 + d138 1 a138 2 char **group; @@@@ -142,6 +263,25 @@@@ d164 1 a164 1 @@@@ -177,7 +317,7 @@@@ d173 3 a175 3 @@@@ -224,6 +364,7 @@@@ struct passwd *pwd; struct group *grp; d178 1 d181 2 a182 2 if (!identifier) return 0; @@@@ -240,20 +381,23 @@@@ d184 1 a184 2 pwd = getpwnam(identifier); d216 2 a218 2 } @ 1.6 log @add NetBSD support. Submitted by: anonymous @ text @d2 2 a3 2 --- lib/auth_unix.c.orig 2005-02-16 22:06:50 +0100 +++ lib/auth_unix.c 2005-12-12 09:56:53 +0100 @ 1.5 log @cleanup and improve packaging @ text @d16 1 a16 1 +#ifdef __FreeBSD__ @ 1.4 log @upgrading package: imapd 2.1.16 -> 2.2.3 @ text @d1 3 a3 2 --- lib/auth_unix.c.orig Wed Oct 22 20:50:12 2003 +++ lib/auth_unix.c Fri Jan 16 15:24:05 2004 d20 1 a20 1 + * d122 1 a122 1 + a135 2 const char *auth_method_desc = "unix"; d137 3 a139 1 @@@@ -144,6 +265,25 @@@@ d165 1 a165 1 @@@@ -179,7 +319,7 @@@@ d180 1 a180 1 identifier = auth_canonifyid(identifier, 0); @ 1.3 log @2.2.3 seems not too ready yet (process ***** exited, status 75), so back out upgrade from 2.1.16 @ text @d1 3 a3 3 --- 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 @@@@ d11 2 a12 1 #include "auth.h" d138 1 a138 1 @@@@ -143,6 +264,25 @@@@ d164 1 a164 1 @@@@ -185,7 +325,7 @@@@ d173 1 a173 1 @@@@ -228,6 +368,7 @@@@ d181 1 a181 3 @@@@ -241,20 +382,23 @@@@ newstate->ngroups = 0; newstate->group = (char **) 0; d183 2 @ 1.2 log @upgrading package: imapd 2.1.16 -> 2.2.3 @ text @d1 3 a3 3 --- lib/auth_unix.c.orig Wed Oct 22 20:50:12 2003 +++ lib/auth_unix.c Fri Jan 16 15:24:05 2004 @@@@ -48,6 +48,7 @@@@ d11 1 a11 2 @@@@ -55,6 +56,126 @@@@ #include "libcyr_cfg.h" d137 1 a137 1 @@@@ -144,6 +265,25 @@@@ d163 1 a163 1 @@@@ -179,7 +319,7 @@@@ d172 1 a172 1 @@@@ -224,6 +364,7 @@@@ d180 3 a182 1 @@@@ -240,20 +381,23 @@@@ a183 2 pwd = getpwnam(identifier); @ 1.1 log @add patch to support system independent groups and port it to FreeBSD @ text @d1 3 a3 3 --- 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 @@@@ d11 2 a12 1 #include "auth.h" d138 1 a138 1 @@@@ -143,6 +264,25 @@@@ d164 1 a164 1 @@@@ -185,7 +325,7 @@@@ d173 1 a173 1 @@@@ -228,6 +368,7 @@@@ d181 1 a181 3 @@@@ -241,20 +382,23 @@@@ newstate->ngroups = 0; newstate->group = (char **) 0; d183 2 @