Date: Sun, 16 Sep 2012 11:31:26 +0000 (UTC) From: "Bjoern A. Zeeb" <bz@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-svnadmin@freebsd.org Subject: svn commit: r304343 - svnadmin/tools/checkacl Message-ID: <201209161131.q8GBVQFC073714@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: bz (src committer) Date: Sun Sep 16 11:31:25 2012 New Revision: 304343 URL: http://svn.freebsd.org/changeset/ports/304343 Log: Copy over the version from base r240538. This copy is provided to allow the doc repository to be self-hosted. All changes should be synchronized with the other repositories. The "base" version should be seen as master copy. Approved by: portmgr (implicit, beat) Modified: svnadmin/tools/checkacl/checkacl.c Modified: svnadmin/tools/checkacl/checkacl.c ============================================================================== --- svnadmin/tools/checkacl/checkacl.c Sun Sep 16 11:30:21 2012 (r304342) +++ svnadmin/tools/checkacl/checkacl.c Sun Sep 16 11:31:25 2012 (r304343) @@ -4,6 +4,8 @@ * FreeBSD Subversion tree ACL check helper. The program looks in * relevant access files to find out if the committer may commit. * + * !!! Please keep in sync between various SVN repositories. !!! + * * From: Id: cvssh.c,v 1.38 2008/05/31 02:54:58 peter Exp * $FreeBSD$ */ @@ -24,13 +26,16 @@ #include <stdarg.h> #include <fcntl.h> -#define SRCACCESS "/s/svn/base/conf/access" -#define DOCACCESS "/s/svn/doc/conf/access" -#define PORTSACCESS "/s/svn/ports/conf/access" - +#define BASE 0x01 +#define DOC 0x02 +#define PORTS 0x04 + +#define SVNROOT "/s/svn" +#define BASEACCESS SVNROOT "/base/conf/access" +#define DOCACCESS SVNROOT "/doc/conf/access" +#define PORTSACCESS SVNROOT "/ports/conf/access" -static char username[32]; -static char committag[256]; +static char username[_SC_LOGIN_NAME_MAX + 1]; static void msg(const char *fmt, ...) @@ -43,12 +48,12 @@ msg(const char *fmt, ...) va_end(ap); } -static int -karmacheck(FILE *fp, char *name) +static u_int +karmacheck(FILE *fp, const char *name, u_int k) { char buf[1024]; char *p, *s; - int karma; + u_int karma; karma = 0; while ((p = fgets(buf, sizeof(buf) - 1, fp)) != NULL) { @@ -58,11 +63,11 @@ karmacheck(FILE *fp, char *name) if (*s == '#' || *s == '/' || *s == ';') break; /* comment */ if (strcmp(s, "*") == 0) { /* all */ - karma++; + karma |= k; break; } if (strcmp(s, name) == 0) { - karma++; + karma |= k; break; } break; /* ignore further tokens on line */ @@ -71,42 +76,49 @@ karmacheck(FILE *fp, char *name) return karma; } +static u_int +read_access(const char *accessf, const u_int repo, u_int k, + const char *name) +{ + FILE *fp; + u_int karma; + + karma = 0; + fp = fopen(accessf, "r"); + if (fp == NULL && (repo & k) == k) { + msg("Cannot open %s", accessf); + exit(1); + } else if (fp != NULL) { + karma |= karmacheck(fp, name, k); + fclose(fp); + } + + return (karma); +} + +static void +catcommittag(char *committag, const char **comma, const u_int karma, + const u_int k, const char *s) +{ + + if ((karma & k) == 0) + return; + + strcat(committag, *comma); + strcat(committag, s); + *comma = ","; +} + int main(int argc, char *argv[]) { struct passwd *pw; struct stat st; - FILE *fp; - int i; gid_t repogid; gid_t mygroups[NGROUPS_MAX]; - int ngroups; - int writeable; - int karma; - int doccommit; - int portscommit; - int srccommit; - int srckarma; -#ifdef PORTSACCESS - int portskarma; -#endif -#ifdef DOCACCESS - int dockarma; -#endif - const char *comma; + int i, ngroups, writeable; + u_int karma, repo; - srckarma = 0; -#ifdef PORTSACCESS - portskarma = 0; -#endif -#ifdef DOCACCESS - dockarma = 0; -#endif - karma = 0; - doccommit = 0; - portscommit = 0; - srccommit = 0; - writeable = 0; pw = getpwuid(getuid()); if (pw == NULL) { msg("no user for uid %d", getuid()); @@ -117,22 +129,12 @@ main(int argc, char *argv[]) exit(1); } - if (argc == 2) { - if (strcmp(argv[1], "src") == 0) - srccommit = 1; - if (strcmp(argv[1], "ports") == 0) - portscommit = 1; - if (strcmp(argv[1], "doc") == 0) - doccommit = 1; - } else { - srccommit = 1; - } - - /* save in a static buffer */ + /* Save in a static buffer. */ strlcpy(username, pw->pw_name, sizeof(username)); + endpwent(); - if (stat("/s/svn", &st) < 0) { - msg("Cannot stat %s", "/s/svn"); + if (stat(SVNROOT, &st) < 0) { + msg("Cannot stat %s", SVNROOT); exit(1); } repogid = st.st_gid; @@ -140,6 +142,7 @@ main(int argc, char *argv[]) msg("unsafe repo gid %d\n", repogid); exit(1); } + writeable = 0; ngroups = getgroups(NGROUPS_MAX, mygroups); if (ngroups > 0) { for (i = 0; i < ngroups; i++) @@ -149,66 +152,48 @@ main(int argc, char *argv[]) if (!writeable) printf("export SVN_READONLY=y\n"); - fp = fopen(SRCACCESS, "r"); - if (fp == NULL) { - msg("Cannot open %s", SRCACCESS); + if (argc != 2) { + msg("No repository given"); exit(1); - } else { - srckarma += karmacheck(fp, pw->pw_name); - fclose(fp); } -#ifdef DOCACCESS - if ((fp = fopen(DOCACCESS, "r")) != NULL) { - dockarma += karmacheck(fp, pw->pw_name); - fclose(fp); - } -#endif -#ifdef PORTSACCESS - if ((fp = fopen(PORTSACCESS, "r")) != NULL) { - portskarma += karmacheck(fp, pw->pw_name); - fclose(fp); + repo = 0; + /* Forward compat for base. */ + if (strcmp(argv[1], "base") == 0 || strcmp(argv[1], "src") == 0) + repo |= BASE; + else if (strcmp(argv[1], "doc") == 0) + repo |= DOC; + else if (strcmp(argv[1], "ports") == 0) + repo |= PORTS; + else { + msg("Invalid repository given: %s", argv[1]); + exit(1); } -#endif - if ((srccommit == 1 && srckarma == 0) || - (portscommit == 1 && portskarma == 0) || - (doccommit == 1 && dockarma == 0)) { - strcpy(committag, "SVN_COMMIT_ATTRIB="); - comma = ""; + karma = 0; +#ifdef BASEACCESS + karma |= read_access(BASEACCESS, repo, BASE, username); +#endif #ifdef DOCACCESS - if (dockarma > 0) { - strcat(committag, comma); - strcat(committag, "doc"); - comma = ","; - karma += dockarma; - } + karma |= read_access(DOCACCESS, repo, DOC, username); #endif #ifdef PORTSACCESS - if (portskarma > 0) { - strcat(committag, comma); - strcat(committag, "ports"); - comma = ","; - karma += portskarma; - } + karma |= read_access(PORTSACCESS, repo, PORTS, username); #endif - if (srckarma > 0) { - strcat(committag, comma); - strcat(committag, "src"); - comma = ","; - karma += srckarma; - } - if (karma != 0) { - printf("export %s\n", committag); - } - } else { - karma += dockarma; - karma += portskarma; - karma += srckarma; - } - if (karma == 0) { /* If still zero, its a readonly access */ printf("export SVN_READONLY=y\n"); + + } else if ((repo & karma) == 0) { + char committag[sizeof("src,doc,ports") + 1]; + const char *comma; + + committag[0] = '\0'; + comma = ""; + catcommittag(committag, &comma, karma, BASE, "src"); + catcommittag(committag, &comma, karma, DOC, "doc"); + catcommittag(committag, &comma, karma, PORTS, "ports"); + printf("export SVN_COMMIT_ATTRIB=\"%s\"\n", committag); } + return (0); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209161131.q8GBVQFC073714>