home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / UUCPbb_2_1_src.lzh / UUCPBB21 / mbuf.c < prev    next >
Text File  |  1994-09-25  |  3KB  |  115 lines

  1. /*  mbuf.c - Provides some basic linked list management.
  2.     Copyright (C) 1994 Brad Spencer
  3.  
  4.     This file is part of the OS-9 UUCP package, UUCPbb.
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.     The author of UUCPbb, Bob Billson, can be contacted at:
  21.     bob@kc2wz.bubble.org  or  uunet!kc2wz!bob  or  by snail mail:
  22.     21 Bates Way, Westfield, NJ 07090
  23. */
  24.  
  25. /* Note:  It is up to the caller to keep track of what is in each block. */
  26.  
  27. /* Perhaps a mread should be written sometime */
  28.  
  29. extern int debuglvl;
  30.  
  31. #include <stdio.h>
  32. #include "mbuf.h"
  33.  
  34. /* This function writes a block into a mbuf list.  Its ok for mp and mhp
  35.    to be NULL */
  36.  
  37. struct mbuf *mwrite (mp, mhp, buf, len)
  38. struct mbuf *mp;
  39. struct mbuf **mhp;
  40. char *buf;
  41. int len;
  42. {
  43.      struct mbuf *mh;
  44.      char *sp,*dp;
  45.  
  46.      mh = *mhp;
  47.  
  48.      if (mh == NULL)
  49.        {
  50.           if ((mh = (struct mbuf *) malloc (sizeof (struct mbuf))) == NULL)
  51.             {
  52.                log ("Couldn't malloc head space for mbuf");
  53.                exit(207);
  54.             }
  55.           mp = mh;
  56.        }
  57.      else
  58.        {
  59.           if (mp == NULL)
  60.                for (mp = mh; mp->mbuf_next != NULL; mp = mp->mbuf_next);
  61.                     if ((mp->mbuf_next = (struct mbuf *)malloc(sizeof(struct mbuf))) == NULL)
  62.                       {
  63.                          log ("Couldn't malloc mbuf space");
  64.                          exit (207);
  65.                       }
  66.           mp = mp->mbuf_next;
  67.        }
  68.  
  69.      mp->mbuf_next = NULL;
  70.  
  71.      /* If buf is NULL, then make a blank mbuf entry */
  72.  
  73.      if (buf != NULL)
  74.        {
  75.           if ((mp->cbuf = (char *)malloc(len)) == NULL)
  76.             {
  77.                log ("Couldn't malloc cbuf space");
  78.                exit (207);
  79.             }
  80.           memcpy ((char *)mp->cbuf, (char *)buf, len);
  81.        }
  82.      else
  83.           len = 0;
  84.  
  85.      *mhp = mh;
  86.      mp->siz = len;
  87.      return (mp);
  88. }
  89.  
  90.  
  91.  
  92. /* This function frees a mbuf list.  The function cfree should free any
  93.    sub-malloced parts of the cbuf.  This function could also be used to
  94.    close open files, or whatever.  For simple things, the function can
  95.    be 'free' */
  96.  
  97. int mfree (mh, cfree)
  98. struct mbuf *mh;
  99. int (*cfree)();
  100. {
  101.      struct mbuf *mp,*mp2;
  102.  
  103.      mp = mh;
  104.      while (mp != NULL)
  105.        {
  106.           mp2 = mp->mbuf_next;
  107.  
  108.           if (mp->cbuf != NULL)
  109.                (*cfree)(mp->cbuf);
  110.  
  111.           free (mp);
  112.           mp = mp2;
  113.        }
  114. }
  115.