Using `chdir' and `stat'
........................
This minor node shows how to use the new functions at the `awk'
level once they've been integrated into the running `gawk' interpreter.
Using `chdir' is very straightforward. It takes one argument, the new
directory to change to:
...
newdir = "/home/arnold/funstuff"
ret = chdir(newdir)
if (ret < 0) {
printf("could not change to %s: %s\n",
newdir, ERRNO) > "/dev/stderr"
exit 1
}
...
The return value is negative if the `chdir' failed, and `ERRNO'
(Note:Built-in Variables) is set to a string indicating the error.
Using `stat' is a bit more complicated. The C `stat' function fills
in a structure that has a fair amount of information. The right way to
model this in `awk' is to fill in an associative array with the
appropriate information:
file = "/home/arnold/.profile"
fdata[1] = "x" # force `fdata' to be an array
ret = stat(file, fdata)
if (ret < 0) {
printf("could not stat %s: %s\n",
file, ERRNO) > "/dev/stderr"
exit 1
}
printf("size of %s is %d bytes\n", file, fdata["size"])
The `stat' function always clears the data array, even if the `stat'
fails. It fills in the following elements:
`"name"'
The name of the file that was `stat''ed.
`"dev"'
`"ino"'
The file's device and inode numbers, respectively.
`"mode"'
The file's mode, as a numeric value. This includes both the file's
type and its permissions.
`"nlink"'
The number of hard links (directory entries) the file has.
`"uid"'
`"gid"'
The numeric user and group ID numbers of the file's owner.
`"size"'
The size in bytes of the file.
`"blocks"'
The number of disk blocks the file actually occupies. This may not
be a function of the file's size if the file has holes.
`"atime"'
`"mtime"'
`"ctime"'
The file's last access, modification, and inode update times,
respectively. These are numeric timestamps, suitable for
formatting with `strftime' (Note:Built-in Functions.).
`"pmode"'
The file's "printable mode." This is a string representation of
the file's type and permissions, such as what is produced by `ls
-l'--for example, `"drwxr-xr-x"'.
`"type"'
A printable string representation of the file's type. The value
is one of the following:
`"blockdev"'
`"chardev"'
The file is a block or character device ("special file").
`"directory"'
The file is a directory.
`"fifo"'
The file is a named-pipe (also known as a FIFO).
`"file"'
The file is just a regular file.
`"socket"'
The file is an `AF_UNIX' ("Unix domain") socket in the
filesystem.
`"symlink"'
The file is a symbolic link.
Several additional elements may be present depending upon the
operating system and the type of the file. You can test for them in
your `awk' program by using the `in' operator (Note:Referring to an
Array Element.):
`"blksize"'
The preferred block size for I/O to the file. This field is not
present on all POSIX-like systems in the C `stat' structure.
`"linkval"'
If the file is a symbolic link, this element is the name of the
file the link points to (i.e., the value of the link).
`"rdev"'
`"major"'
`"minor"'
If the file is a block or character device file, then these values
represent the numeric device number and the major and minor
components of that number, respectively.