Today’s topic • Access and manipulate meta data for files

advertisement
Today’s topic
• Access and manipulate meta data for files
– File type, ownership, access permissions,
access time, etc
• How to determine if a file is not there?
• How to find out the access permissions of a file?
• How to have the full control of permissions of the files you
created in your program?
• Operations on directories
• How to determine if a file is not there?
– Try ‘ls –l’, ‘ls aa’
– Get the meta data of a file: stat
#include <sys/types.h>
#include <sys/stat.h>
int stat (const char *pathname, struct stat *buf)
int fstat(int filedes, struct stat *buf)
int lstat(const char *filename, struct stat *buf)
– This function fails when the file is not there
• There are some other ways for it to fail,
– man –a stat
– When the function succeeds, buf stores the
meta data for the file.
Struct stat {
mode_t st_mode; /* file type & mode & permissions */
ino_t st_ino; /* file inode number */
dev_t st_dev; /* device number (file system) */
dev_t st_rdev; /* device number for special files */
nlink_t st_nlinks; /* number of links */
uid_t st_uid;
/* owner user ID */
gid_t st_gid;
/* owner group ID */
off_t st_size;
/* size in bytes, for regular files */
time_t st_atime; /* time of the last access */
time_t st_mtime; /* time of the last modification */
time_t st_ctime; /* time of the last status change */
long st_blksize; /* best I/O block size */
long st_blocks; /* number of 512 byte blocks */
};
You can see most of the fields in the stat data structure with ls.
• Files types (st_mode):
–
–
–
–
–
–
–
Regular (S_ISREG(buf.st_mode))
Directory (S_ISDIR(..))
Character special file (S_ISCHR(..))
Block special file (S_ISBLK(..))
FIFO (S_ISFIFO(..))
Symbolic link (S_ISLNK(..))
Socket (S_ISSOCK(..))
– See example1.c
• Set-user-ID and set-group-ID (st_mode):
– For executable files only. Relate to what
permission should the system gives to a program
executing?
– What permission should a process get when a
program is executed?
• The same permission as whoever runs it?
• Not sufficient sometimes. Example?
– Change effective user ID and group ID when
executed.
• The main use: allowing regular users to have root access.
– Checking these bits (example1a.c)
• S_ISUID & buf.st_mode, S_ISGID & buf.st_mode
• File access permissions (st_mode)
–
–
–
–
–
–
–
–
–
user-read (S_IRUSR)
user-write (S_IWUSR)
user-execute(S_IXUSR)
group-read (S_IRGRP)
group-write (S_IWGRP)
group-execute(S_IXGRP)
other-read (S_IROTH)
other-write(S_IWOTH)
other-execute(S_IXOTH)
• See example2.c
• Creating file with customized permissions.
– Can specify permission in the creat and open calls.
– See example3.c
– There is a default file mode creation mask.
• Try ‘umask’
• The bits that are 1’s are turned-off.
– The mask can be manipulated in the program, see
example4.c.
#include <sys/types.h>
#include <sys/stat.h>
Mode_t umask(mode_t cmask);
• Change mode and change owner
– chmod and chown, both as command lines and
as system calls.
– Remove a file without write permission, see
example5a.c
– Read a file without the read permission, see
example5.c (as long as you are the owner).
• Remove and rename files:
#include <stdio.h>
int remove(const char *path); /* C function, same as unlink */
int rename(const char *oldname, const char *newname) /* also a C function */
• Hard link and symbolic link of a file:
– Hard link of a file is to create a new directory entry
with the same inode number.
– Hard link is not allowed for a directory (to avoid loops
in the directory’s tree structure).
– In struct stat, the st_nlinks field records the number of
directory entries pointing to the inode for the file.
– Link/unlink are both command line and system calls
#include <unistd.h>
int link(const char *existingpath, const char *newpath)
/* create a new entry in the directory with the same inode
number */
/* similar to copy, what is the difference?*/
int unlink(const char *path);
• Symbolic link
– The link function creates a “hard link”:
• (newname, inode number) in a directory
• If not done carefully, can be a problem (destroy the
tree structure of the directories)
– Not allow to create a hard link on directories
– Symbolic link, which is an indirect pointer to a
file, gets around the problem
• need to be careful whether a function follow the
symbolic link
– Unlink do not follow symbolic link (only the symbolic
link is removed), open follow the symbolic link by
default.
• Symbolic link
– Try the following
‘ln –s /no/such/file myfile’
‘ls myfile’
‘cat myfile’
‘ls –l myfile’
– System calls:
#include <unistd.h>
int symlink(const char *actualpath, const char *sympath);
int readlink(const char *pathname, char *buf, int bufsize);
• File times
– st_atime: last access time
– st_mtime: last modification time
– st_ctime: last status change time
– Try: ‘ls –u -l’, ‘ls –c -l’
– The access time and modification time can be
changed with the utime function. See
example6.c.
• Random access files
– Current file offset can be manipulated with
lseek calls, see example7.c.
• Try ‘more hole001’ and ‘od –c hole001’.
#include <sys/types.h>
#include <unistd.h>
off_t lssek(int filedes, off_t offset, int whence)
whence = SEEK_SET, SEEK_CUR, SEEK_END
Operating on directories
• Only root can write, all other can only read
(or write implicitly through system calls).
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name)
struct dirent *readdir(DIR *dp);
void rewinddir (DIR *dp);
int closedir(DIR *dp)
Operating on directories
#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dp);
struct dirent {
ino_t d_ino;
char *d_name[NAME_MAX+1];
}
– Return NULL when reaching the end of the directory.
– Example: implementing the ‘find’ command, see
example8.c
Current Working Directory
• Can be changed using
– int chdir(const char *pathname);
– int fchdir(int filedes);
• Note that they only affect the current
process’ working directory
• Obtaining current working directory
– char *getcwd(char *buf, size_t size);
Review
• What is the most reliable way to check if a file exists?
• What other information are stored in the struct stat variable
returned from stat()?
• What is the purpose of set-user-id and set-group-id in the file
meta-data?
• Which system call sets the file permission?
• Give 2 functions that delete a file.
• What is the difference between hard link and symbolic link?
• How to create/delete a hard link?
• How to create/delete a symbolic link?
• Is a directory a file? Can you edit directory?
• What does chdir do?
Download