home *** CD-ROM | disk | FTP | other *** search
- RCS_ID_C="$Id: _allocufb.c,v 4.1 1994/09/29 23:09:02 jraja Exp $";
- /*
- * _allocufb.c - get a free ufb (SAS/C)
- *
- * Copyright © 1994 AmiTCP/IP Group,
- * Network Solutions Development Inc.
- * All rights reserved.
- */
-
- #include <ios1.h>
- #include <stdlib.h>
- #include <errno.h>
-
- /*
- * Allocate new ufb, which is returned as return value. The corresponding fd
- * is returned via fdp.
- */
- struct UFB *
- __allocufb(int *fdp)
- {
- struct UFB *ufb, *last_ufb;
- int last_fd = 0;
-
- /*
- * find first free ufb
- */
- last_ufb = ufb = __ufbs;
- while (ufb != NULL && ufb->ufbflg != 0) {
- last_ufb = ufb;
- last_fd++;
- ufb = last_ufb->ufbnxt;
- }
- /*
- * Check if need to create one
- */
- if (ufb == NULL) {
- if ((ufb = malloc(sizeof(*ufb))) == NULL) {
- errno = ENOMEM;
- return NULL;
- }
- ufb->ufbnxt = NULL;
- ufb->ufbflg = 0; /* => unused ufb */
-
- if (last_ufb == NULL)
- __ufbs = ufb;
- else
- last_ufb->ufbnxt = ufb;
-
- *fdp = __nufbs++;
- }
- else
- *fdp = last_fd;
-
- return ufb;
- }
-