=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/cvs/rcs.c,v retrieving revision 1.28 retrieving revision 1.29 diff -c -r1.28 -r1.29 *** src/usr.bin/cvs/rcs.c 2005/03/03 21:02:23 1.28 --- src/usr.bin/cvs/rcs.c 2005/03/04 18:21:00 1.29 *************** *** 1,4 **** ! /* $OpenBSD: rcs.c,v 1.28 2005/03/03 21:02:23 jfb Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau * All rights reserved. --- 1,4 ---- ! /* $OpenBSD: rcs.c,v 1.29 2005/03/04 18:21:00 jfb Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau * All rights reserved. *************** *** 230,235 **** --- 230,236 ---- rfp->rf_mode = fmode; TAILQ_INIT(&(rfp->rf_delta)); + TAILQ_INIT(&(rfp->rf_access)); TAILQ_INIT(&(rfp->rf_symbols)); TAILQ_INIT(&(rfp->rf_locks)); *************** *** 314,327 **** FILE *fp; char buf[1024], numbuf[64], *cp; size_t rlen, len; struct rcs_sym *symp; struct rcs_delta *rdp; if (rfp->rf_flags & RCS_SYNCED) return (0); ! fp = fopen(rfp->rf_path, "w"); ! if (fp == NULL) { cvs_log(LP_ERRNO, "failed to open RCS output file `%s'", rfp->rf_path); return (-1); --- 315,328 ---- FILE *fp; char buf[1024], numbuf[64], *cp; size_t rlen, len; + struct rcs_access *ap; struct rcs_sym *symp; struct rcs_delta *rdp; if (rfp->rf_flags & RCS_SYNCED) return (0); ! if ((fp = fopen(rfp->rf_path, "w")) == NULL) { cvs_log(LP_ERRNO, "failed to open RCS output file `%s'", rfp->rf_path); return (-1); *************** *** 333,339 **** numbuf[0] = '\0'; fprintf(fp, "head\t%s;\n", numbuf); ! fprintf(fp, "access;\n"); fprintf(fp, "symbols\n"); TAILQ_FOREACH(symp, &(rfp->rf_symbols), rs_list) { --- 334,344 ---- numbuf[0] = '\0'; fprintf(fp, "head\t%s;\n", numbuf); ! fputs("access", fp); ! TAILQ_FOREACH(ap, &(rfp->rf_access), ra_list) { ! fprintf(fp, "\n\t%s", ap->ra_name); ! } ! fputs(";\n", fp); fprintf(fp, "symbols\n"); TAILQ_FOREACH(symp, &(rfp->rf_symbols), rs_list) { *************** *** 400,405 **** --- 405,484 ---- /* + * rcs_access_add() + * + * Add the login name to the access list for the RCS file . + * Returns 0 on success, or -1 on failure. + */ + int + rcs_access_add(RCSFILE *file, const char *login) + { + struct rcs_access *ap; + + /* first look for duplication */ + TAILQ_FOREACH(ap, &(file->rf_access), ra_list) { + if (strcmp(ap->ra_name, login) == 0) { + cvs_log(LP_ERR, "attempt to add duplicate access `%s'", + login); + return (-1); + } + } + + ap = (struct rcs_access *)malloc(sizeof(*ap)); + if (ap == NULL) { + cvs_log(LP_ERRNO, "failed to allocate RCS access entry"); + return (-1); + } + + ap->ra_name = strdup(login); + if (ap->ra_name == NULL) { + cvs_log(LP_ERRNO, "failed to duplicate user name"); + free(ap); + return (-1); + } + + TAILQ_INSERT_TAIL(&(file->rf_access), ap, ra_list); + + /* not synced anymore */ + file->rf_flags &= ~RCS_SYNCED; + return (0); + + + } + + + /* + * rcs_access_remove() + * + * Remove an entry with login name from the access list of the RCS + * file . + * Returns 0 on success, or -1 on failure. + */ + int + rcs_access_remove(RCSFILE *file, const char *login) + { + struct rcs_access *ap; + + TAILQ_FOREACH(ap, &(file->rf_access), ra_list) + if (strcmp(ap->ra_name, login) == 0) + break; + + if (ap == NULL) { + cvs_log(LP_ERR, "%s: no access for `%s'", file->rf_path, login); + return (-1); + } + + TAILQ_REMOVE(&(file->rf_access), ap, ra_list); + free(ap->ra_name); + free(ap); + + /* not synced anymore */ + file->rf_flags &= ~RCS_SYNCED; + return (0); + } + + + /* * rcs_sym_add() * * Add a symbol to the list of symbols for the RCS file . The new symbol *************** *** 1130,1142 **** } break; case RCS_TOK_ACCESS: ! rcs_parse_access(rfp); break; case RCS_TOK_SYMBOLS: ! rcs_parse_symbols(rfp); break; case RCS_TOK_LOCKS: ! rcs_parse_locks(rfp); break; default: cvs_log(LP_ERR, --- 1209,1224 ---- } break; case RCS_TOK_ACCESS: ! if (rcs_parse_access(rfp) < 0) ! return (-1); break; case RCS_TOK_SYMBOLS: ! if (rcs_parse_symbols(rfp) < 0) ! return (-1); break; case RCS_TOK_LOCKS: ! if (rcs_parse_locks(rfp) < 0) ! return (-1); break; default: cvs_log(LP_ERR, *************** *** 1428,1433 **** --- 1510,1518 ---- RCS_TOKSTR(rfp)); return (-1); } + + if (rcs_access_add(rfp, RCS_TOKSTR(rfp)) < 0) + return (-1); } return (0);