You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
302 volume VI os16<br />
Sorgenti della libreria generale 303<br />
«<br />
«<br />
«<br />
2170082 |#define SIG_ATOMIC_MIN (-0x80000000)<br />
2170083 |#define SIG_ATOMIC_MAX (0x7FFFFFFF)<br />
2170084 |//<br />
2170085 |#define SIZE_MAX (0xFFFFU)<br />
2170086 |//<br />
2170087 |#define WCHAR_MIN (0)<br />
2170088 |#define WCHAR_MAX (0xFFU)<br />
2170089 |//<br />
2170090 |#define WINT_MIN (-0x80L)<br />
2170091 |#define WINT_MAX (0x7FL)<br />
2170092 |//----------------------------------------------------------------------<br />
2170093 |<br />
2170094 |#endif<br />
105.1.16 lib/time_t.h<br />
Si veda la sezione 101.2.<br />
2180001 |#ifndef _TIME_T_H<br />
2180002 |#define _TIME_T_H 1<br />
2180003 |<br />
2180004 |typedef long int time_t;<br />
2180005 |<br />
2180006 |#endif<br />
105.1.17 lib/wchar_t.h<br />
Si veda la sezione 101.2.<br />
2190001 |#ifndef _WCHAR_T_H<br />
2190002 |#define _WCHAR_T_H 1<br />
2190003 |<br />
2190004 |typedef unsigned char wchar_t;<br />
2190005 |<br />
2190006 |#endif<br />
105.2 os16: «lib/dirent.h»<br />
Si veda la sezione 101.2.<br />
105.2.2 lib/dirent/closedir.c<br />
Si veda la sezione 98.10.<br />
2220001 |#include <br />
2220002 |#include <br />
2220003 |#include <br />
2220004 |#include <br />
2220005 |#include <br />
2220006 |#include <br />
2220007 |#include <br />
2220008 |#include <br />
2220009 |//----------------------------------------------------------------------<br />
2220010 |int<br />
2220011 |closedir (DIR *dp)<br />
2220012 |{<br />
2220013 | //<br />
2220014 | // Check for a valid argument<br />
2220015 | //<br />
2220016 | if (dp == NULL)<br />
2220017 | {<br />
2220018 | //<br />
2220019 | // Not a valid pointer.<br />
2220020 | //<br />
2220021 | errset (EBADF); // Invalid directory.<br />
2220022 | return (-1);<br />
2220023 | }<br />
2220024 | //<br />
2220025 | // Check if it is an open directory stream.<br />
2220026 | //<br />
2220027 | if (dp->fdn < 0)<br />
2220028 | {<br />
2220029 | //<br />
2220030 | // The stream is closed.<br />
2220031 | //<br />
2220032 | errset (EBADF); // Invalid directory.<br />
2220033 | return (-1);<br />
2220034 | }<br />
2220035 | //<br />
2220036 | // Close the file descriptor. It there is an error,<br />
2220037 | // the ‘errno’ variable will be set by ‘close()’.<br />
2220038 | //<br />
2220039 | return (close (dp->fdn));<br />
2220040 |}<br />
«<br />
2200001 |#ifndef _DIRENT_H<br />
2200002 |#define _DIRENT_H 1<br />
2200003 |<br />
105.2.3 lib/dirent/opendir.c<br />
«<br />
2200004 |#include // ino_t<br />
2200005 |#include // NAME_MAX<br />
2200006 |#include <br />
2200007 |<br />
2200008 |//----------------------------------------------------------------------<br />
2200009 |struct dirent {<br />
2200010 | ino_t d_ino; // I-node number [1]<br />
2200011 | char d_name[NAME_MAX+1]; // NAME_MAX + Null termination<br />
2200012 |};<br />
2200013 |//<br />
2200014 |// [1] The type ‘ino_t’ must be equal to ‘uint16_t’, because the<br />
2200015 |// directory inside the Minix 1 file system has exactly such<br />
2200016 |// size.<br />
2200017 |//<br />
2200018 |//----------------------------------------------------------------------<br />
2200019 |#define DOPEN_MAX OPEN_MAX/2 // [1]<br />
2200020 |//<br />
2200021 |// [1] DOPEN_MAX is not standard, but it is used to define how many<br />
2200022 |// directory slot to keep for open directories. As directory streams<br />
2200023 |// are opened as file descriptors, the sum of all kind of file open<br />
2200024 |// cannot be more than OPEM_MAX.<br />
2200025 |//----------------------------------------------------------------------<br />
2200026 |typedef struct {<br />
2200027 | int fdn; // File descriptor number.<br />
2200028 | struct dirent dir; // Last directory item read.<br />
2200029 |} DIR;<br />
2200030 |<br />
2200031 |extern DIR _directory_stream[]; // Defined inside ‘lib/dirent/DIR.c’.<br />
2200032 |//----------------------------------------------------------------------<br />
2200033 |// Function prototypes.<br />
2200034 |//----------------------------------------------------------------------<br />
2200035 |int closedir (DIR *dp);<br />
2200036 |DIR *opendir (const char *name);<br />
2200037 |struct dirent *readdir (DIR *dp);<br />
2200038 |void rewinddir (DIR *dp);<br />
2200039 |//----------------------------------------------------------------------<br />
2200040 |<br />
2200041 |#endif<br />
105.2.1 lib/dirent/DIR.c<br />
Si veda la sezione 101.2.<br />
2210001 |#include <br />
2210002 |//<br />
2210003 |// There must be room for at least ‘DOPEN_MAX’ elements.<br />
2210004 |//<br />
2210005 |DIR _directory_stream[DOPEN_MAX];<br />
2210006 |<br />
2210007 |void<br />
2210008 |_dirent_directory_stream_setup (void)<br />
2210009 |{<br />
2210010 | int d;<br />
2210011 | //<br />
2210012 | for (d = 0; d < DOPEN_MAX; d++)<br />
2210013 | {<br />
2210014 | _directory_stream[d].fdn = -1;<br />
2210015 | }<br />
2210016 |}<br />
Si veda la sezione 98.76.<br />
2230001 |#include <br />
2230002 |#include <br />
2230003 |#include <br />
2230004 |#include <br />
2230005 |#include <br />
2230006 |#include <br />
2230007 |#include <br />
2230008 |#include <br />
2230009 |//----------------------------------------------------------------------<br />
2230010 |DIR *<br />
2230011 |opendir (const char *path)<br />
2230012 |{<br />
2230013 | int fdn;<br />
2230014 | int d;<br />
2230015 | DIR *dp;<br />
2230016 | struct stat file_status;<br />
2230017 | //<br />
2230018 | // Function ‘opendir()’ is used only for reading.<br />
2230019 | //<br />
2230020 | fdn = open (path, O_RDONLY);<br />
2230021 | //<br />
2230022 | // Check the file descriptor returned.<br />
2230023 | //<br />
2230024 | if (fdn < 0)<br />
2230025 | {<br />
2230026 | //<br />
2230027 | // The variable ‘errno’ is already set:<br />
2230028 | // EINVAL<br />
2230029 | // EMFILE<br />
2230030 | // ENFILE<br />
2230031 | //<br />
2230032 | errset (errno);<br />
2230033 | return (NULL);<br />
2230034 | }<br />
2230035 | //<br />
2230036 | // Set the ‘FD_CLOEXEC’ flag for that file descriptor.<br />
2230037 | //<br />
2230038 | if (fcntl (fdn, F_SETFD, FD_CLOEXEC) != 0)<br />
2230039 | {<br />
2230040 | //<br />
2230041 | // The variable ‘errno’ is already set:<br />
2230042 | // EBADF<br />
2230043 | //<br />
2230044 | errset (errno);<br />
2230045 | close (fdn);<br />
2230046 | return (NULL);<br />
2230047 | }<br />
2230048 | //<br />
2230049 | //<br />
2230050 | //<br />
2230051 | if (fstat (fdn, &file_status) != 0)<br />
2230052 | {<br />
2230053 | //<br />
2230054 | // Error should be already set.<br />
2230055 | //<br />
2230056 | errset (errno);<br />
2230057 | close (fdn);<br />
2230058 | return (NULL);<br />
2230059 | }<br />
2230060 | //<br />
2230061 | // Verify it is a directory<br />
2230062 | //<br />
2230063 | if (!S_ISDIR(file_status.st_mode))<br />
2230064 | {<br />
2230065 | //<br />
2230066 | // It is not a directory!<br />
2230067 | //<br />
«