Restored work-around for hangs when trying to use disk-based handlers
[tangerine.git] / compiler / clib / close.c
blob530fbb31da48a783a6c1b10ef705b1a2e6acde78
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 $Id$
5 ANSI C function close().
6 */
8 #include "__arosc_privdata.h"
10 #include <unistd.h>
11 #include <stdlib.h>
12 #include <proto/exec.h>
13 #include <proto/dos.h>
14 #include <errno.h>
15 #include "__open.h"
16 #include "__errno.h"
18 /*****************************************************************************
20 NAME */
21 #include <unistd.h>
23 int close (
25 /* SYNOPSIS */
26 int fd)
28 /* FUNCTION
29 Closes an open file. If this is the last file descriptor
30 associated with this file, then all allocated resources
31 are freed, too.
33 INPUTS
34 fd - The result of a successful open()
36 RESULT
37 -1 for error or zero on success.
39 NOTES
40 This function must not be used in a shared library or
41 in a threaded application.
43 EXAMPLE
45 BUGS
47 SEE ALSO
48 open(), read(), write(), fopen()
50 INTERNALS
52 ******************************************************************************/
54 fdesc *fdesc;
56 if (!(fdesc = __getfdesc(fd)))
58 errno = EBADF;
60 return -1;
63 if (--fdesc->opencount == 0)
65 /* Due to a *stupid* behaviour of the dos.library we cannot handle closing failures cleanly :-(
66 if (
67 fdesc->fh!=__stdfiles[STDIN_FILENO] &&
68 fdesc->fh!=__stdfiles[STDOUT_FILENO] &&
69 fdesc->fh!=__stdfiles[STDERR_FILENO] &&
70 !Close(fdesc->fh)
73 fdesc->opencount++;
74 errno = IoErr2errno(IoErr());
76 return -1;
79 #warning Damn dos.library! We cannot report the error code correctly! This oughta change someday...
80 /* Since the dos.library destroyes the file handle anyway, even if the closing fails, we cannot
81 report the error code correctly, so just close the file and get out of here */
85 fdesc->fh!=__stdfiles[STDIN_FILENO] &&
86 fdesc->fh!=__stdfiles[STDOUT_FILENO] &&
87 fdesc->fh!=__stdfiles[STDERR_FILENO]
90 (void)Close(fdesc->fh);
93 free(fdesc);
96 __setfdesc(fd, NULL);
98 return 0;
99 } /* close */