Annotation of fam/include/fam.h, Revision 1.1
1.1 ! trev 1: /*
! 2: Copyright (C) 1999 Silicon Graphics, Inc. All Rights Reserved.
! 3:
! 4: This program is free software; you can redistribute it and/or modify it
! 5: under the terms of version 2.1 of the GNU Lesser General Public License
! 6: as published by the Free Software Foundation.
! 7:
! 8: This program is distributed in the hope that it would be useful, but
! 9: WITHOUT ANY WARRANTY; without even the implied warranty of
! 10: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Further, any
! 11: license provided herein, whether implied or otherwise, is limited to
! 12: this program in accordance with the express provisions of the GNU Lesser
! 13: General Public License. Patent licenses, if any, provided herein do not
! 14: apply to combinations of this program with other product or programs, or
! 15: any other product whatsoever. This program is distributed without any
! 16: warranty that the program is delivered free of the rightful claim of any
! 17: third person by way of infringement or the like. See the GNU Lesser
! 18: General Public License for more details.
! 19:
! 20: You should have received a copy of the GNU General Public License along
! 21: with this program; if not, write the Free Software Foundation, Inc., 59
! 22: Temple Place - Suite 330, Boston MA 02111-1307, USA.
! 23: */
! 24:
! 25: #ifndef _FAM_
! 26: #define _FAM_
! 27: #ifdef __cplusplus
! 28: extern "C" {
! 29: #endif
! 30:
! 31:
! 32: /*****************************************************************************
! 33: *
! 34: * MODULE: Fam.h - File Alteration Monitor
! 35: *
! 36: * Fam allows applications to monitor files - receiving events when they
! 37: * change. The scheme is simple: Applications register which
! 38: * files/directories they are interested, and fam will notify the
! 39: * application when any of these files are changed.
! 40: *
! 41: *****************************************************************************/
! 42:
! 43: /* For NAME_MAX - maximum # of chars in a filename */
! 44: #include "limits.h"
! 45:
! 46:
! 47:
! 48:
! 49:
! 50: /*****************************************************************************
! 51: * DATA STRUCTURES
! 52: *
! 53: *
! 54: * FAMConnection Structure:
! 55: *
! 56: * The FAMConnection Data structure is created when opening a connection
! 57: * to fam. After that, it is passed into all fam procedures. This
! 58: * structure has all the information in it to talk to fam (Currently,
! 59: * the only data inside this structure is a file descriptor for
! 60: * the socket to fam).
! 61: *****************************************************************************/
! 62:
! 63: typedef struct FAMConnection {
! 64: int fd;
! 65: void *client;
! 66: } FAMConnection;
! 67:
! 68:
! 69: /*****************************************************************************
! 70: * To access the fd inside this structure (so the application writer can
! 71: * use select for fam events), the following macro is defined (this will
! 72: * allow us to change the implementation without users having to change
! 73: * their code):
! 74: *****************************************************************************/
! 75: #define FAMCONNECTION_GETFD(fc) ((fc)->fd)
! 76:
! 77:
! 78:
! 79:
! 80:
! 81: /*****************************************************************************
! 82: * FAMRequest Structure:
! 83: *
! 84: * Every time fam is called on to monitor a file, it passes back a
! 85: * FAMRequest structure. The main piece of data that this structure
! 86: * contans is a reqnum. This reqnum is guaranteed to be unique. When
! 87: * cancelling or suspending a monitor request, you must pass this
! 88: * data structure into FAMCancelMonitor or FAMSuspendMonitor to
! 89: * make sure that you are cancelling/suspending the correct request
! 90: * (You can monitor the same file/directory more than once).
! 91: *****************************************************************************/
! 92:
! 93: typedef struct FAMRequest {
! 94: int reqnum;
! 95: } FAMRequest;
! 96:
! 97:
! 98: /*****************************************************************************
! 99: * Once again, to access the reqnum inside this structure, use the
! 100: * following macro:
! 101: *****************************************************************************/
! 102: #define FAMREQUEST_GETREQNUM(fc) ((fc)->reqnum)
! 103:
! 104:
! 105:
! 106: /*****************************************************************************
! 107: * FAMEvent Structure:
! 108: *
! 109: * When a file/directory has been modified/deleted, fam will pass
! 110: * a FAMEvent structure to the application (through the callback
! 111: * in the FAMMonitorFile/Directory routines). This structure will
! 112: * describe what event happened to the file. The different events
! 113: * that can happen to a file are listed in the FAMCodes enum.
! 114: *****************************************************************************/
! 115: enum FAMCodes { FAMChanged=1, FAMDeleted=2, FAMStartExecuting=3,
! 116: FAMStopExecuting=4, FAMCreated=5, FAMMoved=6,
! 117: FAMAcknowledge=7, FAMExists=8, FAMEndExist=9 };
! 118:
! 119: typedef struct FAMEvent {
! 120: FAMConnection* fc; /* The fam connection that event occurred on */
! 121: FAMRequest fr; /* Corresponds to the FamRequest from monitor */
! 122: char *hostname; /* host and filename - pointer to which */
! 123: char filename[PATH_MAX]; /* file changed */
! 124: void *userdata; /* userdata associated with this monitor req. */
! 125: enum FAMCodes code; /* What happened to file - see above */
! 126: } FAMEvent;
! 127:
! 128:
! 129:
! 130:
! 131:
! 132: /*****************************************************************************
! 133: * ERROR HANDLING
! 134: *
! 135: * If an error occurs inside of libfam, a global named FAMErrno is set
! 136: * to a non-zero value and the routine that the error occurred in will
! 137: * return an error value (usually NULL). FAMErrlist is a global
! 138: * string array (indexed by FAMErrno) that describes the last error
! 139: * that happened;
! 140: *
! 141: * NOTE: currently FAMErrno and FamErrList are unused
! 142: *****************************************************************************/
! 143:
! 144: extern int FAMErrno;
! 145: extern char *FamErrlist[];
! 146:
! 147: /*
! 148: *[NOTE: Eventually, there will be a bunch of defines right here defining what
! 149: * errors can happen in using libfam ]
! 150: */
! 151:
! 152:
! 153:
! 154:
! 155:
! 156:
! 157: /*****************************************************************************
! 158: * PROCEDURES:
! 159: *
! 160: * FAMOpen, FAMClose
! 161: *
! 162: * The first step that an application has to do is open a connection to
! 163: * fam. This is done through the FAMOpen. FAMOpen returns a FAMConnection
! 164: * data structure which is passed to all fam procedures. FAMClose closes
! 165: * a fam connection.
! 166: *
! 167: * On error, FAMOpen will return NULL and FAMClose will return -1 (and
! 168: * FAMErrno will be set to the value of the error).
! 169: *****************************************************************************/
! 170:
! 171: extern int FAMOpen(FAMConnection* fc);
! 172: extern int FAMOpen2(FAMConnection* fc, const char* appName);
! 173: extern int FAMClose(FAMConnection* fc);
! 174:
! 175:
! 176:
! 177: /*****************************************************************************
! 178: * FAMMonitorDirectory, FAMMonitorFile
! 179: *
! 180: * These routines tell fam to start monitoring a file/directory. The
! 181: * parameters to this function are a FAMConnection (received from FAMOpen),
! 182: * a filename and a user data ptr. A FAMRequest structure is returned.
! 183: * When the file/directory changes, a fam event structure will be
! 184: * generated. The application can retrieve this structure by calling
! 185: * FAMNextEvent (see description under FAMNextEvent).
! 186: *
! 187: * The difference between these two routines is that FAMMonitorDirectory
! 188: * monitors any changes that happens to the contents of the directory
! 189: * (as well as the directory file itself) and FAMMonitorFile monitors
! 190: * only what happens to a particular file.
! 191: *
! 192: * On error FAMMonitorDirectory/File will return NULL (and FAMErrno will
! 193: * be set to the value of the error).
! 194: *****************************************************************************/
! 195:
! 196: extern int FAMMonitorDirectory(FAMConnection *fc,
! 197: const char *filename,
! 198: FAMRequest* fr,
! 199: void* userData);
! 200: extern int FAMMonitorFile(FAMConnection *fc,
! 201: const char *filename,
! 202: FAMRequest* fr,
! 203: void* userData);
! 204: extern int FAMMonitorCollection(FAMConnection *fc,
! 205: const char *filename,
! 206: FAMRequest* fr,
! 207: void* userData,
! 208: int depth,
! 209: const char* mask);
! 210:
! 211: extern int FAMMonitorDirectory2(FAMConnection *fc,
! 212: const char *filename,
! 213: FAMRequest* fr);
! 214: extern int FAMMonitorFile2(FAMConnection *fc,
! 215: const char *filename,
! 216: FAMRequest* fr);
! 217:
! 218:
! 219: /*****************************************************************************
! 220: * FAMSuspendMonitor, FAMResumeMonitor
! 221: *
! 222: * FAMSuspendMonitor enables applications to suspend
! 223: * receive events about files/directories that are changing. This can
! 224: * be useful in situations when an application is stowed and does not
! 225: * want to receive events until it is unstowed. FAMResumeMonitor
! 226: * signals fam to start monitoring the file/directory again.
! 227: *
! 228: * Both of these routines take a FAMConnection and a FAMRequest structure.
! 229: * The FAMRequest Structure is returned from the FAMMonitorFile/Directory
! 230: * routines.
! 231: *
! 232: * On error, FAMResume/SuspendMonitor will return -1 (and the global
! 233: * FAMErrno will be set to the value of the error).
! 234: *****************************************************************************/
! 235:
! 236: int FAMSuspendMonitor(FAMConnection *fc, const FAMRequest *fr);
! 237: int FAMResumeMonitor(FAMConnection *fc, const FAMRequest *fr);
! 238:
! 239:
! 240:
! 241:
! 242:
! 243:
! 244: /*****************************************************************************
! 245: * FAMCancelMonitor
! 246: *
! 247: * When an application is done monitoring a file/directory, it should
! 248: * call FAMCancelMonitor. This routine will signal fam not to watch
! 249: * this directory anymore. Once again, the FAMRequest structure is
! 250: * returned from the FAMMonitorFile/Directory routines.
! 251: *
! 252: * On error, FAMCancelMonitor will return -1 (and the global
! 253: * FAMErrno will be set to the value of the error). This routine will free
! 254: * the FAMRequest structure that is passed in.
! 255: *****************************************************************************/
! 256:
! 257: int FAMCancelMonitor(FAMConnection *fc, const FAMRequest *fr);
! 258:
! 259:
! 260:
! 261:
! 262: /*****************************************************************************
! 263: * FAMNextEvent, FAMPending
! 264: *
! 265: * FAMNextEvent will get the next fam event (file/directory change). If
! 266: * there are no fam events waiting, then FAMNextEvent will wait
! 267: * until a fam event has been received (from fam).
! 268: *
! 269: * FAMPending will return the number of fam events that are waiting.
! 270: * This routine always returns immediately to the caller.
! 271: *
! 272: * Essentially, there are two ways to for applications to receive fam
! 273: * events:
! 274: *
! 275: * 1. The "Polling" approach - Just call FAMPending periodically;
! 276: * like when the system is waiting for input. If FAMPending returns
! 277: * with a positive return value, then there are fam events waiting.
! 278: * Call FAMNextEvent to receive the events.
! 279: *
! 280: * 2. The "Select" approach - Use the fd returned from famOpen (in the
! 281: * FAMConnection structure) as one of the fds that the application
! 282: * selects on. When select returns saying that data is on the fam
! 283: * fd, call FAMNextEvent.
! 284: *
! 285: * FAMNextEvent reads any information that is on the fam socket,
! 286: * and returns it to the application (in the form of a FAMEvent).
! 287: *
! 288: * On error, FAMNextEvent and FAMPendingEvent will return -1 (and the global
! 289: * FAMErrno will be set to the value of the error).
! 290: *****************************************************************************/
! 291:
! 292: int FAMNextEvent(FAMConnection *fc, FAMEvent *fe);
! 293: int FAMPending(FAMConnection* fc);
! 294:
! 295:
! 296:
! 297:
! 298: /*****************************************************************************
! 299: * FAMDebugLevel
! 300: *
! 301: * This doesn't do anything.
! 302: *
! 303: *****************************************************************************/
! 304:
! 305: #define FAM_DEBUG_OFF 0
! 306: #define FAM_DEBUG_ON 1
! 307: #define FAM_DEBUG_VERBOSE 2
! 308:
! 309: int FAMDebugLevel(FAMConnection *fc, int debugLevel);
! 310:
! 311: #ifdef __cplusplus
! 312: }
! 313: #endif
! 314: #endif /* _FAM_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>