subr_sbuf.c (279992) | subr_sbuf.c (280149) |
---|---|
1/*- 2 * Copyright (c) 2000-2008 Poul-Henning Kamp 3 * Copyright (c) 2000-2008 Dag-Erling Co��dan Sm��rgrav 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 13 unchanged lines hidden (view full) --- 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2000-2008 Poul-Henning Kamp 3 * Copyright (c) 2000-2008 Dag-Erling Co��dan Sm��rgrav 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 13 unchanged lines hidden (view full) --- 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> |
30__FBSDID("$FreeBSD: head/sys/kern/subr_sbuf.c 279992 2015-03-14 16:02:11Z ian $"); | 30__FBSDID("$FreeBSD: head/sys/kern/subr_sbuf.c 280149 2015-03-16 17:45:41Z ian $"); |
31 32#include <sys/param.h> 33 34#ifdef _KERNEL 35#include <sys/ctype.h> 36#include <sys/errno.h> 37#include <sys/kernel.h> 38#include <sys/malloc.h> --- 26 unchanged lines hidden (view full) --- 65 */ 66#define SBUF_ISDYNAMIC(s) ((s)->s_flags & SBUF_DYNAMIC) 67#define SBUF_ISDYNSTRUCT(s) ((s)->s_flags & SBUF_DYNSTRUCT) 68#define SBUF_ISFINISHED(s) ((s)->s_flags & SBUF_FINISHED) 69#define SBUF_HASROOM(s) ((s)->s_len < (s)->s_size - 1) 70#define SBUF_FREESPACE(s) ((s)->s_size - ((s)->s_len + 1)) 71#define SBUF_CANEXTEND(s) ((s)->s_flags & SBUF_AUTOEXTEND) 72#define SBUF_ISSECTION(s) ((s)->s_flags & SBUF_INSECTION) | 31 32#include <sys/param.h> 33 34#ifdef _KERNEL 35#include <sys/ctype.h> 36#include <sys/errno.h> 37#include <sys/kernel.h> 38#include <sys/malloc.h> --- 26 unchanged lines hidden (view full) --- 65 */ 66#define SBUF_ISDYNAMIC(s) ((s)->s_flags & SBUF_DYNAMIC) 67#define SBUF_ISDYNSTRUCT(s) ((s)->s_flags & SBUF_DYNSTRUCT) 68#define SBUF_ISFINISHED(s) ((s)->s_flags & SBUF_FINISHED) 69#define SBUF_HASROOM(s) ((s)->s_len < (s)->s_size - 1) 70#define SBUF_FREESPACE(s) ((s)->s_size - ((s)->s_len + 1)) 71#define SBUF_CANEXTEND(s) ((s)->s_flags & SBUF_AUTOEXTEND) 72#define SBUF_ISSECTION(s) ((s)->s_flags & SBUF_INSECTION) |
73#define SBUF_NULINCLUDED(s) ((s)->s_flags & SBUF_INCLUDENUL) |
|
73 74/* 75 * Set / clear flags 76 */ 77#define SBUF_SETFLAG(s, f) do { (s)->s_flags |= (f); } while (0) 78#define SBUF_CLEARFLAG(s, f) do { (s)->s_flags &= ~(f); } while (0) 79 80#define SBUF_MINEXTENDSIZE 16 /* Should be power of 2. */ --- 14 unchanged lines hidden (view full) --- 95static void 96_assert_sbuf_integrity(const char *fun, struct sbuf *s) 97{ 98 99 KASSERT(s != NULL, 100 ("%s called with a NULL sbuf pointer", fun)); 101 KASSERT(s->s_buf != NULL, 102 ("%s called with uninitialized or corrupt sbuf", fun)); | 74 75/* 76 * Set / clear flags 77 */ 78#define SBUF_SETFLAG(s, f) do { (s)->s_flags |= (f); } while (0) 79#define SBUF_CLEARFLAG(s, f) do { (s)->s_flags &= ~(f); } while (0) 80 81#define SBUF_MINEXTENDSIZE 16 /* Should be power of 2. */ --- 14 unchanged lines hidden (view full) --- 96static void 97_assert_sbuf_integrity(const char *fun, struct sbuf *s) 98{ 99 100 KASSERT(s != NULL, 101 ("%s called with a NULL sbuf pointer", fun)); 102 KASSERT(s->s_buf != NULL, 103 ("%s called with uninitialized or corrupt sbuf", fun)); |
103 KASSERT(s->s_len < s->s_size, 104 ("wrote past end of sbuf (%jd >= %jd)", 105 (intmax_t)s->s_len, (intmax_t)s->s_size)); | 104 if (SBUF_ISFINISHED(s) && SBUF_NULINCLUDED(s)) { 105 KASSERT(s->s_len <= s->s_size, 106 ("wrote past end of sbuf (%jd >= %jd)", 107 (intmax_t)s->s_len, (intmax_t)s->s_size)); 108 } else { 109 KASSERT(s->s_len < s->s_size, 110 ("wrote past end of sbuf (%jd >= %jd)", 111 (intmax_t)s->s_len, (intmax_t)s->s_size)); 112 } |
106} 107 108static void 109_assert_sbuf_state(const char *fun, struct sbuf *s, int state) 110{ 111 112 KASSERT((s->s_flags & SBUF_FINISHED) == state, 113 ("%s called with %sfinished or corrupt sbuf", fun, --- 601 unchanged lines hidden (view full) --- 715int 716sbuf_finish(struct sbuf *s) 717{ 718 719 assert_sbuf_integrity(s); 720 assert_sbuf_state(s, 0); 721 722 s->s_buf[s->s_len] = '\0'; | 113} 114 115static void 116_assert_sbuf_state(const char *fun, struct sbuf *s, int state) 117{ 118 119 KASSERT((s->s_flags & SBUF_FINISHED) == state, 120 ("%s called with %sfinished or corrupt sbuf", fun, --- 601 unchanged lines hidden (view full) --- 722int 723sbuf_finish(struct sbuf *s) 724{ 725 726 assert_sbuf_integrity(s); 727 assert_sbuf_state(s, 0); 728 729 s->s_buf[s->s_len] = '\0'; |
723 if (s->s_flags & SBUF_INCLUDENUL) | 730 if (SBUF_NULINCLUDED(s)) |
724 s->s_len++; 725 if (s->s_drain_func != NULL) { 726 while (s->s_len > 0 && s->s_error == 0) 727 s->s_error = sbuf_drain(s); 728 } 729 SBUF_SETFLAG(s, SBUF_FINISHED); 730#ifdef _KERNEL 731 return (s->s_error); --- 32 unchanged lines hidden (view full) --- 764 /* don't care if it's finished or not */ 765 KASSERT(s->s_drain_func == NULL, 766 ("%s makes no sense on sbuf %p with drain", __func__, s)); 767 768 if (s->s_error != 0) 769 return (-1); 770 771 /* If finished, nulterm is already in len, else add one. */ | 731 s->s_len++; 732 if (s->s_drain_func != NULL) { 733 while (s->s_len > 0 && s->s_error == 0) 734 s->s_error = sbuf_drain(s); 735 } 736 SBUF_SETFLAG(s, SBUF_FINISHED); 737#ifdef _KERNEL 738 return (s->s_error); --- 32 unchanged lines hidden (view full) --- 771 /* don't care if it's finished or not */ 772 KASSERT(s->s_drain_func == NULL, 773 ("%s makes no sense on sbuf %p with drain", __func__, s)); 774 775 if (s->s_error != 0) 776 return (-1); 777 778 /* If finished, nulterm is already in len, else add one. */ |
772 if ((s->s_flags & (SBUF_INCLUDENUL | SBUF_FINISHED)) == SBUF_INCLUDENUL) | 779 if (SBUF_NULINCLUDED(s) && !SBUF_ISFINISHED(s)) |
773 return (s->s_len + 1); 774 return (s->s_len); 775} 776 777/* 778 * Clear an sbuf, free its buffer if necessary. 779 */ 780void --- 79 unchanged lines hidden --- | 780 return (s->s_len + 1); 781 return (s->s_len); 782} 783 784/* 785 * Clear an sbuf, free its buffer if necessary. 786 */ 787void --- 79 unchanged lines hidden --- |