Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 1990, 2007 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Berkeley.  The name of the
  11.  * University may not be used to endorse or promote products derived
  12.  * from this software without specific prior written permission.
  13.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  */
  17. /* No user fns here.  Pesch 15apr92. */
  18.  
  19. #include <_ansi.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <sys/stat.h>
  23. #include <sys/types.h>
  24. #include <sys/unistd.h>
  25. #include "local.h"
  26.  
  27. #define _DEFAULT_ASPRINTF_BUFSIZE 64
  28.  
  29. /*
  30.  * Allocate a file buffer, or switch to unbuffered I/O.
  31.  * Per the ANSI C standard, ALL tty devices default to line buffered.
  32.  *
  33.  * As a side effect, we set __SOPT or __SNPT (en/dis-able fseek
  34.  * optimization) right after the _fstat() that finds the buffer size.
  35.  */
  36.  
  37. _VOID
  38. _DEFUN(__smakebuf_r, (ptr, fp),
  39.        struct _reent *ptr _AND
  40.        register FILE *fp)
  41. {
  42.   register size_t size, couldbetty;
  43.   register _PTR p;
  44. #ifdef __USE_INTERNAL_STAT64
  45.   struct stat64 st;
  46. #else
  47.   struct stat st;
  48. #endif
  49.  
  50.   if (fp->_flags & __SNBF)
  51.     {
  52.       fp->_bf._base = fp->_p = fp->_nbuf;
  53.       fp->_bf._size = 1;
  54.       return;
  55.     }
  56. #ifdef __USE_INTERNAL_STAT64
  57.   if (fp->_file < 0 || _fstat64_r (ptr, fp->_file, &st) < 0)
  58. #else
  59.   if (fp->_file < 0 || _fstat_r (ptr, fp->_file, &st) < 0)
  60. #endif
  61.     {
  62.       couldbetty = 0;
  63.       /* Check if we are be called by asprintf family for initial buffer.  */
  64.       if (fp->_flags & __SMBF)
  65.         size = _DEFAULT_ASPRINTF_BUFSIZE;
  66.       else
  67.         size = BUFSIZ;
  68.       /* do not try to optimise fseek() */
  69.       fp->_flags |= __SNPT;
  70.     }
  71.   else
  72.     {
  73.       couldbetty = (st.st_mode & S_IFMT) == S_IFCHR;
  74. #ifdef HAVE_BLKSIZE
  75.       size = st.st_blksize <= 0 ? BUFSIZ : st.st_blksize;
  76. #else
  77.       size = BUFSIZ;
  78. #endif
  79.       /*
  80.        * Optimize fseek() only if it is a regular file.
  81.        * (The test for __sseek is mainly paranoia.)
  82.        */
  83.       if ((st.st_mode & S_IFMT) == S_IFREG && fp->_seek == __sseek)
  84.         {
  85.           fp->_flags |= __SOPT;
  86. #ifdef HAVE_BLKSIZE
  87.           fp->_blksize = st.st_blksize;
  88. #else
  89.           fp->_blksize = 1024;
  90. #endif
  91.         }
  92.       else
  93.         fp->_flags |= __SNPT;
  94.     }
  95.   if ((p = _malloc_r (ptr, size)) == NULL)
  96.     {
  97.       if (!(fp->_flags & __SSTR))
  98.         {
  99.           fp->_flags |= __SNBF;
  100.           fp->_bf._base = fp->_p = fp->_nbuf;
  101.           fp->_bf._size = 1;
  102.         }
  103.     }
  104.   else
  105.     {
  106.       ptr->__cleanup = _cleanup_r;
  107.       fp->_flags |= __SMBF;
  108.       fp->_bf._base = fp->_p = (unsigned char *) p;
  109.       fp->_bf._size = size;
  110.       if (couldbetty && _isatty_r (ptr, fp->_file))
  111.         fp->_flags |= __SLBF;
  112.     }
  113. }
  114.