{
char *p, guess[DIRSIZ+1], best[DIRSIZ+1];
char *new = newname, *old = oldname;
for (;;) {
while (*old == '/') /* skip slashes */
*new++ = *old++;
*new = '\0';
if (*old == '\0') /* exact or corrected */
return strcmp(oldname, newname) != 0;
p = guess; /* copy next component into guess */
for (; *old != '/' && *old != '\0'; old++)
if (p < guess+DIRSIZ)
*p++ = *old;
*p = '\0';
if (mindist(newname, guess, best) >= 3)
return -1; /* hopeless */
for (p = best; *new = *p++; ) /* add to end */
new++; /* of newname */
}
}
mindist(dir, guess, best) /* search dir for guess */
char *dir, *guess, *best;
{
/* set best, return distance 0..3 */
int d, nd, fd;
struct {
ino_t ino;
char name[DIRSIZ+1]; /* 1 more than in dir.h */
} nbuf;
nbuf.name[DIRSIZ] = '\0'; /* +1 for terminal '\0' */
if (dir[0] == '\0') /* current directory */
dir = ".";
d = 3; /* minimum distance */
if ((fd = open(dir, 0)) == -1)
return d;
while (read(fd,(char *)&nbuf, sizeof(struct direct)) > 0)
if (nbuf.ino) {
nd = spdist(nbuf.name, guess);
if (nd <= d && nd != 3) {
strcpy(best, nbuf.name);
d = nd;
if (d == 0) /* exact match */
break;
}
}
close(fd);
return d;
ΠΡΠ»ΠΈ ΠΈΠΌΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, Π΄Π°Π½Π½ΠΎΠ΅ mindist, ΠΏΡΡΡΠΎΠ΅, ΠΎΡΡΡΠΊΠΈΠ²Π°Π΅ΡΡΡ '.'. Π€ΡΠ½ΠΊΡΠΈΡ mindist ΡΠΈΡΠ°Π΅Ρ ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π·Π° ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·. ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π±ΡΡΠ΅Ρ Π΄Π»Ρ read ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ, Π° Π½Π΅ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ sizeof, ΡΡΠΎΠ±Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΡΠΈΡΠ»ΠΎ Π±Π°ΠΉΡΠΎΠ² ΠΈ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ Π°Π΄ΡΠ΅Ρ ΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠΌΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ.
ΠΡΠ»ΠΈ ΡΡΡΠΎΠΊΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΉΠ» ΡΠ΄Π°Π»Π΅Π½), ΡΠΎ ΠΏΠΎΠ»Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ° Π² Π½Π΅ΠΉ ΡΠ°Π²Π½ΠΎ Π½ΡΠ»Ρ ΠΈ ΠΎΠ½Π° ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ. ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ
if (nd <= d...)
Π° Π½Π΅ ΠΊΠ°ΠΊ
if (nd < d...)
ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΠ±ΠΎΠΉ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π΄Π°Π΅Ρ Π»ΡΡΡΠ΅Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅, ΡΠ΅ΠΌ ΠΈΠΌΡ '.', ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅.
/* spdist: return distance between two names */ /*
* very rough spelling metric:
* 0 if the strings are identical
* 1 if two chars are transposed
* 2 if one char wrong, added or deleted
* 3 otherwise
*/
#define EQ(s,t) (strcmp(s,t) == 0)
spdist(s, t)
char *s, *t;
{
while (*s++ == *t)
if (*t++ == '\0')
return 0; /* exact match */
if (*--s) {
if (*t) {
if (s[1] && t[1] && *s == t[1] && *t == s[1] && EQ(s+2, t+2))
return 1; /* transposition */
if (EQ(s+1, t+1))
return 2; /* 1 char mismatch */
}
if (EQ(s+1, t))
return 2; /* extra character */
}
if (*t && EQ(s, t+1))
return 2; /* missing character */
return 3;
}
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ Π½Π°Ρ Π΅ΡΡΡ spname, Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ Π²ΡΡΠ°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π² p:
/* p: print input in chunks (version 4) */
#include <stdio.h>
#define PAGESIZE 22
char *progname; /* program name for error message */
main(argc, argv)
int argc;
char *argv[];
{
FILE *fp, *efopen();
int i, pagesize = PAGESIZE;
char *p, *getenv(), buf[BUFSIZ];
progname = argv[0];
if ((p=getenv("PAGESIZE")) != NULL)
pagesize = atoi(p);
if (argc > 1 && argv[1][0] == '-') {
pagesize = atoi(&argv[1][1]);
argc--;
argv++;
}
if (argc == 1)
print(stdin, pagesize);
else
for (i = 1; i < argc; i++)
switch (spname(argv[i], buf)) {
case -1: /* no match possible */
fp = efopen(argv[i], "r");
break;
case 1: /* corrected */
fprintf(stderr, "\"%s\"? ", buf);
if (ttyin() == 'n')
break;
argv[i] = buf; /* fall through... */
case 0: /* exact match */
fp = efopen(argv[i], "r");
print(fp, pagesize);
fclose(fp);
}
exit(0);
}
Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ»Π΅ΠΏΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ½ΠΈ Ρ ΠΎΡΠΎΡΠΎ ΡΠΎΡΠ΅ΡΠ°ΡΡΡΡ Ρ p, ΡΠ°ΠΊ ΠΊΠ°ΠΊ p β Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ ΠΈ Π΄Π»Ρ Π½Π΅Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.5ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ»ΡΡΡΠΈΡΡ ΡΠ²ΡΠΈΡΡΠΈΠΊΡ Π΄Π»Ρ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ Π½Π°ΠΈΠ»ΡΡΡΠ΅Π³ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ Π² spname? ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΡΠ°Π·ΡΠΌΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ Π±ΡΠ» ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ; ΡΠ΅ΠΊΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΡΡΠΎ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅: 7.6ΠΠΌΡ tx ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ tc, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ Π»ΠΈ Π²Ρ ΠΏΡΠΈΠ΄ΡΠΌΠ°ΡΡ Π»ΡΡΡΡΡ ΠΌΠ΅ΡΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ? Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ Π΅Π΅ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΡΠΎΡΠΎ ΡΡΠ° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.7Π Π°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈ p ΠΎΡΡΡΠΈΠΌΠΎ Π±ΡΡΡΡΠ΅Π΅, Π΅ΡΠ»ΠΈ ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΏΠΎΡΡΠΈΡΠΌΠΈ?
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.8ΠΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠΉΡΠ΅ spname, ΡΡΠΎΠ±Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΈΠΌΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠΌ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π΅ΡΠ»ΠΈ Π½Π΅Π»ΡΠ·Ρ Π½Π°ΠΉΡΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ. ΠΠ°ΠΊ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, Π΅ΡΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΠ΅Π½ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠΌ?
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.9ΠΠ°ΠΊΡΡ ΠΏΠΎΠ»ΡΠ·Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΈΠ·Π²Π»Π΅ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· spname? Π‘ΠΊΠΎΠ½ΡΡΡΡΠΈΡΡΠΉΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π»Π° Π±Ρ Π΄ΡΡΠ³ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ Π²
$ fix prog filenames...
ΠΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π²Π΅ΡΡΠΈΡ cd, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ spname? ΠΠ°ΠΊ Π±Ρ Π²Ρ Π΅Π΅ Π²ΡΡΡΠΎΠΈΠ»ΠΈ?
7.3 Π€Π°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°: ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ ΠΊ ΡΠ°ΠΊΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ°ΠΉΠ»Π°Ρ , ΠΊΠ°ΠΊ ΡΠ°Π·ΠΌΠ΅ΡΡ, Π΄Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ Ρ.Π΄. ΠΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ Π³Π»Π°Π²Π΅.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Π² ΡΠ°ΠΌΠΎΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅. Π§Π°ΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΡΡΡΠΊΡΡΡΠΎΠΉ stat, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² <sys/stat.h>:
struct stat /* ΡΡΡΡΠΊΡΡΡΠ°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠ°Ρ stat */
{
dev_t st_dev; /* ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π΅ ΡΠ°ΠΉΠ» */
ino_t st_ino; /* ΠΈΠ½Π΄Π΅ΠΊΡ */
short st_mod; /* Π±ΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌΠ° */
short st_nlink; /* ΡΠΈΡΠ»ΠΎ ΡΠ²ΡΠ·Π΅ΠΉ ΡΠ°ΠΉΠ»Π° */
short st_uid; /* ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ
Π²Π»Π°Π΄Π΅Π»ΡΡΠ° */
short st_gid; /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅Π² */
dev_t st_rdev; /* Π΄Π»Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² */
off_t st_size; /* ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π° Π² ΡΠΈΠΌΠ²ΠΎΠ»Π°Ρ */
time_t st_atime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° */
time_t st_mtime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π·Π°ΠΏΠΈΡΠΈ
ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° */
time_t st_ctime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ»Π° */
}
ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΏΠΎΠ»Π΅ΠΉ ΠΏΠΎΡΡΠ½ΡΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΡΠΌΠΈ. Π’ΠΈΠΏΡ Π²ΡΠΎΠ΄Π΅ dev_t ΠΈ ino_t ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² <sys/types.h>, ΠΊΠ°ΠΊ ΠΎΡΠΌΠ΅ΡΠ΅Π½ΠΎ Π²ΡΡΠ΅. ΠΠΎΠ»Π΅ st_mode ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ»Π°Π³ΠΎΠ², ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΡ ΡΠ°ΠΉΠ»; Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ»Π°Π³ΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΡΡΡΡ ΡΠ°ΠΉΠ»Π° <sys/stat.h>:
#define S_IFMT 0170000 /* ΡΠΈΠΏ ΡΠ°ΠΉΠ»Π° */
#define S_IFDIR 0040000 /* ΠΊΠ°ΡΠ°Π»ΠΎΠ³ */
#define S_IFCHR 0020000 /* Π±Π°ΠΉΡ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ */
#define S_IFBLK 0060000 /* Π±Π»ΠΎΠΊ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ */
#define S_IFREG 0100000 /* ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΉ */
#define S_SUID 0004000 /* ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈ
Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ */
#define S_ISGID 0002000 /* ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π³ΡΡΠΏΠΏΡ
ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ */
#define S_ISVTX 0001000 /* ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π²ΡΠ³ΡΡΠΆΠ΅Π½Π½ΡΠΉ ΡΠ΅ΠΊΡΡ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ */
#define S_IREAD 0000400 /* ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΡΠ°ΡΡ, Π²Π»Π°Π΄Π΅Π»Π΅Ρ */
#define S_IWRITE 0000200 /* ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΈΡΠ°ΡΡ, Π²Π»Π°Π΄Π΅Π»Π΅Ρ */
#define S_IEXEC 0000100 /* ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅/ΠΏΠΎΠΈΡΠΊ, Π²Π»Π°Π΄Π΅Π»Π΅Ρ */
ΠΠ½Π΄Π΅ΠΊΡΠ½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ ΡΠ°ΠΉΠ»Π° Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄Π²ΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²Π°ΠΌ stat ΠΈ fstat. ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ stat ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ β ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° (ΠΈΠ»ΠΈ β 1 ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ). Fstat Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ΅ ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° (Π½Π΅ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° FILE). ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ,
char *name;
int fd;
struct stat stbuf;
stat(name, &stbuf);
fstat(fd, &stbuf);
Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ stbuf ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΈΠ· ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π΄Π»Ρ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΠ°ΠΉΠ»Π° fd.
ΠΠ½Π°Ρ Π²ΡΠ΅ ΡΡΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ°ΡΠ½Π΅ΠΌ Ρ Π²Π΅ΡΡΠΈΠΈ checkmail β ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° Π‘ΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠΈΠΊΠ°. ΠΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ, checkmail Π²ΡΠ΄Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅: "Π£ Π²Π°Ρ Π΅ΡΡΡ ΠΊΠΎΡΡΠ΅ΡΠΏΠΎΠ½Π΄Π΅Π½ΡΠΈΡ" ΠΈ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π·Π²ΠΎΠ½ΠΎΠΊ. (ΠΡΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π°, Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²Ρ ΡΡΠΏΠ΅Π»ΠΈ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΈ ΡΠ±ΡΠΎΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΡΡΠΎΠ²ΡΡ ΠΊΠΎΡΡΠ΅ΡΠΏΠΎΠ½Π΄Π΅Π½ΡΠΈΡ, ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ.) ΠΠ»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ°Π³Π° Π²Ρ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, Π° ΠΊΠΎΠ³Π΄Π° Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π²Ρ ΡΡΠ°Π½Π΅ΡΠ΅ Π·Π½Π°ΡΠΎΠΊΠΎΠΌ.