[BACK]Return to fam.3x CVS log [TXT][DIR] Up to [Development] / fam / man

Annotation of fam/man/fam.3x, Revision 1.1.1.1

1.1       trev        1: '\"macro stdmacro
                      2: .if n .pH g3x.fam @(#)fam	30.3 of 1/19/86
                      3: .nr X
                      4: .if \nX=0 .ds x} FAM 3X "Specialized Libraries" "\&"
                      5: .if \nX=1 .ds x} FAM 3X "Specialized Libraries"
                      6: .if \nX=2 .ds x} FAM 3X "" "\&"
                      7: .if \nX=3 .ds x} FAM "" "" "\&"
                      8: .TH \*(x}
                      9: .SH NAME
                     10: fam \- File Alteration Monitor (FAM) library routines
                     11: .SH SYNOPSIS
                     12: .nf
                     13: .B #include <fam.h>
                     14: .P
                     15: .B "extern int FAMOpen(FAMConnection* fc);"
                     16: .PP
                     17: .B "extern int FAMClose(FAMConnection* fc);"
                     18: .PP
                     19: .B "extern int FAMMonitorDirectory(FAMConnection *fc,"
                     20: .B "                               char *filename,"
                     21: .B "                               FAMRequest* fr,"
                     22: .B "                               void* userData);"
                     23: .PP
                     24: .B "extern int FAMMonitorFile(FAMConnection *fc,
                     25: .B "                          char *filename,"
                     26: .B "                          FAMRequest* fr,"
                     27: .B "                          void* userData);"
                     28: .PP
                     29: .B "int FAMSuspendMonitor(FAMConnection *fc, FAMRequest *fr);"
                     30: .PP
                     31: .B "int FAMResumeMonitor(FAMConnection *fc, FAMRequest *fr);"
                     32: .PP
                     33: .B "int FAMCancelMonitor(FAMConnection *fc, FAMRequest *fr);"
                     34: .PP
                     35: .B "int FAMNextEvent(FAMConnection *fc, FAMEvent *fe);"
                     36: .PP
                     37: .B "int FAMPending(FAMConnection* fc);"
                     38: .PP
                     39: .B "typedef struct {"
                     40: .B "    int fd;"
                     41: .B "} FAMConnection;"
                     42: .PP
                     43: .B "#define FAMCONNECTION_GETFD(fc)      (fc->fd)"
                     44: .PP
                     45: .B "typedef struct {"
                     46: .B "    int reqnum;"
                     47: .B "} FAMRequest;"
                     48: .PP
                     49: .B "enum FAMCodes { FAMChanged=1, FAMDeleted=2, FAMStartExecuting=3, "
                     50: .B "    FAMStopExecuting=4, FAMCreated=5, FAMMoved=6, FAMAcknowledge=7,"
                     51: .B "    FAMExists=8, FAMEndExist=9 };"
                     52: .PP
                     53: .B "typedef struct {"
                     54: .B "    FAMConnection* fc;"
                     55: .B "    FAMRequest fr;"
                     56: .B "    char hostname[MAXHOSTNAMELEN];"
                     57: .B "    char filename[NAME_MAX];"
                     58: .B "    void *userdata;"
                     59: .B "    FAMCodes code;"
                     60: .B "} FAMEvent;"
                     61: .PP
                     62: .B "extern int FAMErrno;"
                     63: .PP
                     64: .B "extern char *FamErrlist[];"
                     65: .PP
                     66: .SH DESCRIPTION
                     67: \fIFAM\fP monitors files and directories, notifying interested
                     68: applications of changes.  Routines for communicating with the fam(1M)
                     69: server process are found in ``libfam.a'', which is loaded if the
                     70: option ``-lfam'' is used with cc(1) or ld(1).  The library
                     71: ``libC.a'' (``-lC'') must also be specified.
                     72: .PP
                     73: An application calls routines described here to establish a list of
                     74: files for \fIfam \fPto monitor.  \fIFam \fPgenerates events on a socket to
                     75: communicate with the application.  The \fIfam\fP process is started when
                     76: the first connection from any application to it is opened.  It exits
                     77: after all connections to it have been closed.
                     78: .PP
                     79: .SH USING FAM
                     80: Here are the steps required to use \fIFAM \fPin an application:
                     81: .PP
                     82: .AL
                     83: .LI
                     84: .IP 1.
                     85: Create a connection to \fIfam\fP by calling FAMOpen.  This routine
                     86: will pass back a FAMConnection structure used in all \fIfam \fP
                     87: procedures.
                     88: .IP 2.
                     89: Tell \fIfam\fP which files and directories to monitor by calling
                     90: FAMMonitorFile and FAMMonitorDirectory to express interest in
                     91: files and directories, respectively.
                     92: .IP 3.
                     93: Select on the \fIfam\fP socket file descriptor and call
                     94: FAMPending when the \fIfam \fPsocket is active, and FAMNextEvent when
                     95: FAMPending indicates that an event is available.  Alternatively,
                     96: call FAMPending (or FAMNextEvent)
                     97: periodically to check the socket connection to \fIfam\fP to see
                     98: if any new information has arrived.  If there are no events
                     99: pending, FAMNextEvent blocks until an event occurs.
                    100: .IP 4.
                    101: When the application is through monitoring a file or directory, it
                    102: should call FAMCancelMonitor.  If the application wants to
                    103: temporarily suspend monitoring of a file or directory, it may call
                    104: FAMSuspendMonitor.  When the application is ready to start
                    105: monitoring again, it calls FAMResumeMonitor.
                    106: .IP 5.
                    107: Before the application exits, it should call FAMClose to free
                    108: resources associated with files still being monitored and to close the
                    109: connection to \fIfam.\fP
                    110: .PP
                    111: .SH DATA STRUCTURES
                    112: .B "The FAMConnection Structure"
                    113: .PP
                    114: The FAMConnection data structure is created when opening a connection
                    115: to \fIFAM.\fP  Subsequently it is passed into all \fIFAM \fPprocedures.  This
                    116: structure has all the information in it to communicate to \fIfam\fP.
                    117: .PP
                    118: Use the macro FAMCONNECTION_GETFD to access the file descriptor inside the
                    119: FAMConnection, rather than accessing it directly.
                    120: .PP
                    121: .B "The FAMRequest Structure"
                    122: .PP
                    123: When \fIfam\fP is called on to monitor a file, it passes back a
                    124: FAMRequest structure.  This structure uniquely identifies the request
                    125: so that it may be cancelled, using FAMCancelMonitor
                    126: or suspended, using FAMSuspendMonitor.
                    127: .PP
                    128: .B "The FAMEvent Structure"
                    129: .PP
                    130: Changes to files and directories are encoded in the FAMEvent
                    131: structure.  The \fIcode \fPfield of this structure contains one of the
                    132: following enumeration constants:
                    133: .TP .90i
                    134: .SM FAMChanged
                    135: Some value which can be obtained with fstat(1) changed for a file or
                    136: directory being monitored.
                    137: .TP
                    138: .SM FAMDeleted
                    139: A file or directory being monitored was deleted or its name was changed.
                    140: This event is also generated when monitoring starts on a nonexistent file or directory.
                    141: .TP
                    142: .SM FAMStartExecuting
                    143: An executable file or shared library
                    144: being monitored started executing.  If multiple processes execute
                    145: the same file, this event only occurs when the first process starts.
                    146: .TP
                    147: .SM FAMStopExecuting
                    148: An executable file being monitored which was running finished.  If
                    149: multiple processes from an executable are running, this event is only
                    150: generated when the last one finishes.
                    151: .TP
                    152: .SM FAMCreated
                    153: A file was created in a directory being monitored.  Note: this event
                    154: is only generated for files created directly in a directory being
                    155: monitored; subdirectories are not automatically monitored.
                    156: .TP
                    157: .SM FAMMoved
                    158: FAMMoved events never occur.  The name remains defined so that
                    159: programs that reference it will still compile.
                    160: .TP
                    161: .SM FAMAcknowledge
                    162: After a FAMCancelMonitor, \fIfam \fPgenerates a FAMAcknowledge event.
                    163: Also, if an invalid pathname is specified, \fIfam \fP generates a
                    164: FAMAcknowledge event.
                    165: .TP
                    166: .SM FAMExists
                    167: When the application requests a file be monitored, \fIfam\fP
                    168: generates a FAMExists event for that file.  When the application
                    169: requests a directory be monitored, \fIfam\fP generates a FAMExists
                    170: event for that directory and every file directly contained in that
                    171: directory.
                    172: .TP
                    173: .SM FAMEndExist
                    174: When the application requests a file directory be monitored, a series of
                    175: FAMExists events is generated as described above.  After the last
                    176: FAMExists message, \fIfam \fPgenerates a FAMEndExist message.
                    177: .PP
                    178: If a FAM event applies to a file or directory being monitored, the
                    179: FAMEvent's \fIfilename \fPfield contains the full pathname
                    180: that was passed to fam.
                    181: If an event applies to an entry in a monitored directory, the
                    182: \fIfilename \fPfield contains the relative path only.  For
                    183: example, if the directory \fI/usr/tmp/xyzzy \fPwere monitored,
                    184: and the file \fI/usr/tmp/xyzzy/plugh \fP were deleted, a FAMDeleted
                    185: event would be generated containing "plugh" in \fIfilename\fP.
                    186: If the directory itself were deleted, \fIfilename \fPwould contain
                    187: "/usr/tmp/xyzzy".
                    188: .\".SH ERROR HANDLING
                    189: .\"If an error occurs inside of \fIFAM, \fPa global named FAMErrno is set to a
                    190: .\"non-zero value and the routine that generated the error in will return an error
                    191: .\"value.  The value of FAMErrno is valid until the next \fIFAM \fProutine is
                    192: .\"called.  The FAMErrno can be translated in to a character string using the
                    193: .\"global array FAMErrlist.
                    194: .PP
                    195: .SH PROCEDURES
                    196:
                    197: .B "FAMOpen, FAMClose"
                    198: .PP
                    199: The application opens a connection to \fIfam \fPby calling FAMOpen.  FAMOpen
                    200: initializes the FAMConnection structure passed in to it and returns 0 if
                    201: successful, otherwise -1.  The variable char* appName should be set to the
                    202: name of your application. The FAMConnection structure is passed to all
                    203: subsequent \fIFAM \fPprocedure calls.
                    204:
                    205: FAMClose frees resources associated with files still being monitored and closes
                    206: a \fIfam \fPconnection.  It returns 0 if successful and -1 otherwise.
                    207: .PP
                    208: .B "FAMMonitorDirectory, FAMMonitorFile"
                    209: .PP
                    210: FAMMonitorDirectory and FAMMonitorFile tell \fIFAM \fPto start
                    211: monitoring a directory or file, respectively.  The parameters to this
                    212: function are a FAMConnection (initialized by FAMOpen), a FAMRequest
                    213: structure, a filename and a user data pointer.  The FAMRequest
                    214: structure is modified to subsequently identify this request.  When
                    215: the file or directory changes, a \fIFAM \fPevent structure will be
                    216: generated.  The application can retrieve this structure by calling
                    217: FAMNextEvent (see description under FAMNextEvent).
                    218: .PP
                    219: FAMMonitorDirectory monitors changes that happens to the contents of the
                    220: directory (as well as the directory file itself); FAMMonitorFile monitors only
                    221: what happens to a particular file.  Both routines return 0 if successful and -1
                    222: otherwise.
                    223: .PP
                    224: The filename argument must be a full pathname.
                    225:
                    226: .B "FAMSuspendMonitor, FAMResumeMonitor"
                    227: .PP
                    228: FAMSuspendMonitor temporarily suspends monitoring of files or directories.
                    229: This is useful when an application is not displaying information about files,
                    230: when it is iconified, for example.  FAMResumeMonitor signals \fIfam \fPto
                    231: start monitoring the file or directory again.  Changes which occur while
                    232: monitoring is suspended are enqueued and delivered when monitoring is
                    233: resumed.
                    234: .PP
                    235: Both of these routines take a FAMConnection and a FAMRequest structure.
                    236: The FAMRequest Structure is returned from the FAMMonitorFile or
                    237: FAMMonitorDirectory routines and return 0 if successful and -1 otherwise.
                    238: .PP
                    239: Because fam runs as an asynchronous process, FAMNextEvent may return
                    240: a few events regarding a given request after that request has been suspended.
                    241:
                    242: .B "FAMCancelMonitor"
                    243: .PP
                    244: When an application is through monitoring a file or directory, it should
                    245: call FAMCancelMonitor.  This routine will signal \fIfam \fPnot to monitor
                    246: this directory anymore.  The FAMRequest structure is returned from the
                    247: FAMMonitorFile or FAMMonitorDirectory routines.  FAMCancelMonitor returns 0 if
                    248: successful and -1 otherwise.
                    249: .PP
                    250:
                    251: .B "FAMPending, FAMNextEvent"
                    252: .PP
                    253: FAMPending returns 1 if an event is waiting and 0 if no event is waiting.  It
                    254: also returns 1 if an error has been encountered.  This routine returns
                    255: immediately to the caller.
                    256: .PP
                    257: FAMNextEvent will get the next \fIFAM \fPevent.  If there are no \fIFAM
                    258: \fPevents waiting, then the calling application blocks until a \fIFAM \fPevent
                    259: is received.  If blocking is not desirable, call FAMPending before
                    260: FAMNextEvent, and only call FAMNextEvent when FAMPending says an event is
                    261: available.
                    262: .PP
                    263: There are two ways to for applications to receive \fIFAM \fPevents:
                    264: .PP
                    265: .AL
                    266: .LI
                    267: 1. The Select approach - The application selects on the file
                    268:     descriptor returned from FAMOpen, in the FAMConnection structure.
                    269:     When this file descriptor becomes active, the application calls
                    270:     FAMPending to determine whether a complete event is ready, and
                    271:     FAMNextEvent to retrieve the pending \fIFAM \fPevent.
                    272: .PP
                    273: 2. The Polling approach - The application calls FAMPending
                    274:     periodically (usually when the system is waiting for input).
                    275:     When FAMPending returns 1, the application calls FAMNextEvent to
                    276:     retrieve the pending \fIFAM \fP event.
                    277: .PP
                    278: FAMNextEvent reads any information that is on the \fIfam \fPsocket,
                    279: and returns it to the application in the form of a FAMEvent.
                    280: .PP
                    281: FAMNextEvent returns 1 if successful and -1 otherwise.
                    282:
                    283:
                    284: .SH SEE ALSO
                    285: fam(1M).
                    286: .SH BUGS
                    287: The FAMMoved event is not currently supported.
                    288: .PP
                    289: FAMNextEvent may not initialize the FAMEvent's filename field
                    290: for FAMEndExist and FAMAcknowledge events.
                    291: Use the request number to determine the file or directory
                    292: to which those events refer.
                    293: .PP
                    294: FAMErrno and FamErrlist are not set when errors occur.
                    295: .PP
                    296: When a shell script is run, notification is generated for the shell
                    297: executing the script, typically sh(1) or csh(1).
                    298: .PP
                    299: Each process is limited to 1000 active requests at a time.
                    300:

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