Presentation is loading. Please wait.

Presentation is loading. Please wait.

Kernel Directory Interface. DirectoriesDirectories Recall that in Unix your hard drive is organized into a hierarchical system of directories and files.

Similar presentations


Presentation on theme: "Kernel Directory Interface. DirectoriesDirectories Recall that in Unix your hard drive is organized into a hierarchical system of directories and files."— Presentation transcript:

1 Kernel Directory Interface

2 DirectoriesDirectories Recall that in Unix your hard drive is organized into a hierarchical system of directories and files. Root A B C A C C B C B B B C C C operating systems

3 DirectoriesDirectories All of the directory functions are defined in the header file dirent.h A pointer to a DIR structure is used to manipulate directory information, much as a FILE structure is used to manipulate files. operating systems

4 Opening a Directory #include DIR *opendir (const char *name); If the open succeeds, a pointer to a directory structure is returned. Otherwise a NULL pointer is returned. operating systems see the man page for opendir!

5 Reading from a Directory #include struct dirent *readdir (DIR *dirp); readdir reads the next entry from the directory and returns a pointer to a dirent structure. operating systems see the man page for readdir!

6 The dirent structure operating systems On OS/X The dirent structure is defined as (see dirent man page) struct dirent { u_int32_t d_fileno;// files inode number u_int16_t d_reclen;// length of this record u_int8_t d_type;// file type u_int8_t d_namlen;// length of name string char d_name[255 + 1];// name }; This is the only field guaranteed by Posix types defined in

7 dirent File Types operating systems DT_UNKNOWN0 DT_FIFO1 DT_CHR2 DT_DIR4 DT_BLK6 DT_REG8 DT_LNK10 DT_SOCK12 DT_WHT14

8 operating systems What Else Can You Do with a Directory? telldir( )returns the current location in the directory stream seekdir( )sets the position in the directory stream rewinddir( )sets the position to the beginning of the directory stream closedir( )closes a directory

9 operating systems Look at an Example

10 The ls Command $ ls -al total 104 drwxr-xr-x 25 debryro staff 850 Aug 3 14:50. drwxr-xr-x 13 debryro staff 442 Jun 15 13:09 3060 drwxr-xr-x 2 debryro staff 68 Jun 15 13:08 CNS3060 -rw-r--r-- 1 debryro staff 36 Jun 14 14:09 afile -rw-r--r-- 2 debryro staff 16 Jun 14 15:08 file-a -rw-r--r-- 2 debryro staff 16 Jun 14 15:08 file-b lrwxr-xr-x 1 debryro staff 6 Jun 14 15:11 file-c -> file-a -r-xr-xr-x 1 debryro staff 1809 Jun 14 11:34 monthly drwxr-xr-x 4 debryro staff 136 Aug 1 14:59 more file type permissions links ownergroupsize last modified name

11 Where does ls get its information? file attributes are returned in a stat structure. The header file declares all of the symbols used in this structure. File attributes are returned in the following three functions: int stat (const char *filename, struct stat *buf); int lstat (const char *filename, struct stat *buf); int fstat (int filedes, struct stat *buf); returns 0 when successful -1 when fails when the file is a symbolic link, lstat returns information about the link, while stat returns information about the file the link points to! fstat returns information about a file that is already open. operating systems

12 stat structure (os/X) struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* File serial number */ mode_t st_mode; /* Mode of file */ nlink_t st_nlink; /* Number of hard links */ uid_t st_uid; /* User ID of the file */ gid_t st_gid; /* Group ID of the file */ dev_t st_rdev; /* Device ID */ time_t st_atime; /* Time of last access */ long st_atimensec; /* nsec of last access */ time_t st_mtime; /* Last data modification time */ long st_mtimensec; /* last data modification nsec */ time_t st_ctime; /* Time of last status change */ long st_ctimensec; /* nsec of last status change */ off_t st_size; /* file size, in bytes */ blkcnt_t st_blocks; /* blocks allocated for file */ blksize_t st_blksize; /* optimal blocksize for I/O */ __uint32_t st_flags; /* user defined flags for file */ __uint32_t st_gen; /* file generation number */ __int32_t st_lspare; /* RESERVED: DO NOT USE! */ __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ }; see /usr/include/sys.stat.h operating systems

13 Reading st_mode bits Use the following macros to test the file type int S_ISDIR (mode_t m); // returns non-zero if a directory int S_ISCHR (mode_t m); // returns non-zero if a char device int S_ISBLK (mode_t m); // returns non-zero if a block device int S_ISREG (mode_t m); // returns non-zero if a regular file int S_ISFIFO (mode_t m); // returns non-zero if a pipe int S_ISLNK (mode_t m) returns non-zero if a symbolic link int S_ISSOCK (mode_t m); // returns non-zero if a socket Example usage: if (S_ISREG(buf.st_mode) ) printf(“regular file”); operating systems

14 Use these masks for the permission bits S_IRUSRread bit for file owner S_IWUSRwrite bit for file owner S_IXUSRexecute but for file owner S_IRGRPread bit for group S_IWGRPwrite bit for group S_IXGRPexecute bit for group S_IROTH read bit for other S_IWOTH write bit for other S_IXOTH execute bit for other Example: if ( buf.st_mode & S_IRUSR) printf (“user read bit is on”); operating systems

15 Look at Some Examples operating systems

16 File Ownership Every process has six or more IDs associated with it. a real user id a real group id These identify who we really are. They are taken from the password file when we log in. These are properties of the file. an effective user id an effective group id When we execute a program, the effective user id is usually the same as the real user id and the effective group id is usually the same as the real group id. These are properties of the process. It is possible to set a flag that says “when this file is executed, set the effective user ID of the process to be the owner of the file. Example: if the file owner is root, and the set-user-ID bit is set, then while that file is running, it has root privileges (example – passwd) Test the set-User-ID bit with the constant S_ISUID operating systems

17 Some File Access Permission Rules Whenever we want to open any type of file by name, we must have execute permissions in each directory mentioned in the path to the file, including the current directory. Read permission on a directory only means that you can read the directory – obtaining a list of file names in the directory. We cannot create a new file in a directory unless we have both write and execute permissions for the directory. To delete a file we need both write and execute permissions in the directory. Note that you do not need read and write permissions for the file! operating systems

18 File access tests The kernel performs the following access tests each time a process opens, creates, or deletes a file: If the effective user ID of the process is 0, access is allowed. If the effective user ID of the process equals the owner ID of the file, access is allowed if the appropriate permission bit is set. If the effective group ID of the process equals the group ID of The file, access is allowed if the appropriate permission bit is set. If the appropriate other permission bit is set access is allowed. operating systems

19 Changing File Permissions #include int chmod (const char *pathname, mode_t mode); int fchmod(int fd, mode_t mode); If (chmod(“foo”, S_IRUSR | S_IWUSR | S_IXUSR) < 0) // error code … operating systems

20 Changing File Ownership #include int chown (const char *pathname, uid_t owner, gid_t group); int fchown ( int fd, uid_t owner, gid_t group); int lchown (const char *pathname, uid_t owner, gid_t group); Changes the owner of the symbolic link, not The owner of the file linked to. Normally, only the file owner can change ownership of the file. operating systems

21 Time Values FieldDescriptionExample ls option st_atimelast access time of fileread -u st_mtimelast modification timewrite default st_ctimelast change time (inode)chmod -c operating systems

22 Unix Time Functions A digression … operating systems

23 The basic Linux (and Unix) time service counts the number of seconds that have passed since January 1, 1970 (UTC). These seconds are normally stored in a variable whose type is time_t. This is called calendar time. operating systems

24 We can get calendar time by using the call time_t time (time_t *tptr); returns the time, and stores the value here if the argument is non-null. operating systems

25 time_t struct tm string formatted string kernel time calendar time broken down time gmtime localtime mktime ctime asctime strftime takes time zone into account operating systems

26 struct tm { int tm_sec;// seconds after the minute [0-61] int tm_min;// minutes after the hour [0-59] int tm_hour;// hours after midnight [0-23] int tm_mday;// day of the month [1-31] int tm_mon;// month of the year [0-11] int tm_year;// years since 1900 int tm_wday;// day of the week [0-6] int tm_yday;// days since Jan 1 [0-365] int tm_isdst// daylight savings flag [pos, 0, neg] }; allows leap seconds operating systems Broken down time

27 Converting time_t to tm #include struct tm *gmtime (const time_t *tptr); struct tm *localtime (const time_t *tptr); broken down time is in local time, given time zone and daylight savings broken down time is in UTC operating systems

28 Converting tm to time_t time_t mktime (struct tm *tptr); operating systems

29 generating time strings char *asctime (const struct tm *tmptr); char *ctime (const time_t *tptr); both generate a 26 character string of the form Tue Sep 26 16:49:05 2002\n\0 Takes time zone into account operating systems

30 Generating a formatted string size_t strftime (char *tbuf, size_t maxsize, const char *format, const struct tm *tptr); returns the size of the formatted string if successful 0 if fails a broken down time the buffer to store the string in, and its max size the format string – works like printf operating systems

31 FormatDescriptionExample %aabbreviated weekday nameTue %Afull weekday nameTuesday %babbreviated month nameJan %Bfull month nameJanuary %cdate and timeTue Jan 14 19:40:05 2002 %dday of the month [00-31]14 %Hhour of 24 hour day [00-23]19 %Ihour of 24 hour day [00-12]07 %jday of the year [001-366]014 %mmonth [01-12]01 %Mminute [00-59]40 %pam or pmPM %Ssecond [00-61]05 %USunday week number [00-53]02 %wweekday [0=Sunday – 6]5 %WMonday week number [00-53]07 %xdate01/14/02 %Xtime19:40:04 %yyear without century[00-99]02 %Yyear with century2002 %Ztime zone nameMST

32 Getting the Directory Name #include extern char *getcwd (char *buf, size_t size); size is max size of the path name that can be returned. operating systems

33 Project #2 du command du command with no arguments operating systems Your du command should use the current working directory. Print out the number of bytes in the directory entry itself. For each file in the directory, print out the size of the file in bytes, followed by the file name. For each sub-directory in the directory, print out the number of bytes in the directory entry, then open the directory and repeat this process for each entry in that sub-directory. Repeat this recursively until everything in the directory has been handled.

34 Project #2 du command du command with a filename operating systems print out the size of the file in bytes, followed by the file name.

35 Project #2 du command du command with a directory name operating systems Print out the number of bytes in the directory entry itself. For each file in the directory, print out the size of the file in bytes, followed by the file name. For each sub-directory in the directory, print out the number of bytes in the directory entry, then open the directory and repeat this process for each entry in that sub-directory. Continue to repeat this recursively until everything in the directory has been handled.

36 Project #2 du command Hints operating systems To get the full pathname of the current directory, use the getcwd( ) function. Use the d_type field in the dirent structure to get the type of file (a regular file or a directory) Use the d_name field in the dirent structure to get the name of the file Read chapter 3 in Molay for more ideas.


Download ppt "Kernel Directory Interface. DirectoriesDirectories Recall that in Unix your hard drive is organized into a hierarchical system of directories and files."

Similar presentations


Ads by Google