[BACK]Return to IMon.c++ CVS log [TXT][DIR] Up to [Development] / fam / fam

Annotation of fam/fam/IMon.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 "IMon.h"
        !            24:
        !            25: #include <assert.h>
        !            26: #include <errno.h>
        !            27: #include <fcntl.h>
        !            28:
        !            29: #if HAVE_IMON
        !            30: #ifdef __sgi
        !            31: #include <sys/imon.h>
        !            32: #else
        !            33: #include <linux/imon.h>
        !            34: #endif
        !            35: #endif
        !            36:
        !            37: #if !defined(__FreeBSD__)
        !            38: #  include <sys/sysmacros.h>
        !            39: #endif
        !            40: #include <unistd.h>
        !            41:
        !            42: #include "Interest.h"
        !            43: #include "Log.h"
        !            44: #include "Scheduler.h"
        !            45: #include "alloc.h"
        !            46:
        !            47: int		   IMon::imonfd = -2;
        !            48: IMon::EventHandler IMon::ehandler = NULL;
        !            49:
        !            50: IMon::IMon(EventHandler h)
        !            51: {
        !            52:     assert(ehandler == NULL);
        !            53:     ehandler = h;
        !            54: }
        !            55:
        !            56: IMon::~IMon()
        !            57: {
        !            58:     if (imonfd >= 0)
        !            59:     {
        !            60: 	//  Tell the scheduler.
        !            61:
        !            62: 	(void) Scheduler::remove_read_handler(imonfd);
        !            63:
        !            64: 	//  Close the inode monitor device.
        !            65:
        !            66: 	if (close(imonfd) < 0)
        !            67: 	    Log::perror("can't close /dev/imon");
        !            68: 	else
        !            69: 	    Log::debug("closed /dev/imon");
        !            70: 	imonfd = -1;
        !            71:     }
        !            72:     ehandler = NULL;
        !            73: }
        !            74:
        !            75: bool
        !            76: IMon::is_active()
        !            77: {
        !            78:     if (imonfd == -2)
        !            79:     {   imonfd = imon_open();
        !            80: 	if (imonfd >= 0)
        !            81: 	{   Log::debug("opened /dev/imon");
        !            82: 	    (void) Scheduler::install_read_handler(imonfd, read_handler, NULL);
        !            83: 	}
        !            84:     }
        !            85:     return imonfd >= 0;
        !            86: }
        !            87:
        !            88: IMon::Status
        !            89: IMon::express(const char *name, struct stat *status)
        !            90: {
        !            91:     if (!is_active())
        !            92: 	return BAD;
        !            93:
        !            94:     return imon_express(name, status);
        !            95: }
        !            96:
        !            97: IMon::Status
        !            98: IMon::revoke(const char *name, dev_t dev, ino_t ino)
        !            99: {
        !           100:     if (!is_active())
        !           101: 	return BAD;
        !           102:
        !           103:     return imon_revoke(name, dev, ino);
        !           104: }
        !           105:
        !           106: void
        !           107: IMon::read_handler(int fd, void *)
        !           108: {
        !           109: #if HAVE_IMON
        !           110:     qelem_t readbuf[20];
        !           111:     int rc = read(fd, readbuf, sizeof readbuf);
        !           112:     if (rc < 0)
        !           113:         Log::perror("/dev/imon read");
        !           114:     else
        !           115:     {   assert(rc % sizeof (qelem_t) == 0);
        !           116: 	rc /= sizeof (qelem_t);
        !           117: 	for (int i = 0; i < rc; i++)
        !           118: 	    if (readbuf[i].qe_what == IMON_OVER)
        !           119: 		Log::error("imon event queue overflow");
        !           120: 	    else
        !           121: 	    {	dev_t dev = readbuf[i].qe_dev;
        !           122: 		ino_t ino = readbuf[i].qe_inode;
        !           123: 		intmask_t what = readbuf[i].qe_what;
        !           124: 		Log::debug("imon said dev %d/%d, ino %ld changed%s%s%s%s%s%s",
        !           125: 			   major(dev), minor(dev), ino,
        !           126: 			   what & IMON_CONTENT   ? " CONTENT"   : "",
        !           127: 			   what & IMON_ATTRIBUTE ? " ATTRIBUTE" : "",
        !           128: 			   what & IMON_DELETE    ? " DELETE"    : "",
        !           129: 			   what & IMON_EXEC      ? " EXEC"      : "",
        !           130: 			   what & IMON_EXIT      ? " EXIT"      : "",
        !           131: #ifdef IMON_RENAME
        !           132: 			   what & IMON_RENAME    ? " RENAME"    : "",
        !           133: #endif
        !           134: 			   ""
        !           135: 		    );
        !           136: 		if (what & IMON_EXEC)
        !           137: 		    (*ehandler)(dev, ino, EXEC);
        !           138: 		if (what & IMON_EXIT)
        !           139: 		    (*ehandler)(dev, ino, EXIT);
        !           140: 		if (what & (IMON_CONTENT | IMON_ATTRIBUTE |
        !           141: 			    IMON_DELETE
        !           142: #ifdef IMON_RENAME
        !           143: 			    | IMON_RENAME
        !           144: #endif
        !           145: 		    ))
        !           146: 		    (*ehandler)(dev, ino, CHANGE);
        !           147: 	    }
        !           148:     }
        !           149: #else
        !           150:     //  I forget why/how this happens, but I know it's happened to me
        !           151:     //  (something about building fam without imon support, but then it
        !           152:     //  tries and succeeds? in opening /dev/imon?)  Anyway, it shouldn't
        !           153:     //  do that.  This should be fixed.
        !           154:     Log::critical("imon event received by fam built without imon support... "
        !           155:                   "tell fam@oss.sgi.com to fix this!");
        !           156:     int i_dont_have_IMON = 0;
        !           157:     assert(i_dont_have_IMON);
        !           158: #endif  //  HAVE_IMON
        !           159: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>