24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

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 />

«

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!