Re: [PATCH] move socket-related client parts into separate file

Alexey Mahotkin <[email protected]>
Newsgroups gmane.comp.version-control.cvs.bugs
Message-ID <[email protected]>
>>>>> "DRP" == Derek Robert Price <[email protected]> writes:

 DRP> I just committed your rsh-client patch as well.  Does this mean you
 DRP> want me to wait before committing your other six patches?

Go ahead with three from_/to_buffer patches.  First one will give several
rejects in start_rsh_server() in server.c.  Ignore them.

Then apply log-buffer patch:

2003-04-24  Alexey Mahotkin <[email protected]>

Move logging buffer code to separate log-buffer.[ch]


 src/Makefile.am  |    1 
 src/client.c     |  198 -------------------------------------------------
 src/log-buffer.c |  222 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/log-buffer.h |   19 ++++
 4 files changed, 244 insertions(+), 196 deletions(-)

--- ccvs/src/client.c~log-buffer	Wed May  7 21:28:08 2003
+++ ccvs-alexm/src/client.c	Wed May  7 21:28:42 2003
@@ -21,6 +21,7 @@
 #include "getline.h"
 #include "edit.h"
 #include "buffer.h"
+#include "log-buffer.h"
 
 #ifdef CLIENT_SUPPORT
 
@@ -413,161 +414,6 @@ static struct buffer *global_to_server;
 static struct buffer *global_from_server;
 
 
-/* We want to be able to log data sent between us and the server.  We
-   do it using log buffers.  Each log buffer has another buffer which
-   handles the actual I/O, and a file to log information to.
-
-   This structure is the closure field of a log buffer.  */
-
-struct log_buffer
-{
-    /* The underlying buffer.  */
-    struct buffer *buf;
-    /* The file to log information to.  */
-    FILE *log;
-};
-
-static struct buffer *log_buffer_initialize
-  PROTO((struct buffer *, FILE *, int, void (*) (struct buffer *)));
-static int log_buffer_input PROTO((void *, char *, int, int, int *));
-static int log_buffer_output PROTO((void *, const char *, int, int *));
-static int log_buffer_flush PROTO((void *));
-static int log_buffer_block PROTO((void *, int));
-static int log_buffer_shutdown PROTO((struct buffer *));
-
-/* Create a log buffer.  */
-
-static struct buffer *
-log_buffer_initialize (buf, fp, input, memory)
-     struct buffer *buf;
-     FILE *fp;
-     int input;
-     void (*memory) PROTO((struct buffer *));
-{
-    struct log_buffer *n;
-
-    n = (struct log_buffer *) xmalloc (sizeof *n);
-    n->buf = buf;
-    n->log = fp;
-    return buf_initialize (input ? log_buffer_input : NULL,
-			   input ? NULL : log_buffer_output,
-			   input ? NULL : log_buffer_flush,
-			   log_buffer_block,
-			   log_buffer_shutdown,
-			   memory,
-			   n);
-}
-
-/* The input function for a log buffer.  */
-
-static int
-log_buffer_input (closure, data, need, size, got)
-     void *closure;
-     char *data;
-     int need;
-     int size;
-     int *got;
-{
-    struct log_buffer *lb = (struct log_buffer *) closure;
-    int status;
-    size_t n_to_write;
-
-    if (lb->buf->input == NULL)
-	abort ();
-
-    status = (*lb->buf->input) (lb->buf->closure, data, need, size, got);
-    if (status != 0)
-	return status;
-
-    if (*got > 0)
-    {
-	n_to_write = *got;
-	if (fwrite (data, 1, n_to_write, lb->log) != n_to_write)
-	    error (0, errno, "writing to log file");
-    }
-
-    return 0;
-}
-
-/* The output function for a log buffer.  */
-
-static int
-log_buffer_output (closure, data, have, wrote)
-     void *closure;
-     const char *data;
-     int have;
-     int *wrote;
-{
-    struct log_buffer *lb = (struct log_buffer *) closure;
-    int status;
-    size_t n_to_write;
-
-    if (lb->buf->output == NULL)
-	abort ();
-
-    status = (*lb->buf->output) (lb->buf->closure, data, have, wrote);
-    if (status != 0)
-	return status;
-
-    if (*wrote > 0)
-    {
-	n_to_write = *wrote;
-	if (fwrite (data, 1, n_to_write, lb->log) != n_to_write)
-	    error (0, errno, "writing to log file");
-    }
-
-    return 0;
-}
-
-/* The flush function for a log buffer.  */
-
-static int
-log_buffer_flush (closure)
-     void *closure;
-{
-    struct log_buffer *lb = (struct log_buffer *) closure;
-
-    if (lb->buf->flush == NULL)
-	abort ();
-
-    /* We don't really have to flush the log file here, but doing it
-       will let tail -f on the log file show what is sent to the
-       network as it is sent.  */
-    if (fflush (lb->log) != 0)
-        error (0, errno, "flushing log file");
-
-    return (*lb->buf->flush) (lb->buf->closure);
-}
-
-/* The block function for a log buffer.  */
-
-static int
-log_buffer_block (closure, block)
-     void *closure;
-     int block;
-{
-    struct log_buffer *lb = (struct log_buffer *) closure;
-
-    if (block)
-	return set_block (lb->buf);
-    else
-	return set_nonblock (lb->buf);
-}
-
-/* The shutdown function for a log buffer.  */
-
-static int
-log_buffer_shutdown (buf)
-     struct buffer *buf;
-{
-    struct log_buffer *lb = (struct log_buffer *) buf->closure;
-    int retval;
-
-    retval = buf_shutdown (lb->buf);
-    if (fclose (lb->log) < 0)
-	error (0, errno, "closing log file");
-    return retval;
-}
 
 /*
  * Read a line from the server.  Result does not include the terminating \n.
@@ -3972,7 +3818,6 @@ void
 start_server ()
 {
     int rootless;
-    char *log = getenv ("CVS_CLIENT_LOG");
 
     /* Clear our static variables for this invocation. */
     if (toplevel_repos != NULL)
@@ -4053,46 +3898,7 @@ start_server ()
     /* "Hi, I'm Darlene and I'll be your server tonight..." */
     server_started = 1;
 
-    /* Set up logfiles, if any.
-     *
-     * We do this _after_ authentication on purpose.  Wouldn't really like to
-     * worry about logging passwords...
-     */
-    if (log)
-    {
-	int len = strlen (log);
-	char *buf = xmalloc (len + 5);
-	char *p;
-	FILE *fp;
-
-	strcpy (buf, log);
-	p = buf + len;
-
-	/* Open logfiles in binary mode so that they reflect
-	   exactly what was transmitted and received (that is
-	   more important than that they be maximally
-	   convenient to view).  */
-	/* Note that if we create several connections in a single CVS client
-	   (currently used by update.c), then the last set of logfiles will
-	   overwrite the others.  There is currently no way around this.  */
-	strcpy (p, ".in");
-	fp = open_file (buf, "wb");
-        if (fp == NULL)
-	    error (0, errno, "opening to-server logfile %s", buf);
-	else
-	    global_to_server = log_buffer_initialize (global_to_server, fp, 0,
-						      (BUFMEMERRPROC) NULL);
-
-	strcpy (p, ".out");
-	fp = open_file (buf, "wb");
-        if (fp == NULL)
-	    error (0, errno, "opening from-server logfile %s", buf);
-	else
-	    global_from_server = log_buffer_initialize (global_from_server, fp, 1,
-							(BUFMEMERRPROC) NULL);
-
-	free (buf);
-    }
+    setup_logfiles(&global_to_server, &global_from_server);
 
     /* Clear static variables.  */
     if (toplevel_repos != NULL)
--- /dev/null	Wed Jan  1 02:48:46 2003
+++ ccvs-alexm/src/log-buffer.c	Wed May  7 21:28:08 2003
@@ -0,0 +1,222 @@
+/* CVS client logging buffer.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.  */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include "cvs.h"
+#include "buffer.h"
+
+/* We want to be able to log data sent between us and the server.  We
+   do it using log buffers.  Each log buffer has another buffer which
+   handles the actual I/O, and a file to log information to.
+
+   This structure is the closure field of a log buffer.  */
+
+struct log_buffer
+{
+    /* The underlying buffer.  */
+    struct buffer *buf;
+    /* The file to log information to.  */
+    FILE *log;
+};
+
+static int log_buffer_input PROTO((void *, char *, int, int, int *));
+static int log_buffer_output PROTO((void *, const char *, int, int *));
+static int log_buffer_flush PROTO((void *));
+static int log_buffer_block PROTO((void *, int));
+static int log_buffer_shutdown PROTO((struct buffer *));
+
+/* Create a log buffer.  */
+
+static struct buffer *
+log_buffer_initialize (buf, fp, input, memory)
+     struct buffer *buf;
+     FILE *fp;
+     int input;
+     void (*memory) PROTO((struct buffer *));
+{
+    struct log_buffer *n;
+
+    n = (struct log_buffer *) xmalloc (sizeof *n);
+    n->buf = buf;
+    n->log = fp;
+    return buf_initialize (input ? log_buffer_input : NULL,
+			   input ? NULL : log_buffer_output,
+			   input ? NULL : log_buffer_flush,
+			   log_buffer_block,
+			   log_buffer_shutdown,
+			   memory,
+			   n);
+}
+
+/* The input function for a log buffer.  */
+
+static int
+log_buffer_input (closure, data, need, size, got)
+     void *closure;
+     char *data;
+     int need;
+     int size;
+     int *got;
+{
+    struct log_buffer *lb = (struct log_buffer *) closure;
+    int status;
+    size_t n_to_write;
+
+    if (lb->buf->input == NULL)
+	abort ();
+
+    status = (*lb->buf->input) (lb->buf->closure, data, need, size, got);
+    if (status != 0)
+	return status;
+
+    if (*got > 0)
+    {
+	n_to_write = *got;
+	if (fwrite (data, 1, n_to_write, lb->log) != n_to_write)
+	    error (0, errno, "writing to log file");
+    }
+
+    return 0;
+}
+
+/* The output function for a log buffer.  */
+
+static int
+log_buffer_output (closure, data, have, wrote)
+     void *closure;
+     const char *data;
+     int have;
+     int *wrote;
+{
+    struct log_buffer *lb = (struct log_buffer *) closure;
+    int status;
+    size_t n_to_write;
+
+    if (lb->buf->output == NULL)
+	abort ();
+
+    status = (*lb->buf->output) (lb->buf->closure, data, have, wrote);
+    if (status != 0)
+	return status;
+
+    if (*wrote > 0)
+    {
+	n_to_write = *wrote;
+	if (fwrite (data, 1, n_to_write, lb->log) != n_to_write)
+	    error (0, errno, "writing to log file");
+    }
+
+    return 0;
+}
+
+/* The flush function for a log buffer.  */
+
+static int
+log_buffer_flush (closure)
+     void *closure;
+{
+    struct log_buffer *lb = (struct log_buffer *) closure;
+
+    if (lb->buf->flush == NULL)
+	abort ();
+
+    /* We don't really have to flush the log file here, but doing it
+       will let tail -f on the log file show what is sent to the
+       network as it is sent.  */
+    if (fflush (lb->log) != 0)
+        error (0, errno, "flushing log file");
+
+    return (*lb->buf->flush) (lb->buf->closure);
+}
+
+/* The block function for a log buffer.  */
+
+static int
+log_buffer_block (closure, block)
+     void *closure;
+     int block;
+{
+    struct log_buffer *lb = (struct log_buffer *) closure;
+
+    if (block)
+	return set_block (lb->buf);
+    else
+	return set_nonblock (lb->buf);
+}
+
+/* The shutdown function for a log buffer.  */
+
+static int
+log_buffer_shutdown (buf)
+     struct buffer *buf;
+{
+    struct log_buffer *lb = (struct log_buffer *) buf->closure;
+    int retval;
+
+    retval = buf_shutdown (lb->buf);
+    if (fclose (lb->log) < 0)
+	error (0, errno, "closing log file");
+    return retval;
+}
+
+
+void
+setup_logfiles (to_server_p, from_server_p)
+     struct buffer** to_server_p;
+     struct buffer** from_server_p;
+{
+  char *log = getenv ("CVS_CLIENT_LOG");
+
+  /* Set up logfiles, if any.
+   *
+   * We do this _after_ authentication on purpose.  Wouldn't really like to
+   * worry about logging passwords...
+   */
+  if (log)
+    {
+      int len = strlen (log);
+      char *buf = xmalloc (len + 5);
+      char *p;
+      FILE *fp;
+
+      strcpy (buf, log);
+      p = buf + len;
+
+      /* Open logfiles in binary mode so that they reflect
+	 exactly what was transmitted and received (that is
+	 more important than that they be maximally
+	 convenient to view).  */
+      /* Note that if we create several connections in a single CVS client
+	 (currently used by update.c), then the last set of logfiles will
+	 overwrite the others.  There is currently no way around this.  */
+      strcpy (p, ".in");
+      fp = open_file (buf, "wb");
+      if (fp == NULL)
+	error (0, errno, "opening to-server logfile %s", buf);
+      else
+	*to_server_p = log_buffer_initialize (*to_server_p, fp, 0,
+					      (BUFMEMERRPROC) NULL);
+
+      strcpy (p, ".out");
+      fp = open_file (buf, "wb");
+      if (fp == NULL)
+	error (0, errno, "opening from-server logfile %s", buf);
+      else
+	*from_server_p = log_buffer_initialize (*from_server_p, fp, 1,
+						(BUFMEMERRPROC) NULL);
+
+      free (buf);
+    }
+}
--- /dev/null	Wed Jan  1 02:48:46 2003
+++ ccvs-alexm/src/log-buffer.h	Wed May  7 21:28:08 2003
@@ -0,0 +1,19 @@
+/* CVS client logging buffer.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.  */
+
+
+#ifndef LOG_BUFFER_H__
+#define LOG_BUFFER_H__
+
+void setup_logfiles PROTO ((struct buffer** to_server_p, struct buffer** from_server_p));
+
+#endif LOG_BUFFER_H__
--- ccvs/src/Makefile.am~log-buffer	Wed May  7 21:28:08 2003
+++ ccvs-alexm/src/Makefile.am	Wed May  7 21:28:08 2003
@@ -48,6 +48,7 @@ cvs_SOURCES = \
 	import.c \
 	lock.c \
 	log.c \
+	log-buffer.c log-buffer.h \
 	login.c \
 	logmsg.c \
 	main.c \

_

--alexm
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.