Annotation of fam/fam/ClientInterest.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 "ClientInterest.h"
! 24:
! 25: #include <assert.h>
! 26: #include <errno.h>
! 27:
! 28: #include "Client.h"
! 29: #include "Event.h"
! 30: #include "FileSystem.h"
! 31: #include "FileSystemTable.h"
! 32:
! 33: ClientInterest::ClientInterest(const char *name,
! 34: Client *c, Request r, const Cred& cr, Type type)
! 35: : Interest(name, myfilesystem = FileSystemTable::find(name, cr),
! 36: c->host(), VERIFY_EXPORTED),
! 37: myclient(c), request(r), mycred(cr), fs_request(0)
! 38: {
! 39: ci_bits() = ACTIVE_STATE;
! 40: if (exported_to_host())
! 41: {
! 42: // This is so horribly lame. If this interest doesn't exist,
! 43: // and someone somewhere set errno to EACCES, let's assume the
! 44: // interest exists but this client doesn't have permission to
! 45: // monitor it. (The actual imon_express and lstat are done in
! 46: // in the Interest constructor.) This use of errno probably
! 47: // makes it easy to become confused and suggest_insecure_compat
! 48: // even when we shouldn't.
! 49: if ((!exists()) && (errno == EACCES) && (c != NULL))
! 50: {
! 51: c->suggest_insecure_compat(name);
! 52: }
! 53: post_event(exists() ? Event::Exists : Event::Deleted);
! 54: fs_request = myfilesystem->monitor(this, type);
! 55: }
! 56: else
! 57: {
! 58: post_event(Event::Deleted);
! 59: }
! 60: }
! 61:
! 62: ClientInterest::~ClientInterest()
! 63: {
! 64: myfilesystem->cancel(this, fs_request);
! 65: }
! 66:
! 67: void
! 68: ClientInterest::filesystem(FileSystem *fs)
! 69: {
! 70: myfilesystem->cancel(this, fs_request);
! 71: myfilesystem = fs;
! 72: verify_exported_to_host();
! 73: if (exported_to_host())
! 74: {
! 75: fs_request = fs->monitor(this, type());
! 76: scan();
! 77: }
! 78: else if (fs_request != 0)
! 79: {
! 80: // This Interest used to be on a filesystem which was mounted by
! 81: // the client, but now is not? Send a Deleted event.
! 82: post_event(Event::Deleted);
! 83: fs_request = 0;
! 84: }
! 85: }
! 86:
! 87: void
! 88: ClientInterest::findfilesystem()
! 89: {
! 90: FileSystem *new_fs = FileSystemTable::find(name(), mycred);
! 91: if (new_fs != myfilesystem)
! 92: {
! 93: filesystem(new_fs);
! 94: }
! 95: }
! 96:
! 97: //////////////////////////////////////////////////////////////////////////////
! 98: // Suspend/resume.
! 99:
! 100: bool
! 101: ClientInterest::active() const
! 102: {
! 103: return ci_bits() & ACTIVE_STATE;
! 104: }
! 105:
! 106: void
! 107: ClientInterest::suspend()
! 108: {
! 109: if (active())
! 110: { ci_bits() &= ~ACTIVE_STATE;
! 111: myfilesystem->hl_suspend(fs_request);
! 112: }
! 113: }
! 114:
! 115: void
! 116: ClientInterest::resume()
! 117: {
! 118: bool was_active = active();
! 119: ci_bits() |= ACTIVE_STATE; // Set state before generating events.
! 120: do_scan();
! 121: if (!was_active)
! 122: myfilesystem->hl_resume(fs_request);
! 123: }
! 124:
! 125: void
! 126: ClientInterest::post_event(const Event& event, const char *eventpath)
! 127: {
! 128: assert(active());
! 129: if (!eventpath)
! 130: eventpath = name();
! 131: myclient->post_event(event, request, eventpath);
! 132: }
! 133:
! 134: Interest *
! 135: ClientInterest::find_name(const char *)
! 136: {
! 137: // Ignore name.
! 138:
! 139: return this;
! 140: }
! 141:
! 142: bool
! 143: ClientInterest::scan(Interest *ip)
! 144: {
! 145: bool changed = false;
! 146: if (!ip)
! 147: ip = this;
! 148: ip->mark_for_scan();
! 149: if (myclient->ready_for_events())
! 150: changed = ip->do_scan();
! 151: else
! 152: myclient->enqueue_for_scan(ip);
! 153: return changed;
! 154: }
! 155:
! 156: void
! 157: ClientInterest::unscan(Interest *ip)
! 158: {
! 159: if (!ip)
! 160: ip = this;
! 161: if (ip->needs_scan())
! 162: myclient->dequeue_from_scan(ip);
! 163: }
! 164:
! 165: bool
! 166: ClientInterest::do_scan()
! 167: {
! 168: bool changed = false;
! 169: if (needs_scan() && active()) {
! 170: become_user();
! 171: changed = Interest::do_scan();
! 172: }
! 173: return changed;
! 174: }
! 175:
! 176: void
! 177: ClientInterest::notify_created(Interest *ip)
! 178: {
! 179: if (!ip)
! 180: ip = this;
! 181: myfilesystem->ll_notify_created(ip);
! 182: }
! 183:
! 184: void
! 185: ClientInterest::notify_deleted(Interest *ip)
! 186: {
! 187: if (!ip)
! 188: ip = this;
! 189: myfilesystem->ll_notify_deleted(ip);
! 190: }
! 191:
! 192: void
! 193: ClientInterest::cancel()
! 194: {
! 195: ci_bits() |= ACTIVE_STATE;
! 196: post_event(Event::Acknowledge);
! 197: unscan();
! 198: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>