buffer.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Buffering to output and input.
  3. * Copyright (C) 1998 Kunihiro Ishiguro
  4. *
  5. * This file is part of GNU Zebra.
  6. *
  7. * GNU Zebra is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published
  9. * by the Free Software Foundation; either version 2, or (at your
  10. * option) any later version.
  11. *
  12. * GNU Zebra is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with GNU Zebra; see the file COPYING. If not, write to the
  19. * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  20. * Boston, MA 02111-1307, USA.
  21. */
  22. #ifndef _ZEBRA_BUFFER_H
  23. #define _ZEBRA_BUFFER_H
  24. /* Create a new buffer. Memory will be allocated in chunks of the given
  25. size. If the argument is 0, the library will supply a reasonable
  26. default size suitable for buffering socket I/O. */
  27. extern struct buffer *buffer_new (size_t);
  28. /* Free all data in the buffer. */
  29. extern void buffer_reset (struct buffer *);
  30. /* This function first calls buffer_reset to release all buffered data.
  31. Then it frees the struct buffer itself. */
  32. extern void buffer_free (struct buffer *);
  33. /* Add the given data to the end of the buffer. */
  34. extern void buffer_put (struct buffer *, const void *, size_t);
  35. /* Add a single character to the end of the buffer. */
  36. extern void buffer_putc (struct buffer *, u_char);
  37. /* Add a NUL-terminated string to the end of the buffer. */
  38. extern void buffer_putstr (struct buffer *, const char *);
  39. /* Combine all accumulated (and unflushed) data inside the buffer into a
  40. single NUL-terminated string allocated using XMALLOC(MTYPE_TMP). Note
  41. that this function does not alter the state of the buffer, so the data
  42. is still inside waiting to be flushed. */
  43. char *buffer_getstr (struct buffer *);
  44. /* Returns 1 if there is no pending data in the buffer. Otherwise returns 0. */
  45. int buffer_empty (struct buffer *);
  46. typedef enum
  47. {
  48. /* An I/O error occurred. The buffer should be destroyed and the
  49. file descriptor should be closed. */
  50. BUFFER_ERROR = -1,
  51. /* The data was written successfully, and the buffer is now empty
  52. (there is no pending data waiting to be flushed). */
  53. BUFFER_EMPTY = 0,
  54. /* There is pending data in the buffer waiting to be flushed. Please
  55. try flushing the buffer when select indicates that the file descriptor
  56. is writeable. */
  57. BUFFER_PENDING = 1
  58. } buffer_status_t;
  59. /* Try to write this data to the file descriptor. Any data that cannot
  60. be written immediately is added to the buffer queue. */
  61. extern buffer_status_t buffer_write(struct buffer *, int fd,
  62. const void *, size_t);
  63. /* This function attempts to flush some (but perhaps not all) of
  64. the queued data to the given file descriptor. */
  65. extern buffer_status_t buffer_flush_available(struct buffer *, int fd);
  66. /* The following 2 functions (buffer_flush_all and buffer_flush_window)
  67. are for use in lib/vty.c only. They should not be used elsewhere. */
  68. /* Call buffer_flush_available repeatedly until either all data has been
  69. flushed, or an I/O error has been encountered, or the operation would
  70. block. */
  71. extern buffer_status_t buffer_flush_all (struct buffer *, int fd);
  72. /* Attempt to write enough data to the given fd to fill a window of the
  73. given width and height (and remove the data written from the buffer).
  74. If !no_more, then a message saying " --More-- " is appended.
  75. If erase is true, then first overwrite the previous " --More-- " message
  76. with spaces.
  77. Any write error (including EAGAIN or EINTR) will cause this function
  78. to return -1 (because the logic for handling the erase and more features
  79. is too complicated to retry the write later).
  80. */
  81. extern buffer_status_t buffer_flush_window (struct buffer *, int fd, int width,
  82. int height, int erase, int no_more);
  83. #endif /* _ZEBRA_BUFFER_H */