44: if (flags & EXT3_APPEND_FL) printf("Append");
45: if (flags & EXT3_IMMUTABLE_FL) printf("Immutable");
46: if (flags & EXT3_SYNC_FL) printf("Sync");
47: if (flags & EXT3_NODUMP_FL) printf("Nodump");
48:
49: printf("\n");
50: close(fd);
51: }
52:
53: return 0;
54: }
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΠΎΡ ΠΎΠΆΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ ext3 Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ»Π°Π³ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π°Π³ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΉ Π±ΡΠΊΠ²Ρ: Π β ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ (append only), I β Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ (immutable), S β ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ (sync), N β Π½Π΅Π΄Π°ΠΌΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ (nodump). ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ»Π°Π³ΠΈ ΡΠ°ΠΉΠ»Π°; ΠΎΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ»Π°Π³ΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅.
1: /* setflags.c */
2:
3: /* ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ β ΡΡΡΠΎΠΊΠ°, ΡΠΎΡΡΠΎΡΡΠ°Ρ ΠΈΠ·
4: 0 (Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΡΡΡΠ°Ρ) ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π±ΡΠΊΠ² ΠΈΠ· Π½Π°Π±ΠΎΡΠ° I, A, S,
5: N. ΠΡΠ° ΡΡΡΠΎΠΊΠ° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ext3 Π΄ΠΎΠ»ΠΆΠ½Ρ
6: Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π² ΠΎΡΡΠ°Π»ΡΠ½ΡΡ
7: ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ β ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ Π²ΡΠΊΠ»ΡΡΠ°ΡΡΡΡ
8: Π±ΡΠΊΠ²Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ: immutable, append-only, sync ΠΈ nodump.
9:
10: ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π° "setflags IN file1, file2" Π²ΠΊΠ»ΡΡΠ°Π΅Ρ
11: ΡΠ»Π°Π³ΠΈ immutable ΠΈ nodump Π΄Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ² file1 ΠΈ file2, Π½ΠΎ ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ
12: ΡΠ»Π°Π³ΠΈ sync ΠΈ append-only Π΄Π»Ρ ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ². */
13:
14: #include <errno.h>
15: #include <fcntl.h>
16: #include <linux/ext3_fs.h>
17: #include <stdio.h>
18: #include <string.h>
19: #include <sys/ioctl.h>
20: #include <unistd.h>
21:
22: int main(int argc, const char **argv) {
23: const char **filename = argv + 1;
24: int fd;
25: int flags = 0;
26:
27: /* Π£Π±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ»Π°Π³ΠΈ, Π²ΠΌΠ΅ΡΡΠ΅
28: Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ "0", ΠΊΠ°ΠΊ ΠΏΡΠΈΠ·Π½Π°ΠΊ
29: ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ»Π°Π³ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ±ΡΠΎΡΠ΅Π½Ρ. */
30: if (argc<3){
31: fprintf(stderr, "ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ setflags: [0][I][A][S][N]"
32: "<filenames>\n");
33: return 1;
34: }
35:
36: /* ΠΊΠ°ΠΆΠ΄Π°Ρ Π±ΡΠΊΠ²Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ»Π°Π³; ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ
37: ΡΠ»Π°Π³, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΊΠ°Π·Π°Π½Ρ */
38: if (strchr(argv[1], 'I') ) flags |= EXT3_IMMUTABLE_FL;
39: if (strchr(argv[1], 'A') ) flags |= EXT3_APPEND_FL;
40: if (strchr(argv[1], 'S') ) flags |= EXT3_SYNC_FL;
41: if (strchr(argv[1], 'N') ) flags |= EXT3_NODUMP_FL;
42:
43: /* ΠΏΡΠΎΠΉΡΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ Π² argv[] */
44: while (*(++filename)) {
45: /* Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ², Π°ΡΡΠΈΠ±ΡΡΠ° ext3 ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ,
46: ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π΅ΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ (ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° Π½Π΅ Π³ΠΎΠ΄ΠΈΡΡΡ).
47: ΠΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ext3 Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π½Π° Π·Π°ΠΏΠΈΡΡ,
48: ΠΏΠΎΡΡΠΎΠΌΡ O_RDONLY ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ. */
49: fd = open(*filename, O_RDONLY);
50: if (fd < 0) {
51: fprintf(stderr, "Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ %s:%s\n", *filename,
52: strerror(errno));
53: return 1;
54: }
55:
56: /* Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π°ΡΡΠΈΠ±ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΌΠΈ
57: ΡΠ»Π°Π³Π°ΠΌΠΈ. */
58: if (ioctl(fd, EXT3_IOC_SETFLAGS, &flags)) {
59: fprintf(stderr, "Π‘Π±ΠΎΠΉ ioctl Π² %s:%s\n", *filename,
60: strerror(errno));
61: return 1;
62: }
63: close(fd);
64: }
65:
66: return 0;
67: }
11.4. ΠΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² (ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²) β ΡΡΠΎ Π½ΠΈ ΡΡΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° Π΄ΠΈΡΠΊΠΎΠ²ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ·Π»Ρ (on-disk inodes); ΠΏΠΎΡΡΠΈ Π²ΡΡ Π²Π°ΠΆΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠ°ΡΠ°ΡΡΠ°ΡΡΡ ΡΠ°ΠΉΠ»Π°, Ρ ΡΠ°Π½ΠΈΡΡΡ Π² Π΅Π³ΠΎ inode. ΠΡΠ·ΠΎΠ² open() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄ΡΡΠ³ΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΈ Π΄Π»Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ, ΡΠ΄Π°Π»ΡΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠΎΠΈΡΠΊ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ², ΠΎΠΏΠΈΡΠ°Π½Ρ Π² Π³Π»Π°Π²Π΅ 14; ΡΠ°ΠΉΠ»Ρ ΡΠΎΠΊΠ΅ΡΠΎΠ² β Π² Π³Π»Π°Π²Π΅ 17. Π Π½Π°ΡΡΠΎΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ, ΡΠ°ΠΉΠ»Ρ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΈ FIFO.
11.4.1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Ρ ΠΎΠ΄Π½ΡΡ ΡΠΎΡΠ΅ΠΊ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ²
ΠΡΠΎΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ»Ρ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° mknod().
#include <fcntl.h>
#include <unistd.h>
int mknod(const char *pathname, mode_t mode, dev_t dev);
pathname β ΡΡΠΎ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ, mode β ΡΡΠΎ ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π΄ΠΎΡΡΡΠΏΠ° (ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡΠΈΠΌ umask), ΠΈ ΡΠΈΠΏ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° (S_IFIFO, S_IFBLK, S_IFCHR). ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, dev, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠ°ΡΡΠΈΠΉ (major) ΠΈ ΠΌΠ»Π°Π΄ΡΠΈΠΉ (minor) Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π’ΠΈΠΏ ΡΡΡΡΠΎΠΉΡΡΠ²Π° (ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ Π±Π»ΠΎΡΠ½ΠΎΠ΅) ΠΈ ΡΡΠ°ΡΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΡΠ΄ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΡΠΈΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. ΠΠ»Π°Π΄ΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΡΡΠ΅Π΄ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ , ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΠ½ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ. Π’ΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ ΡΡΡΡΠΎΠΉΡΡΠ²; ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΆΠ΅ ΠΊΠ°Π½Π°Π»Ρ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π²ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ.
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» <sys/sysmacros.h> ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΈ ΠΌΠ°ΠΊΡΠΎΡΠ° Π΄Π»Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠ° dev_t. ΠΠ°ΠΊΡΠΎΡ makedev() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ°ΡΡΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅, ΠΌΠ»Π°Π΄ΡΠΈΠ΅ β Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ dev_t, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ mknod(). ΠΠ°ΠΊΡΠΎΡΡ major() ΠΈ minor() ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° dev_t Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΠ°ΡΡΠΈΠΉ ΠΈ ΠΌΠ»Π°Π΄ΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π°.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mknod, Π΄ΠΎΡΡΡΠΏΠ½Π°Ρ Π² Linux, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΌΡ Π²ΡΠ·ΠΎΠ²Ρ mknod() (ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΡΠΌ. Π² man 1 mknod). ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ mknod Π΄Π»Ρ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° mknod(). Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ» Ρ ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ° 0666 (ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡ ΠΏΡΠ°Π²ΠΎ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ Π²ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ) ΠΈ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ umask ΠΏΡΠΎΡΠ΅ΡΡΠ° Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ°.
1: /* mknod.Ρ */
2:
3: /* Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠ°Π½Π°Π», ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅.
4: Π‘ΠΌ. ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
5: Π½Π° man-ΡΡΡΠ°Π½ΠΈΡΠ΅ mknod(1). */
6:
7: #include <errno.h>
8: #include <stdio.h>
9: #include <stdlib.h>
10: #include <string.h>
11: #include <sys/stat.h>
12: #include <sys/sysmacros.h>
13: #include <unistd.h>
14:
15: void usage(void) {
16: fprintf (stderr, "ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅: mknod <ΠΏΡΡΡ> [b | Ρ | u | p]"
17: "<ΡΡΠ°ΡΡΠΈΠΉ> <ΠΌΠ»Π°Π΄ΡΠΈΠΉ>\n");
18: exit(1);
19: }
20:
21: int main(int argc, const char **argv) {
22: int major = 0, minor = 0;
23: const char *path;
24: int mode = 0666;
25: char *end;
26: int args;
27:
28: /* ΠΡΠ΅Π³Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΡΠΈΠΏ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ inode
29: ΠΈ ΠΏΡΡΡ ΠΊ Π½Π΅ΠΌΡ. */
30: if (argc < 3) usage();
31:
32: path = argv[1];
33:
34: /* Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠΈΠΏ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ·Π»Π° */
35: if (!strcmp(argv[2], "b")) {
36: mode | = S_IFBLK;
37: args = 5;
38: } else if (!strcmp(argv[2] , "Ρ") || !strcmp(argv[2], "u")) {
39: mode |= S_IFCHR;
40: args = 5;
41: } else if(!strcmp(argv[2], "p")) {
42: mode |= S_IFIFO;
43: args = 3;
44: } else {
45: fprintf(stderr, "Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΡΠΈΠΏ ΡΠ·Π»Π° %s\n", argv[2]);
46: return 1;
47: }
48:
49: /* args ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ
50: Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ², ΡΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ²*/
51: if (argc != args) usage();
52:
53: if (args == 5) {
54: /* ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠ°ΡΡΠΈΠΉ ΠΈ ΠΌΠ»Π°Π΄ΡΠΈΠΉ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ°ΠΉΠ»Π° ΡΡΡΡΠΎΠΉΡΡΠ²,
55: ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ */
56: major = strtol(argv[3], &end, 0);
57: if (*end) {
58: fprintf(stderr,"Π½Π΅Π²Π΅ΡΠ½ΡΠΉ ΡΡΠ°ΡΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ %s\n", argv[3]);
59: return 1;
60: }
61:
62: minor = strtol(argv[4], &end, 0);
63: if (*end) {
64: fprintf(stderr, "Π½Π΅Π²Π΅ΡΠ½ΡΠΉ ΠΌΠ»Π°Π΄ΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ %s\n", argv[4]);
65: return 1;
66: }
67: }
68:
69: /* Π΅ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠ°Π½Π°Π», ΡΠΎ ΡΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
70: ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ */
71: if (mknod(path, mode, makedev(major, minor))) {
72: fprintf(stderr, "Π²ΡΠ·ΠΎΠ² mknod Π½Π΅ ΡΠ΄Π°Π»ΡΡ : %s\n", strerror(errno));