summaryrefslogtreecommitdiff
path: root/usr.bin/cvs/file.c
diff options
context:
space:
mode:
authorJoris Vink <joris@cvs.openbsd.org>2005-06-01 15:46:33 +0000
committerJoris Vink <joris@cvs.openbsd.org>2005-06-01 15:46:33 +0000
commit6430699b834ca067c46ddf2ba902e1e57a2a87ed (patch)
treece05c5d9e168b7833c8bb788ebeaae16e61b3d00 /usr.bin/cvs/file.c
parentc34b73658c2bd833283faf268d36e9f1ef6125a8 (diff)
don't trust cvs_file_getpath() to get the correct path when creating
the Repository file for subdirs, if we are not in the root directory of the repository. instead, save the parent's Repository path and reuse it when needed, this way CVS/Repository files aren't messed up with completely wrong pathnames when running "cvs update -d" in src/sys/ for example. ok xsa@
Diffstat (limited to 'usr.bin/cvs/file.c')
-rw-r--r--usr.bin/cvs/file.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/usr.bin/cvs/file.c b/usr.bin/cvs/file.c
index 100a7f44c3a..c73c792f750 100644
--- a/usr.bin/cvs/file.c
+++ b/usr.bin/cvs/file.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: file.c,v 1.84 2005/06/01 14:03:14 joris Exp $ */
+/* $OpenBSD: file.c,v 1.85 2005/06/01 15:46:32 joris Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -248,9 +248,9 @@ cvs_file_chkign(const char *file)
CVSFILE*
cvs_file_create(CVSFILE *parent, const char *path, u_int type, mode_t mode)
{
- int fd;
+ int fd, l;
int bail;
- char fp[MAXPATHLEN];
+ char fp[MAXPATHLEN], repo[MAXPATHLEN];
CVSFILE *cfp;
CVSENTRIES *ent;
@@ -258,7 +258,7 @@ cvs_file_create(CVSFILE *parent, const char *path, u_int type, mode_t mode)
if (cfp == NULL)
return (NULL);
- bail = 0;
+ bail = l = 0;
cfp->cf_mode = mode;
cfp->cf_parent = parent;
@@ -287,7 +287,23 @@ cvs_file_create(CVSFILE *parent, const char *path, u_int type, mode_t mode)
return (NULL);
}
- cfp->cf_repo = strdup(cvs_file_getpath(cfp, fp, sizeof(fp)));
+ if (cvs_repo_base != NULL) {
+ cvs_file_getpath(cfp, fp, sizeof(fp));
+ l = snprintf(repo, sizeof(repo), "%s/%s", cvs_repo_base,
+ fp);
+ } else {
+ cvs_file_getpath(cfp, repo, sizeof(repo));
+ l = 0;
+ }
+
+ if (l == -1 || l >= (int)sizeof(repo)) {
+ errno = ENAMETOOLONG;
+ cvs_log(LP_ERRNO, "%s", repo);
+ cvs_file_free(cfp);
+ return (NULL);
+ }
+
+ cfp->cf_repo = strdup(repo);
if (cfp->cf_repo == NULL) {
cvs_file_free(cfp);
return (NULL);
@@ -404,6 +420,23 @@ cvs_file_getspec(char **fspec, int fsn, int flags, int (*cb)(CVSFILE *, void *),
if (base == NULL)
return (NULL);
+ /*
+ * fill in the repository base (needed to construct repo's in
+ * cvs_file_create).
+ */
+ if (base->cf_repo != NULL) {
+ cvs_repo_base = strdup(base->cf_repo);
+ if (cvs_repo_base == NULL) {
+ cvs_log(LP_ERR, "failed to duplicate repository base");
+ cvs_file_free(base);
+ if (entfile)
+ cvs_ent_close(entfile);
+ return (NULL);
+ }
+
+ printf("cvs_repo_base is %s\n", cvs_repo_base);
+ }
+
/* XXX - needed for some commands */
if (cb != NULL) {
if (cb(base, arg) != CVS_EX_OK) {