groupaccess.c revision 76259
176259Sgreen/* $OpenBSD: groupaccess.c,v 1.3 2001/01/29 01:58:15 niklas Exp $ */ 276259Sgreen 376259Sgreen/* 476259Sgreen * Copyright (c) 2001 Kevin Steves. All rights reserved. 576259Sgreen * 676259Sgreen * Redistribution and use in source and binary forms, with or without 776259Sgreen * modification, are permitted provided that the following conditions 876259Sgreen * are met: 976259Sgreen * 1. Redistributions of source code must retain the above copyright 1076259Sgreen * notice, this list of conditions and the following disclaimer. 1176259Sgreen * 2. Redistributions in binary form must reproduce the above copyright 1276259Sgreen * notice, this list of conditions and the following disclaimer in the 1376259Sgreen * documentation and/or other materials provided with the distribution. 1476259Sgreen * 1576259Sgreen * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1676259Sgreen * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1776259Sgreen * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1876259Sgreen * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1976259Sgreen * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2076259Sgreen * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2176259Sgreen * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2276259Sgreen * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2376259Sgreen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2476259Sgreen * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2576259Sgreen */ 2676259Sgreen 2776259Sgreen#include "includes.h" 2876259Sgreen 2976259Sgreen#include "groupaccess.h" 3076259Sgreen#include "xmalloc.h" 3176259Sgreen#include "match.h" 3276259Sgreen#include "log.h" 3376259Sgreen 3476259Sgreenstatic int ngroups; 3576259Sgreenstatic char *groups_byname[NGROUPS_MAX + 1]; /* +1 for base/primary group */ 3676259Sgreen 3776259Sgreenint 3876259Sgreenga_init(const char *user, gid_t base) 3976259Sgreen{ 4076259Sgreen gid_t groups_bygid[NGROUPS_MAX + 1]; 4176259Sgreen int i, j; 4276259Sgreen struct group *gr; 4376259Sgreen 4476259Sgreen if (ngroups > 0) 4576259Sgreen ga_free(); 4676259Sgreen 4776259Sgreen ngroups = sizeof(groups_bygid) / sizeof(gid_t); 4876259Sgreen if (getgrouplist(user, base, groups_bygid, &ngroups) == -1) 4976259Sgreen log("getgrouplist: groups list too small"); 5076259Sgreen for (i = 0, j = 0; i < ngroups; i++) 5176259Sgreen if ((gr = getgrgid(groups_bygid[i])) != NULL) 5276259Sgreen groups_byname[j++] = xstrdup(gr->gr_name); 5376259Sgreen return (ngroups = j); 5476259Sgreen} 5576259Sgreen 5676259Sgreenint 5776259Sgreenga_match(char * const *groups, int n) 5876259Sgreen{ 5976259Sgreen int i, j; 6076259Sgreen 6176259Sgreen for (i = 0; i < ngroups; i++) 6276259Sgreen for (j = 0; j < n; j++) 6376259Sgreen if (match_pattern(groups_byname[i], groups[j])) 6476259Sgreen return 1; 6576259Sgreen return 0; 6676259Sgreen} 6776259Sgreen 6876259Sgreenvoid 6976259Sgreenga_free(void) 7076259Sgreen{ 7176259Sgreen int i; 7276259Sgreen 7376259Sgreen if (ngroups > 0) { 7476259Sgreen for (i = 0; i < ngroups; i++) 7576259Sgreen xfree(groups_byname[i]); 7676259Sgreen ngroups = 0; 7776259Sgreen } 7876259Sgreen} 79