Annotation of embedaddon/mpd/src/mbuf.c, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * mbuf.c
! 4: *
! 5: * Written by Toshiharu OHNO <tony-o@iij.ad.jp>
! 6: * Copyright (c) 1993, Internet Initiative Japan, Inc. All rights reserved.
! 7: * See ``COPYRIGHT.iij''
! 8: *
! 9: * Rewritten by Archie Cobbs <archie@freebsd.org>
! 10: * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
! 11: * See ``COPYRIGHT.whistle''
! 12: */
! 13:
! 14: #include "ppp.h"
! 15:
! 16: /*
! 17: * Malloc()
! 18: *
! 19: * Replacement for the usual malloc()
! 20: */
! 21:
! 22: void *
! 23: Malloc(const char *type, size_t size)
! 24: {
! 25: const char **memory;
! 26:
! 27: if ((memory = MALLOC(type, sizeof(char *) + size)) == NULL) {
! 28: Perror("Malloc: malloc");
! 29: DoExit(EX_ERRDEAD);
! 30: }
! 31:
! 32: memory[0] = type;
! 33: bzero(memory + 1, size);
! 34: return (memory + 1);
! 35: }
! 36:
! 37: /*
! 38: * Mdup()
! 39: *
! 40: * Malloc() + memcpy()
! 41: */
! 42:
! 43: void *
! 44: Mdup(const char *type, const void *src, size_t size)
! 45: {
! 46: const char **memory;
! 47: if ((memory = MALLOC(type, sizeof(char *) + size)) == NULL) {
! 48: Perror("Mdup: malloc");
! 49: DoExit(EX_ERRDEAD);
! 50: }
! 51:
! 52: memory[0] = type;
! 53: memcpy(memory + 1, src, size);
! 54: return(memory + 1);
! 55: }
! 56:
! 57: void *
! 58: Mstrdup(const char *type, const void *src)
! 59: {
! 60: return (Mdup(type, src, strlen(src) + 1));
! 61: }
! 62:
! 63: /*
! 64: * Freee()
! 65: *
! 66: * Replacement for the ususal free()
! 67: */
! 68:
! 69: void
! 70: Freee(void *ptr)
! 71: {
! 72: if (ptr) {
! 73: char **memory = ptr;
! 74: memory--;
! 75: FREE(memory[0], memory);
! 76: }
! 77: }
! 78:
! 79: /*
! 80: * mballoc()
! 81: *
! 82: * Allocate an mbuf with memory
! 83: */
! 84:
! 85: Mbuf
! 86: mballoc(int size)
! 87: {
! 88: u_char *memory;
! 89: int amount, osize;
! 90: Mbuf bp;
! 91:
! 92: assert(size >= 0);
! 93:
! 94: if (size == 0) {
! 95: osize = 64 - sizeof(*bp);
! 96: } else if (size < 512)
! 97: osize = ((size - 1) / 32 + 1) * 64 - sizeof(*bp);
! 98: else
! 99: osize = ((size - 1) / 64 + 1) * 64 + 512 - sizeof(*bp);
! 100: amount = sizeof(*bp) + osize;
! 101:
! 102: if ((memory = MALLOC(MB_MBUF, amount)) == NULL) {
! 103: Perror("mballoc: malloc");
! 104: DoExit(EX_ERRDEAD);
! 105: }
! 106:
! 107: /* Put mbuf at front of memory region */
! 108: bp = (Mbuf)(void *)memory;
! 109: bp->size = osize;
! 110: bp->offset = (osize - size) / 2;
! 111: bp->cnt = 0;
! 112:
! 113: return (bp);
! 114: }
! 115:
! 116: /*
! 117: * mbfree()
! 118: *
! 119: * Free head of chain, return next
! 120: */
! 121:
! 122: void
! 123: mbfree(Mbuf bp)
! 124: {
! 125: if (bp)
! 126: FREE(MB_MBUF, bp);
! 127: }
! 128:
! 129: /*
! 130: * mbread()
! 131: *
! 132: * Read contents of an mbuf chain into buffer, consuming len bytes.
! 133: * If all of the chain is consumed, return NULL.
! 134: *
! 135: * This should ALWAYS be called like this:
! 136: * bp = mbread(bp, ... );
! 137: */
! 138:
! 139: Mbuf
! 140: mbread(Mbuf bp, void *buf, int cnt)
! 141: {
! 142: int nread;
! 143:
! 144: assert(cnt >= 0);
! 145:
! 146: if (!bp)
! 147: return (NULL);
! 148: if (cnt > bp->cnt)
! 149: nread = bp->cnt;
! 150: else
! 151: nread = cnt;
! 152: memcpy(buf, MBDATAU(bp), nread);
! 153: bp->offset += nread;
! 154: bp->cnt -= nread;
! 155: if (bp->cnt == 0) {
! 156: mbfree(bp);
! 157: return (NULL);
! 158: }
! 159: return(bp);
! 160: }
! 161:
! 162: /*
! 163: * mbcopy()
! 164: *
! 165: * Copy contents of an mbuf chain into buffer, up to "cnt" bytes.
! 166: * This does not consume any of the mbuf chain. Returns number copied.
! 167: */
! 168:
! 169: int
! 170: mbcopy(Mbuf bp, int offset, void *buf, int cnt)
! 171: {
! 172: int nread;
! 173:
! 174: assert(offset >= 0);
! 175: assert(cnt >= 0);
! 176:
! 177: if (!bp)
! 178: return (0);
! 179: if (offset >= bp->cnt)
! 180: return (0);
! 181:
! 182: if (cnt > bp->cnt - offset)
! 183: nread = bp->cnt - offset;
! 184: else
! 185: nread = cnt;
! 186: memcpy(buf, MBDATAU(bp) + offset, nread);
! 187: return (nread);
! 188: }
! 189:
! 190: /*
! 191: * mbcopyback()
! 192: *
! 193: * Write bytes from buffer into an mbuf chain. Returns first argument.
! 194: */
! 195:
! 196: Mbuf
! 197: mbcopyback(Mbuf bp, int offset, const void *buf, int cnt)
! 198: {
! 199: int b, e;
! 200:
! 201: if (!bp) {
! 202: if (offset < 0)
! 203: offset = 0;
! 204: bp = mballoc(offset + cnt);
! 205: memcpy(MBDATAU(bp) + offset, buf, cnt);
! 206: bp->cnt = offset + cnt;
! 207: return (bp);
! 208: }
! 209:
! 210: b = (offset > 0) ? 0 : -offset;
! 211: e = (offset + cnt > bp->cnt) ? offset + cnt - bp->cnt : 0;
! 212:
! 213: if (b + bp->cnt + e > bp->size) {
! 214: Mbuf nbp = mballoc(b + bp->cnt + e);
! 215: memcpy(MBDATAU(nbp) + b, MBDATAU(bp), bp->cnt);
! 216: nbp->cnt = bp->cnt;
! 217: mbfree(bp);
! 218: bp = nbp;
! 219: } else if ((b > bp->offset) || (bp->offset + bp->cnt + e > bp->size)) {
! 220: int noff = (bp->size - (b + bp->cnt + e)) / 2;
! 221: memmove(MBDATAU(bp) - bp->offset + noff + b, MBDATAU(bp), bp->cnt);
! 222: bp->offset = noff;
! 223: } else {
! 224: bp->offset -= b;
! 225: }
! 226: bp->cnt = b + bp->cnt + e;
! 227: memcpy(MBDATAU(bp) + offset + b, buf, cnt);
! 228: return(bp);
! 229: }
! 230:
! 231: /*
! 232: * mbtrunc()
! 233: *
! 234: * Truncate mbuf to total of "max" bytes. If max is zero
! 235: * then a zero length mbuf is returned (rather than a NULL mbuf).
! 236: */
! 237:
! 238: Mbuf
! 239: mbtrunc(Mbuf bp, int max)
! 240: {
! 241: assert(max >= 0);
! 242:
! 243: if (!bp)
! 244: return (NULL);
! 245:
! 246: if (bp->cnt > max)
! 247: bp->cnt = max;
! 248:
! 249: return (bp);
! 250: }
! 251:
! 252: /*
! 253: * mbadj()
! 254: *
! 255: * Truncate mbuf cutting "cnt" bytes from begin or end.
! 256: */
! 257:
! 258: Mbuf
! 259: mbadj(Mbuf bp, int cnt)
! 260: {
! 261: if (!bp)
! 262: return (NULL);
! 263:
! 264: if (cnt >= 0) {
! 265: if (bp->cnt > cnt) {
! 266: bp->cnt -= cnt;
! 267: bp->offset += cnt;
! 268: } else {
! 269: bp->cnt = 0;
! 270: }
! 271: } else {
! 272: if (bp->cnt > -cnt) {
! 273: bp->cnt -= -cnt;
! 274: } else {
! 275: bp->cnt = 0;
! 276: }
! 277: }
! 278:
! 279: return (bp);
! 280: }
! 281:
! 282: /*
! 283: * mbsplit()
! 284: *
! 285: * Break an mbuf chain after "cnt" bytes.
! 286: * Return the newly created mbuf chain that
! 287: * starts after "cnt" bytes. If MBLEN(bp) <= cnt,
! 288: * then returns NULL. The first part of
! 289: * the chain remains pointed to by "bp".
! 290: */
! 291:
! 292: Mbuf
! 293: mbsplit(Mbuf bp, int cnt)
! 294: {
! 295: Mbuf nbp;
! 296:
! 297: assert(cnt >= 0);
! 298:
! 299: if (!bp)
! 300: return (NULL);
! 301:
! 302: if (MBLEN(bp) <= cnt)
! 303: return (NULL);
! 304:
! 305: nbp = mballoc(bp->cnt - cnt);
! 306: memcpy(MBDATAU(nbp), MBDATAU(bp) + cnt, bp->cnt - cnt);
! 307: nbp->cnt = bp->cnt - cnt;
! 308: bp->cnt = cnt;
! 309:
! 310: return(nbp);
! 311: }
! 312:
! 313: /*
! 314: * MemStat()
! 315: */
! 316:
! 317: int
! 318: MemStat(Context ctx, int ac, char *av[], void *arg)
! 319: {
! 320: struct typed_mem_stats stats;
! 321: u_int i;
! 322: u_int total_allocs = 0;
! 323: u_int total_bytes = 0;
! 324:
! 325: if (typed_mem_usage(&stats))
! 326: Error("typed_mem_usage() error");
! 327:
! 328: /* Print header */
! 329: Printf(" %-28s %10s %10s\r\n", "Type", "Count", "Total");
! 330: Printf(" %-28s %10s %10s\r\n", "----", "-----", "-----");
! 331:
! 332: for (i = 0; i < stats.length; i++) {
! 333: struct typed_mem_typestats *type = &stats.elems[i];
! 334:
! 335: Printf(" %-28s %10u %10lu\r\n",
! 336: type->type, (int)type->allocs, (u_long)type->bytes);
! 337: total_allocs += type->allocs;
! 338: total_bytes += type->bytes;
! 339: }
! 340: /* Print totals */
! 341: Printf(" %-28s %10s %10s\r\n", "", "-----", "-----");
! 342: Printf(" %-28s %10lu %10lu\r\n",
! 343: "Totals", total_allocs, total_bytes);
! 344:
! 345: structs_free(&typed_mem_stats_type, NULL, &stats);
! 346: return(0);
! 347: }
! 348:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>