[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

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>