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