[BACK]Return to buffer.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/Attic/buffer.c between version 1.23.6.1 and 1.24

version 1.23.6.1, 2006/09/30 04:06:50 version 1.24, 2006/03/19 18:51:18
Line 1 
Line 1 
 /* $OpenBSD$ */  
 /*  /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>   * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland   * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
Line 12 
Line 11 
  * called by a name other than "ssh" or "Secure Shell".   * called by a name other than "ssh" or "Secure Shell".
  */   */
   
 #include <sys/param.h>  #include "includes.h"
   
 #include <stdio.h>  
 #include <string.h>  
 #include <stdarg.h>  
   
 #include "xmalloc.h"  #include "xmalloc.h"
 #include "buffer.h"  #include "buffer.h"
 #include "log.h"  #include "log.h"
   
 #define BUFFER_MAX_CHUNK        0x100000  
 #define BUFFER_MAX_LEN          0xa00000  
 #define BUFFER_ALLOCSZ          0x008000  
   
 /* Initializes the buffer structure. */  /* Initializes the buffer structure. */
   
 void  void
Line 74 
Line 65 
         memcpy(p, data, len);          memcpy(p, data, len);
 }  }
   
 static int  
 buffer_compact(Buffer *buffer)  
 {  
         /*  
          * If the buffer is quite empty, but all data is at the end, move the  
          * data to the beginning.  
          */  
         if (buffer->offset > MIN(buffer->alloc, BUFFER_MAX_CHUNK)) {  
                 memmove(buffer->buf, buffer->buf + buffer->offset,  
                         buffer->end - buffer->offset);  
                 buffer->end -= buffer->offset;  
                 buffer->offset = 0;  
                 return (1);  
         }  
         return (0);  
 }  
   
 /*  /*
  * Appends space to the buffer, expanding the buffer if necessary. This does   * Appends space to the buffer, expanding the buffer if necessary. This does
  * not actually copy the data into the buffer, but instead returns a pointer   * not actually copy the data into the buffer, but instead returns a pointer
Line 118 
Line 92 
                 buffer->end += len;                  buffer->end += len;
                 return p;                  return p;
         }          }
           /*
         /* Compact data back to the start of the buffer if necessary */           * If the buffer is quite empty, but all data is at the end, move the
         if (buffer_compact(buffer))           * data to the beginning and retry.
            */
           if (buffer->offset > MIN(buffer->alloc, BUFFER_MAX_CHUNK)) {
                   memmove(buffer->buf, buffer->buf + buffer->offset,
                           buffer->end - buffer->offset);
                   buffer->end -= buffer->offset;
                   buffer->offset = 0;
                 goto restart;                  goto restart;
           }
         /* Increase the size of the buffer and retry. */          /* Increase the size of the buffer and retry. */
         newlen = roundup(buffer->alloc + len, BUFFER_ALLOCSZ);  
           newlen = buffer->alloc + len + 32768;
         if (newlen > BUFFER_MAX_LEN)          if (newlen > BUFFER_MAX_LEN)
                 fatal("buffer_append_space: alloc %u not supported",                  fatal("buffer_append_space: alloc %u not supported",
                     newlen);                      newlen);
         buffer->buf = xrealloc(buffer->buf, 1, newlen);          buffer->buf = xrealloc(buffer->buf, newlen);
         buffer->alloc = newlen;          buffer->alloc = newlen;
         goto restart;          goto restart;
         /* NOTREACHED */          /* NOTREACHED */
 }  
   
 /*  
  * Check whether an allocation of 'len' will fit in the buffer  
  * This must follow the same math as buffer_append_space  
  */  
 int  
 buffer_check_alloc(Buffer *buffer, u_int len)  
 {  
         if (buffer->offset == buffer->end) {  
                 buffer->offset = 0;  
                 buffer->end = 0;  
         }  
  restart:  
         if (buffer->end + len < buffer->alloc)  
                 return (1);  
         if (buffer_compact(buffer))  
                 goto restart;  
         if (roundup(buffer->alloc + len, BUFFER_ALLOCSZ) <= BUFFER_MAX_LEN)  
                 return (1);  
         return (0);  
 }  }
   
 /* Returns the number of bytes of data in the buffer. */  /* Returns the number of bytes of data in the buffer. */

Legend:
Removed from v.1.23.6.1  
changed lines
  Added in v.1.24