Hi folks, (please reply directly to me, since I usually do not read this list)

I run into problems when using the pserver protocol the first time.

The server runs cvs-1.10.8, the client cvs-1.10.7

I did:

> cvs -d :pserver:cvstest@einstein:/home/cvstest/CVSROOT login
> cvs -d :pserver:cvstest@einstein:/home/cvstest/CVSROOT co test
> cd test
> cvs status Kernel/Makefile
and got the result:
Keine Berechtigung (german for: permission denied)

After one day of walking through mailing lists and the sources I found two
reasons for that strange, nothing telling message:

The code producing that message is from src/server.c:

    status = create_adm_p (server_temp_dir, dir);
    if (status != 0)
    {
        pending_error = save_errno;
        if (alloc_pending (80 + strlen (dir_name)))
            sprintf (pending_error_text, "E cannot create_adm_p %s", dir_name);
        return;
    }

alloc_pending() tests pending_error and returns TRUE if (pending_error!=0).
Thus pending_error_text is never set.

I replaced that by:

    status = create_adm_p (server_temp_dir, dir);
    if (status != 0)
    {
        int save_errno = errno;
        if (alloc_pending (80 + strlen (dir_name)))
            sprintf (pending_error_text, "E cannot create_adm_p %s", dir_name);
        pending_error = save_errno;
        return;
    }

I did the same at all comparable locations in server.c . The patch is
appended.

When I now repeat the above command, I get the following message:

> cvs status Kernel/Makefile 
cannot create_adm_p /tmp/cvs-serv9476/Kernel
Keine Berechtigung (german for: permission denied)

After going into the deeps of create_adm_p() I found that cvs did not find
CVSROOT/Emptydir and was not allowed to create it.

After running `cvs -d /home/cvstest/CVSROOT init' on the server as root,
the Emptydir was created and everything was ok:
> cvs status Kernel/Makefile 
===================================================================
File: Makefile          Status: Up-to-date

   Working revision:    1.7
   Repository revision: 1.7     /home/testcvs/CVSROOT/test/Kernel/Makefile,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)


Ok: the reason for the missing Emptydir was, that I copied
/home/testcvs/CVSROOT from my normal CVSROOT, wondered about that strange
directory and removed it. I have to state, that my normal CVSROOT is not
owned by root but by me. Thus, cvs had no problems to create Emptydir when
it had to do it the other day.

Wouldn't it be a good idea to check for the existence of CVSROOT/Emptydir
and to report its nonexistence to the user and ask him to run cvs init as
root?

Regards,

        Dietmar

diff -Naur server.c server.c.new 
--- server.c    Mon Nov 22 23:17:00 1999
+++ server.c.new        Wed Jun  7 09:54:34 2000
@@ -738,7 +738,6 @@
 {
     char *env;
     char *path;
-    int save_errno;
     char *arg_dup;
     
     if (error_pending()) return;
@@ -806,7 +805,7 @@
     (void) sprintf (path, "%s/%s", CVSroot_directory, CVSROOTADM);
     if (!isaccessible (path, R_OK | X_OK))
     {
-       save_errno = errno;
+       int save_errno = errno;
        pending_error_text = malloc (80 + strlen (path));
        if (pending_error_text != NULL)
            sprintf (pending_error_text, "E Cannot access %s", path);
@@ -816,7 +815,7 @@
     (void) strcat (path, CVSROOTADM_HISTORY);
     if (isfile (path) && !isaccessible (path, R_OK | W_OK))
     {
-       save_errno = errno;
+       int save_errno = errno;
        pending_error_text = malloc (80 + strlen (path));
        if (pending_error_text != NULL)
            sprintf (pending_error_text, "E \
@@ -1036,9 +1035,10 @@
     if (status != 0
        && status != EEXIST)
     {
-       pending_error = status;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (dir_name)))
            sprintf (pending_error_text, "E cannot mkdir %s", dir_name);
+       pending_error = save_errno;
        return;
     }
 
@@ -1051,17 +1051,19 @@
     status = create_adm_p (server_temp_dir, dir);
     if (status != 0)
     {
-       pending_error = status;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (dir_name)))
            sprintf (pending_error_text, "E cannot create_adm_p %s", dir_name);
+       pending_error = save_errno;
        return;
     }
 
     if ( CVS_CHDIR (dir_name) < 0)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (dir_name)))
            sprintf (pending_error_text, "E cannot change to %s", dir_name);
+       pending_error = save_errno;
        return;
     }
     /*
@@ -1121,16 +1123,18 @@
     f = CVS_FOPEN (CVSADM_ENT, "a");
     if (f == NULL)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_ENT)))
            sprintf (pending_error_text, "E cannot open %s", CVSADM_ENT);
+       pending_error = save_errno;
        return;
     }
     if (fclose (f) == EOF)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_ENT)))
            sprintf (pending_error_text, "E cannot close %s", CVSADM_ENT);
+       pending_error = save_errno;
        return;
     }
 }
@@ -1199,16 +1203,18 @@
     f = CVS_FOPEN (CVSADM_ENTSTAT, "w+");
     if (f == NULL)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_ENTSTAT)))
            sprintf (pending_error_text, "E cannot open %s", CVSADM_ENTSTAT);
+       pending_error = save_errno;
        return;
     }
     if (fclose (f) == EOF)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_ENTSTAT)))
            sprintf (pending_error_text, "E cannot close %s", CVSADM_ENTSTAT);
+       pending_error = save_errno;
        return;
     }
 }
@@ -1224,23 +1230,26 @@
     f = CVS_FOPEN (CVSADM_TAG, "w+");
     if (f == NULL)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_TAG)))
            sprintf (pending_error_text, "E cannot open %s", CVSADM_TAG);
+       pending_error = save_errno;
        return;
     }
     if (fprintf (f, "%s\n", arg) < 0)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_TAG)))
            sprintf (pending_error_text, "E cannot write to %s", CVSADM_TAG);
+       pending_error = save_errno;
        return;
     }
     if (fclose (f) == EOF)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_TAG)))
            sprintf (pending_error_text, "E cannot close %s", CVSADM_TAG);
+       pending_error = save_errno;
        return;
     }
 }
@@ -1563,9 +1572,10 @@
        t.modtime = t.actime = checkin_time;
        if (utime (arg, &t) < 0)
        {
-           pending_error = errno;
+           int save_errno = errno;
            if (alloc_pending (80 + strlen (arg)))
                sprintf (pending_error_text, "E cannot utime %s", arg);
+           pending_error = save_errno;
            return;
        }
        checkin_time_valid = 0;
@@ -1852,9 +1862,10 @@
        f = CVS_FOPEN (CVSADM_ENT, "a");
        if (f == NULL)
        {
-           pending_error = errno;
+           int save_errno = errno;
            if (alloc_pending (80 + strlen (CVSADM_ENT)))
                sprintf (pending_error_text, "E cannot open %s", CVSADM_ENT);
+           pending_error = save_errno;
        }
     }
     for (p = entries; p != NULL;)
@@ -1863,10 +1874,11 @@
        {
            if (fprintf (f, "%s\n", p->entry) < 0)
            {
-               pending_error = errno;
+               int save_errno = errno;
                if (alloc_pending (80 + strlen(CVSADM_ENT)))
                    sprintf (pending_error_text,
                             "E cannot write to %s", CVSADM_ENT);
+               pending_error = save_errno;
            }
        }
        free (p->entry);
@@ -1877,9 +1889,10 @@
     entries = NULL;
     if (f != NULL && fclose (f) == EOF && !error_pending ())
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_ENT)))
            sprintf (pending_error_text, "E cannot close %s", CVSADM_ENT);
+       pending_error = save_errno;
     }
 }
 
@@ -4460,24 +4473,27 @@
     f = CVS_FOPEN (CVSADM_CIPROG, "w+");
     if (f == NULL)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_CIPROG)))
            sprintf (pending_error_text, "E cannot open %s", CVSADM_CIPROG);
+       pending_error = save_errno;
        return;
     }
     if (fprintf (f, "%s\n", arg) < 0)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_CIPROG)))
            sprintf (pending_error_text,
                     "E cannot write to %s", CVSADM_CIPROG);
+       pending_error = save_errno;
        return;
     }
     if (fclose (f) == EOF)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_CIPROG)))
            sprintf (pending_error_text, "E cannot close %s", CVSADM_CIPROG);
+       pending_error = save_errno;
        return;
     }
 }
@@ -4503,23 +4519,26 @@
     f = CVS_FOPEN (CVSADM_UPROG, "w+");
     if (f == NULL)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_UPROG)))
            sprintf (pending_error_text, "E cannot open %s", CVSADM_UPROG);
+       pending_error = save_errno;
        return;
     }
     if (fprintf (f, "%s\n", arg) < 0)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_UPROG)))
            sprintf (pending_error_text, "E cannot write to %s", CVSADM_UPROG);
+       pending_error = save_errno;
        return;
     }
     if (fclose (f) == EOF)
     {
-       pending_error = errno;
+       int save_errno = errno;
        if (alloc_pending (80 + strlen (CVSADM_UPROG)))
            sprintf (pending_error_text, "E cannot close %s", CVSADM_UPROG);
+       pending_error = save_errno;
        return;
     }
 }
@@ -4907,10 +4926,11 @@
            status = mkdir_p (server_temp_dir);
            if (status != 0 && status != EEXIST)
            {
+               int save_errno = errno;
                if (alloc_pending (80))
                    strcpy (pending_error_text,
                            "E can't create temporary directory");
-               pending_error = status;
+               pending_error = save_errno;
            }
 #ifndef CHMOD_BROKEN
            else


-- 
---------------------------------------------------------------------------
Dr. Dietmar Petras     Senior Expert
ELSA AG                Engineering Consumer Communications
Sonnenweg 11           Phone: +49-(0)241-606-4649
52070 Aachen           Fax:   +49-(0)241-606-4699
Germany                EMail: [EMAIL PROTECTED]
---------------------------------------------------------------------------

Reply via email to