Annotation of fam/fam/IMonIrix.c++, Revision 1.1.1.1
1.1 trev 1: // Copyright (C) 1999 Silicon Graphics, Inc. All Rights Reserved.
2: //
3: // This program is free software; you can redistribute it and/or modify it
4: // under the terms of version 2 of the GNU General Public License as
5: // published by the Free Software Foundation.
6: //
7: // This program is distributed in the hope that it would be useful, but
8: // WITHOUT ANY WARRANTY; without even the implied warranty of
9: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Further, any
10: // license provided herein, whether implied or otherwise, is limited to
11: // this program in accordance with the express provisions of the GNU
12: // General Public License. Patent licenses, if any, provided herein do not
13: // apply to combinations of this program with other product or programs, or
14: // any other product whatsoever. This program is distributed without any
15: // warranty that the program is delivered free of the rightful claim of any
16: // third person by way of infringement or the like. See the GNU General
17: // Public License for more details.
18: //
19: // You should have received a copy of the GNU General Public License along
20: // with this program; if not, write the Free Software Foundation, Inc., 59
21: // Temple Place - Suite 330, Boston MA 02111-1307, USA.
22:
23: #include <sys/types.h>
24: #include <sys/stat.h>
25: #include <sys/imon.h>
26: #include <sys/sysmacros.h>
27:
28: #include <fcntl.h>
29: #include <stropts.h>
30: #include <unistd.h>
31: #include <stdlib.h>
32: #include <errno.h>
33:
34: #include "Log.h"
35: #include "IMon.h"
36:
37: const intmask_t INTEREST_MASK = (IMON_CONTENT | IMON_ATTRIBUTE | IMON_DELETE |
38: IMON_EXEC | IMON_EXIT | IMON_RENAME);
39:
40: int IMon::imon_open()
41: {
42: int imon = open("/dev/imon", O_RDONLY, 0);
43: if (imon == -1) {
44: Log::critical("can't open /dev/imon: %m");
45: }
46: return imon;
47: }
48:
49: IMon::Status IMon::imon_express(const char *name, struct stat *status)
50: {
51: interest_t interest = { (char *) name, status, INTEREST_MASK };
52: int rc = ioctl(imonfd, IMONIOC_EXPRESS, &interest);
53: if (rc < 0)
54: {
55: if (name[0] == '/') {
56: Log::info("IMONIOC_EXPRESS on \"%s\" failed (euid: %i): %m",
57: name, geteuid());
58: } else {
59: char * cwd = getcwd(0, 256);
60: Log::info("IMONIOC_EXPRESS on \"%s\" with cwd \"%s\" failed (euid: %i): %m",
61: name,cwd,geteuid());
62: free(cwd);
63: }
64: return BAD;
65: }
66: else
67: {
68: if (status != NULL) {
69: Log::debug("told imon to monitor \"%s\" = dev %d/%d, ino %d", name,
70: major(status->st_dev), minor(status->st_dev),
71: status->st_ino);
72: } else {
73: Log::debug("told imon to monitor \"%s\" (but I didn't ask for dev/ino)",
74: name);
75: }
76: return OK;
77: }
78: }
79:
80: IMon::Status IMon::imon_revoke(const char *name, dev_t dev, ino_t ino)
81: {
82: static bool can_revokdi = true;
83: bool revokdi_failed;
84:
85: #ifdef HAVE_IMON_REVOKDI
86: if (can_revokdi)
87: {
88: struct revokdi revokdi = { dev, ino, INTEREST_MASK };
89: int rc = ioctl(imonfd, IMONIOC_REVOKDI, &revokdi);
90: if (rc < 0)
91: { Log::perror("IMONIOC_REVOKDI on \"%s\" failed", name);
92: revokdi_failed = true;
93: if (errno == EINVAL)
94: can_revokdi = false;
95: }
96: else
97: revokdi_failed = false;
98: }
99: #else
100: can_revokdi = false;
101: #endif // !HAVE_IMON_REVOKDI
102:
103: if (!can_revokdi || revokdi_failed)
104: {
105: // Try the old revoke ioctl.
106:
107: interest_t interest = { (char *) name, NULL, INTEREST_MASK };
108: int rc = ioctl(imonfd, IMONIOC_REVOKE, &interest);
109: if (rc < 0)
110: { // Log error at LOG_DEBUG. IMONIOC_REVOKE fails all the time.
111: Log::debug("IMONIOC_REVOKE on \"%s\" failed: %m", name);
112: return BAD;
113: }
114: }
115:
116: Log::debug("told imon to forget \"%s\"", name);
117: return OK;
118: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>