home *** CD-ROM | disk | FTP | other *** search
- RCS_ID_C="$Id: _close.c,v 1.5 1994/04/12 20:48:06 jraja Exp $";
- /*
- * _close.c -- close a file
- *
- * Author: jraja <Jarno.Rajahalme@hut.fi>
- *
- * This file is part of the AmiTCP/IP Network Support Library.
- *
- * Copyright © 1993 AmiTCP/IP Group, <amitcp-group@hut.fi>
- * Helsinki University of Technology, Finland.
- * All rights reserved.
- *
- * Created : Tue Mar 8 01:39:01 1994 jraja
- * Last modified: Wed Mar 30 10:28:08 1994 jraja
- *
- */
-
- #include <ios1.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <dos.h>
- #include <proto/dos.h>
- #include <errno.h>
- #include <bsdsocket.h>
-
- int
- __close(int fd)
- {
- struct UFB *ufb;
-
- /*
- * Check for the break signals
- */
- __chkabort();
-
- /*
- * Find the ufb *
- */
- if ((ufb = __chkufb(fd)) == NULL) {
- /* __chkufb sets the errno to EBADF */
- return -1;
- }
-
- /*
- * Check if close is not needed
- */
- if ((ufb->ufbflg & (UFB_NC | UFB_CLO)) != UFB_NC) {
-
- /*
- * Empty flags mean empty ufb
- */
- if (ufb->ufbflg == 0) {
- errno = EBADF;
- return -1;
- }
-
- /*
- * Close the file
- */
- if (!(ufb->ufbflg & UFB_SOCK) && ufb->ufbfh != NULL) {
- Close(ufb->ufbfh);
-
- /*
- * Remove the file if it was temporary
- */
- if (ufb->ufbflg & UFB_TEMP && ufb->ufbfn != NULL)
- remove(ufb->ufbfn);
- }
-
- }
-
- /*
- * Free the file name
- */
- if (ufb->ufbfn != NULL) {
- free(ufb->ufbfn);
- ufb->ufbfn = NULL;
- }
-
- /*
- * Clear the flags to free this ufb
- */
- ufb->ufbflg = 0;
- ufb->ufbfh = NULL; /* just in case */
-
- /*
- * closes the socket OR the file mark
- */
- CloseSocket(fd);
-
- return 0;
- }
-
-