Annotation of fam/fam/IMonIrix.c++, Revision 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>