]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* Removed userspace buffering. Everyone has TCP_CORK or TCP_NOPUSH nowadays.
[citadel.git] / citadel / sysdep.c
index 975585c0fe1a897edfa8c4e4a7f5e4f72df1094a..995742b40d834cb379c886740128f965579126cb 100644 (file)
@@ -2,7 +2,7 @@
  * $Id$
  *
  * Citadel "system dependent" stuff.
- * See copyright.txt for copyright information.
+ * See COPYING for copyright information.
  *
  * Here's where we (hopefully) have most parts of the Citadel server that
  * would need to be altered to run the server in a non-POSIX environment.
@@ -548,9 +548,8 @@ void CtdlFillSystemContext(struct CitContext *context, char *name)
 }
 
 /*
- * The following functions implement output buffering. If the kernel supplies
- * native TCP buffering (Linux & *BSD), use that; otherwise, emulate it with
- * user-space buffering.
+ * The following functions implement output buffering on operating systems which
+ * support it (such as Linux and various BSD flavors).
  */
 #ifndef HAVE_DARWIN
 #ifdef TCP_CORK
@@ -563,65 +562,28 @@ void CtdlFillSystemContext(struct CitContext *context, char *name)
 #endif /* TCP_CORK */
 #endif /* HAVE_DARWIN */
 
-#ifdef HAVE_TCP_BUFFERING
 static unsigned on = 1, off = 0;
-void buffer_output(void) {
-       struct CitContext *ctx = MyContext();
-       setsockopt(ctx->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4);
-       ctx->buffering = 1;
-}
 
-void unbuffer_output(void) {
-       struct CitContext *ctx = MyContext();
-       setsockopt(ctx->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4);
-       ctx->buffering = 0;
-}
-
-void flush_output(void) {
-       struct CitContext *ctx = MyContext();
-       setsockopt(ctx->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4);
-       setsockopt(ctx->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4);
-}
-#else 
-#ifdef HAVE_DARWIN
-/* Stub functions for Darwin/OS X where TCP buffering isn't liked at all */
 void buffer_output(void) {
-       CC->buffering = 0;
+#ifdef HAVE_TCP_BUFFERING
+       setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4);
+#endif
 }
+
 void unbuffer_output(void) {
-       CC->buffering = 0;
-}
-void flush_output(void) {
-}
-#else
-void buffer_output(void) {
-       if (CC->buffering == 0) {
-               CC->buffering = 1;
-               CC->buffer_len = 0;
-               CC->output_buffer = malloc(SIZ);
-       }
+#ifdef HAVE_TCP_BUFFERING
+       setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4);
+#endif
 }
 
 void flush_output(void) {
-       if (CC->buffering == 1) {
-               client_write(CC->output_buffer, CC->buffer_len);
-               CC->buffer_len = 0;
-       }
+#ifdef HAVE_TCP_BUFFERING
+       struct CitContext *CCC = CC;
+       setsockopt(CCC->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4);
+       setsockopt(CCC->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4);
+#endif
 }
 
-void unbuffer_output(void) {
-       if (CC->buffering == 1) {
-               CC->buffering = 0;
-               /* We don't call flush_output because we can't. */
-               client_write(CC->output_buffer, CC->buffer_len);
-               CC->buffer_len = 0;
-               free(CC->output_buffer);
-               CC->output_buffer = NULL;
-       }
-}
-#endif /* HAVE_DARWIN */
-#endif /* HAVE_TCP_BUFFERING */
-
 
 
 /*
@@ -651,19 +613,6 @@ int client_write(char *buf, int nbytes)
                return 0;
        }
 
-#ifndef HAVE_TCP_BUFFERING
-       /* If we're buffering for later, do that now. */
-       if (Ctx->buffering) {
-               old_buffer_len = Ctx->buffer_len;
-               Ctx->buffer_len += nbytes;
-               Ctx->output_buffer = realloc(Ctx->output_buffer, Ctx->buffer_len);
-               memcpy(&Ctx->output_buffer[old_buffer_len], buf, nbytes);
-               return 0;
-       }
-#endif
-
-       /* Ok, at this point we're not buffering.  Go ahead and write. */
-
 #ifdef HAVE_OPENSSL
        if (Ctx->redirect_ssl) {
                client_write_ssl(buf, nbytes);
@@ -722,43 +671,6 @@ void cprintf(const char *format, ...) {
 }   
 
 
-/*
- * fold_cprintf()      Like cprintf() except it can do RFC2822-style header folding.
- */
-void fold_cprintf(const char *format, ...) {   
-       va_list arg_ptr;   
-       char buf[4096];
-       int len;
-       char *bbuf;
-       char *ptr;
-   
-       va_start(arg_ptr, format);   
-       if (vsnprintf(buf, sizeof buf, format, arg_ptr) == -1)
-               buf[sizeof buf - 2] = '\n';
-       va_end(arg_ptr);
-
-       len = strlen(buf);
-       bbuf = buf;
-
-       while (len > 998) {
-               ptr = strchr(&bbuf[900], ',');
-               if (ptr == NULL) {
-                       ptr = bbuf+990;
-               }
-               if ((ptr - bbuf) > 990) {
-                       ptr = bbuf+990;
-               }
-               ++ptr;
-               client_write(bbuf, ptr-bbuf);
-               client_write("\r\n\t", 3);
-               len -= (ptr-bbuf);
-               bbuf = ptr++;
-       }
-
-       client_write(bbuf, len);
-}   
-
-
 /*
  * Read data from the client socket.
  * Return values are: