Kernel Directory Interface - PowerPoint PPT Presentation

1 / 36
About This Presentation
Title:

Kernel Directory Interface

Description:

Title: Directories Author: UVSC Last modified by: Brian Durney Created Date: 8/31/2001 7:07:44 PM Document presentation format: On-screen Show (4:3) – PowerPoint PPT presentation

Number of Views:45
Avg rating:3.0/5.0
Slides: 37
Provided by: UVSC9
Category:

less

Transcript and Presenter's Notes

Title: Kernel Directory Interface


1
Kernel Directory Interface
2
Directories
Recall that in Unix your hard drive is
organized into a hierarchical system of
directories and files.
operating systems
Root
B
A
C
B
A
C
C
B
B
B
C
C
C
C
3
Directories
operating systems
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.
4
Opening a Directory
operating systems
include ltdirent.hgt include ltsys/types.hgt DIR
opendir (const char name)
If the open succeeds, a pointer to a directory
structure is returned. Otherwise a NULL pointer
is returned.
see the man page for opendir!
5
Reading from a Directory
operating systems
include ltdirent.hgt include ltsys/types.hgt struct
dirent readdir (DIR dirp)
readdir reads the next entry from the
directory and returns a pointer to a dirent
structure.
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_name255 1 // name
types defined in ltsys/types.hgt
This is the only field guaranteed by Posix
7
dirent File Types
operating systems
DT_UNKNOWN 0 DT_FIFO 1 DT_CHR 2 DT_DIR 4 DT_BLK
6 DT_REG 8 DT_LNK 10 DT_SOCK 12 DT_WHT 14
8
What Else Can You Do with a Directory?
operating systems
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
links
ls -al total 104 drwxr-xr-x 25 debryro
staff 850 Aug 3 1450 . drwxr-xr-x 13
debryro staff 442 Jun 15 1309
3060 drwxr-xr-x 2 debryro staff 68 Jun
15 1308 CNS3060 -rw-r--r-- 1 debryro
staff 36 Jun 14 1409 afile -rw-r--r--
2 debryro staff 16 Jun 14 1508
file-a -rw-r--r-- 2 debryro staff 16
Jun 14 1508 file-b lrwxr-xr-x 1 debryro
staff 6 Jun 14 1511 file-c -gt
file-a -r-xr-xr-x 1 debryro staff 1809
Jun 14 1134 monthly drwxr-xr-x 4 debryro
staff 136 Aug 1 1459 more
owner
group
size
last modified
name
permissions
file type
11
Where does ls get its information?
operating systems
file attributes are returned in a stat structure.
The header file ltsys/stat.hgt 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)
when the file is a symbolic link, lstat returns
information about the link, while stat returns
information about the file the link points to!
returns 0 when successful -1 when fails
fstat returns information about a file that is
already open.
12
stat structure (os/X)
operating systems
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_qspare2 / RESERVED DO NOT USE! /
see /usr/include/sys.stat.h
13
Reading st_mode bits
operating systems
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)
14
Use these masks for the permission
bits S_IRUSR read bit for file owner S_IWUSR write
bit for file owner S_IXUSR execute but for file
owner S_IRGRP read bit for group S_IWGRP write
bit for group S_IXGRP execute bit for
group S_IROTH read bit for other S_IWOTH
write bit for other S_IXOTH execute bit for
other
operating systems
Example if ( buf.st_mode S_IRUSR) printf
(user read bit is on)
15
operating systems
Look at Some Examples
16
File Ownership
operating systems
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
17
Some File Access Permission Rules
operating systems
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!
18
File access tests
operating systems
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.
19
Changing File Permissions
operating systems
include ltsys/types.hgt include ltsys/stat.hgt int
chmod (const char pathname, mode_t mode) int
fchmod(int fd, mode_t mode)
If (chmod(foo, S_IRUSR S_IWUSR S_IXUSR) lt
0) // error code
20
Changing File Ownership
operating systems
include ltsys/stat.hgt include ltunistd.hgt 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.
21
Time Values
operating systems
Field Description Example ls
option st_atime last access time of file read
-u st_mtime last modification time write
default st_ctime last change time (inode) chmod
-c
22
Unix Time Functions
operating systems
  • A digression

23
operating systems
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.
24
operating systems
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.
25
operating systems
string
formatted string
asctime
strftime
struct tm
broken down time
ctime
localtime
gmtime
mktime
time_t
calendar time
time
kernel
takes time zone into account
26
struct tm
operating systems
Broken down time
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
27
Converting time_t to tm
operating systems
include lttime.hgt struct tm gmtime (const
time_t tptr) struct tm localtime (const
time_t tptr)
broken down time is in UTC
broken down time is in local time, given time
zone and daylight savings
28
Converting tm to time_t
operating systems
time_t mktime (struct tm tptr)
29
generating time strings
operating systems
char asctime (const struct tm tmptr) char
ctime (const time_t tptr)
Takes time zone into account
both generate a 26 character string of the form
Tue Sep 26 164905 2002\n\0
30
Generating a formatted string
operating systems
size_t strftime (char tbuf, size_t maxsize,
const char format, const struct tm
tptr)
the buffer to store the string in, and its max
size
a broken down time
the format string works like printf
returns the size of the formatted string if
successful 0 if fails
31
Format Description Example a abbreviated
weekday name Tue A full weekday
name Tuesday b abbreviated month
name Jan B full month name January c date
and time Tue Jan 14 194005 2002 d day of
the month 00-31 14 H hour of 24 hour day
00-23 19 I hour of 24 hour day
00-12 07 j day of the year 001-366 014 m m
onth 01-12 01 M minute 00-59 40 p am or
pm PM S second 00-61 05 U Sunday week
number 00-53 02 w weekday 0Sunday
6 5 W Monday week number 00-53 07 x date
01/14/02 X time 194004 y year without
century00-99 02 Y year with
century 2002 Z time zone name MST
32
Getting the Directory Name
operating systems
include ltunistd.hgt extern char getcwd (char
buf, size_t size)
size is max size of the path name that can be
returned.
33
Project 2du command
operating systems
du command with no arguments
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 2du command
operating systems
du command with a filename
print out the size of the file in bytes, followed
by the file name.
35
Project 2du command
operating systems
du command with a directory name
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 2du command
operating systems
Hints
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.
Write a Comment
User Comments (0)
About PowerShow.com