Sure, I know there are apparently a few binaries of cvs floating around that should work with BeOS, but I would rather build from source. Basically everything is ok, once NO_SOCKET_TO_FD is defined. However Be hasn't implemented getpass or shutdown (properly) yet. The attached diff (I hope it's not actually encoded, I'm still playing around with Mail-It, and am very used to pine) merely facilitates the building of cvs on BeOS by including a getpass function (nearly verbatim from FreeBSD's libc), and "appropiate" preprocessor directives around the error checking after a call to shutdown. - alex
cvs server: Diffing .
Index: client.c
===================================================================
RCS file: /home2/cvsroot/ccvs/src/client.c,v
retrieving revision 1.276
diff -u -r1.276 client.c
--- client.c    2000/01/05 16:35:45     1.276
+++ client.c    2000/04/20 09:45:58
@@ -3536,7 +3536,11 @@
     if (use_socket_style)
     {
        if (shutdown (server_sock, 2) < 0)
+#ifdef __BEOS__
+        ; /* Be hasn't yet implemented the shutdown syscall */
+#else
            error (1, 0, "shutting down server socket: %s", SOCK_STRERROR 
(SOCK_ERRNO));
+#endif
     }
     else
 #endif /* NO_SOCKET_TO_FD */
@@ -3545,8 +3549,12 @@
        if (server_fd != -1)
        {
            if (shutdown (server_fd, 1) < 0)
+#ifdef __BEOS__
+;
+#else
                error (1, 0, "shutting down connection to %s: %s",
                       CVSroot_hostname, SOCK_STRERROR (SOCK_ERRNO));
+#endif
             /*
              * This test will always be true because we dup the descriptor
              */
@@ -3891,6 +3899,7 @@
                /* Unrecognized response from server. */
                if (shutdown (sock, 2) < 0)
                {
+#ifndef __BEOS__
                    error (0, 0,
                           "unrecognized auth response from %s: %s", 
                           CVSroot_hostname, read_buf);
@@ -3898,6 +3907,7 @@
                           "shutdown() failed, server %s: %s",
                           CVSroot_hostname,
                           SOCK_STRERROR (SOCK_ERRNO));
+#endif
                }
                error (1, 0, 
                       "unrecognized auth response from %s: %s", 
@@ -3910,8 +3920,12 @@
     if (verify_only)
     {
        if (shutdown (sock, 2) < 0)
+#ifdef __BEOS__
+;
+#else
            error (0, 0, "shutdown() failed, server %s: %s", CVSroot_hostname,
                   SOCK_STRERROR (SOCK_ERRNO));
+#endif
        return;
     }
     else
@@ -3937,6 +3951,7 @@
   rejected:
     if (shutdown (sock, 2) < 0)
     {
+#ifndef __BEOS__
        error (0, 0, 
               "authorization failed: server %s rejected access", 
               CVSroot_hostname);
@@ -3944,6 +3959,7 @@
               "shutdown() failed (server %s): %s",
               CVSroot_hostname,
               SOCK_STRERROR (SOCK_ERRNO));
+#endif
     }
 
     error (0, 0, 
Index: login.c
===================================================================
RCS file: /home2/cvsroot/ccvs/src/login.c,v
retrieving revision 1.56
diff -u -r1.56 login.c
--- login.c     1999/11/30 05:11:12     1.56
+++ login.c     2000/04/20 09:46:00
@@ -19,10 +19,14 @@
    declaration won't work (some Crays declare the 2#$@% thing as
    varadic, believe it or not).  On Cray, getpass will be declared
    in either stdlib.h or unistd.h.  */
-#ifndef _CRAY
+#if !defined(_CRAY) && !defined(__BEOS__)
 extern char *getpass ();
 #endif
 
+#ifdef __BEOS__
+#include <termios.h>
+#endif
+
 #ifndef CVS_PASSWORD_FILE 
 #define CVS_PASSWORD_FILE ".cvspass"
 #endif
@@ -31,6 +35,45 @@
 static char *cvs_password = NULL;
 
 static char *construct_cvspass_filename PROTO ((void));
+
+#ifdef __BEOS__
+char *getpass(const char *prompt) {
+#define _PASSWORD_LEN 256
+#define TCSASOFT 0
+       struct termios oterm, term; 
+        register int ch; 
+        register char *p; 
+        static char buf[_PASSWORD_LEN + 1]; 
+        sigset_t oset, nset; 
+
+        /* 
+         * note - blocking signals isn't necessarily the 
+         * right thing, but we leave it for now. 
+         */ 
+        sigemptyset(&nset); 
+        sigaddset(&nset, SIGINT); 
+        sigaddset(&nset, SIGTSTP); 
+        (void)sigprocmask(SIG_BLOCK, &nset, &oset); 
+        
+        (void)tcgetattr(fileno(stdin), &oterm); 
+        term = oterm; 
+        term.c_lflag &= ~ECHO; 
+        (void)tcsetattr(fileno(stdin), TCSAFLUSH|TCSASOFT, &term); 
+        (void)fputs(prompt, stderr); 
+        rewind(stderr);                  /* implied flush */ 
+        for (p = buf; (ch = getc(stdin)) != EOF && ch != '\n';) 
+                if (p < buf + _PASSWORD_LEN) 
+                        *p++ = ch; 
+        *p = '\0'; 
+
+        (void)write(fileno(stderr), "\n", 1); 
+        (void)tcsetattr(fileno(stdin), TCSAFLUSH|TCSASOFT, &oterm); 
+        (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+
+        return(buf);
+}
+
+#endif
 
 /* The return value will need to be freed. */
 static char *

Reply via email to