today’s topic access and manipulate meta data for files –file type, ownership, access...
TRANSCRIPT
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?