• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

config/H27-Sep-2018-29,41924,158

docker/H27-Sep-2018-5133

fswatch/H27-Sep-2018-6,6465,424

libfswatch/H27-Sep-2018-12,6167,699

m4/H27-Sep-2018-13,15711,919

man/H27-Sep-2018-1,1341,132

po/H03-May-2022-3,7643,018

ABOUT-NLSH A D27-Sep-201891.6 KiB1,2831,244

AUTHORSH A D24-Sep-2018147 95

AUTHORS.libfswatchH A D24-Sep-201898 74

CONTRIBUTING.mdH A D24-Sep-2018895 2919

COPYINGH A D24-Sep-201834.3 KiB675553

ChangeLogH A D27-Sep-201856.6 KiB1,1541,150

INSTALLH A D27-Sep-201815.4 KiB369287

Makefile.amH A D24-Sep-20181.9 KiB6435

Makefile.inH A D27-Sep-201833.9 KiB1,047919

NEWSH A D24-Sep-20186.4 KiB259145

NEWS.libfswatchH A D24-Sep-20185.2 KiB204112

READMEH A D24-Sep-201811.5 KiB303221

README.bsdH A D24-Sep-2018968 2518

README.codestyleH A D24-Sep-20182.5 KiB11197

README.freebsdH A D24-Sep-20181.9 KiB4936

README.gnu-build-systemH A D24-Sep-20182.9 KiB10669

README.illumosH A D24-Sep-20182.1 KiB5740

README.libfswatch.mdH A D24-Sep-20181.7 KiB5236

README.linuxH A D24-Sep-20182 KiB6242

README.mdH A D24-Sep-201811.5 KiB303221

README.osxH A D24-Sep-20184.6 KiB14495

README.smartosH A D24-Sep-20183 KiB11175

README.solarisH A D24-Sep-20182.1 KiB5740

README.windowsH A D24-Sep-20182.8 KiB9159

aclocal.m4H A D27-Sep-201844.6 KiB1,2571,144

configureH A D27-Sep-2018713.5 KiB23,71519,993

configure.acH A D25-Sep-20189.7 KiB307261

libfswatch_config.h.inH A D27-Sep-20186.9 KiB244169

README

1[![License](https://img.shields.io/badge/license-GPL--3.0-blue.svg?style=flat)](https://github.com/emcrisostomo/fswatch/blob/master/COPYING)
2
3README
4======
5
6`fswatch` is a file change monitor that receives notifications when the contents
7of the specified files or directories are modified.  `fswatch` implements
8several monitors:
9
10  * A monitor based on the _File System Events API_ of Apple OS X.
11  * A monitor based on _kqueue_, a notification interface introduced in FreeBSD
12    4.1 (and supported on most *BSD systems, including OS X).
13  * A monitor based on the _File Events Notification_ API of the Solaris kernel
14    and its derivatives.
15  * A monitor based on _inotify_, a Linux kernel subsystem that reports file
16    system changes to applications.
17  * A monitor based on _ReadDirectoryChangesW_, a Microsoft Windows API that
18    reports changes to a directory.
19  * A monitor which periodically stats the file system, saves file modification
20    times in memory, and manually calculates file system changes (which works
21    anywhere `stat (2)` can be used).
22
23`fswatch` should build and work correctly on any system shipping either of the
24aforementioned APIs.
25
26Table of Contents
27-----------------
28
29  * [libfswatch](#libfswatch)
30  * [Features](#features)
31  * [Limitations](#limitations)
32  * [Getting fswatch](#getting-fswatch)
33  * [Building from Source](#building-from-source)
34  * [Installation](#installation)
35  * [Documentation](#documentation)
36  * [Localization](#localization)
37  * [Usage](#usage)
38  * [Contributing](#contributing)
39  * [Bug Reports](#bug-reports)
40
41libfswatch
42----------
43
44`fswatch` is a frontend of `libfswatch`, a library with C and C++ binding.  More
45information on `libfswatch` can be found [here][README.libfswatch.md].
46
47[README.libfswatch.md]: README.libfswatch.md
48
49Features
50--------
51
52`fswatch` main features are:
53
54  * Support for many OS-specific APIs such as kevent, inotify, and FSEvents.
55  * Recursive directory monitoring.
56  * Path filtering using including and excluding regular expressions.
57  * Customizable record format.
58  * Support for periodic idle events.
59
60Limitations
61-----------
62
63The limitations of `fswatch` depend largely on the monitor being used:
64
65  * The **FSEvents** monitor, available only on OS X, has no known limitations,
66    and scales very well with the number of files being observed.
67
68  * The **File Events Notification** monitor, available on Solaris kernels and
69    its derivatives, has no known limitations.
70
71  * The **kqueue** monitor, available on any \*BSD system featuring kqueue,
72    requires a file descriptor to be opened for every file being watched.  As a
73    result, this monitor scales badly with the number of files being observed,
74    and may begin to misbehave as soon as the `fswatch` process runs out of file
75    descriptors.  In this case, `fswatch` dumps one error on standard error for
76    every file that cannot be opened.
77
78  * The **inotify** monitor, available on Linux since kernel 2.6.13, may suffer
79    a queue overflow if events are generated faster than they are read from the
80    queue.  In any case, the application is guaranteed to receive an overflow
81    notification which can be handled to gracefully recover.  `fswatch`
82    currently throws an exception if a queue overflow occurs.  Future versions
83    will handle the overflow by emitting proper notifications.
84
85  * The **Windows** monitor can only establish a watch _directories_, not files.
86    To watch a file, its parent directory must be watched in order to receive
87    change events for all the directory's children, _recursively_ at any depth.
88    Optionally, change events can be filtered to include only changes to the
89    desired file.
90
91  * The **poll** monitor, available on any platform, only relies on
92    available CPU and memory to perform its task.  The performance of this
93    monitor degrades linearly with the number of files being watched.
94
95Usage recommendations are as follows:
96
97  * On OS X, use only the `FSEvents` monitor (which is the default behaviour).
98
99  * On Solaris and its derivatives use the _File Events Notification_ monitor.
100
101  * On Linux, use the `inotify` monitor (which is the default behaviour).
102
103  * If the number of files to observe is sufficiently small, use the `kqueue`
104    monitor.  Beware that on some systems the maximum number of file descriptors
105    that can be opened by a process is set to a very low value (values as low as
106    256 are not uncommon), even if the operating system may allow a much larger
107    value.  In this case, check your OS documentation to raise this limit on
108    either a per process or a system-wide basis.
109
110  * If feasible, watch directories instead of files.  Properly crafting the
111    receiving side of the events to deal with directories may sensibly reduce
112    the monitor resource consumption.
113
114  * On Windows, use the `windows` monitor.
115
116  * If none of the above applies, use the poll monitor.  The authors' experience
117    indicates that `fswatch` requires approximately 150 MB of RAM memory to
118    observe a hierarchy of 500.000 files with a minimum path length of 32
119    characters.  A common bottleneck of the poll monitor is disk access, since
120    `stat()`-ing a great number of files may take a huge amount of time.  In
121    this case, the latency should be set to a sufficiently large value in order
122    to reduce the performance degradation that may result from frequent disk
123    access.
124
125Getting fswatch
126---------------
127
128A regular user may be able to fetch `fswatch` from the package manager of your
129OS or a third-party one.  If you are looking for `fswatch` for OS X, you can
130install it using either [MacPorts] or [Homebrew]:
131
132```
133# MacPorts
134$ port install fswatch
135
136# Homebrew
137$ brew install fswatch
138```
139
140Check your favourite package manager and let us know if `fswatch` is missing
141there.
142
143[MacPorts]: https://www.macports.org
144[Homebrew]: http://brew.sh
145
146Building from Source
147--------------------
148
149A user who wishes to build `fswatch` should get a [release tarball][release].
150A release tarball contains everything a user needs to build `fswatch` on their
151system, following the instructions detailed in the Installation section below
152and the `INSTALL` file.
153
154A developer who wishes to modify `fswatch` should get the sources (either from a
155source tarball or cloning the repository) and have the GNU Build System
156installed on their machine.  Please read `README.gnu-build-system` to get further
157details about how to bootstrap `fswatch` from sources on your machine.
158
159Getting a copy of the source repository is not recommended unless you are a
160developer, you have the GNU Build System installed on your machine, and you know
161how to bootstrap it on the sources.
162
163[release]: https://github.com/emcrisostomo/fswatch/releases
164
165Installation
166------------
167
168See the `INSTALL` file for detailed information about how to configure and
169install `fswatch`.  Since the `fswatch` builds and uses dynamic libraries, in
170some platforms you may need to perform additional tasks before you can use
171`fswatch`:
172
173  * Make sure the installation directory of dynamic libraries (`$PREFIX/lib`) is
174    included in the lookup paths of the dynamic linker of your operating system.
175    The default path, `/usr/local/lib`, will work in nearly every operating
176    system.
177  * Refreshing the links and cache to the dynamic libraries may be required.  In
178    GNU/Linux systems you may need to run `ldconfig`:
179
180        $ ldconfig
181
182`fswatch` is a C++ program and a C++ compiler compliant with the C++11 standard
183is required to compile it.  Check your OS documentation for information about
184how to install the C++ toolchain and the C++ runtime.
185
186No other software packages or dependencies are required to configure and install
187`fswatch` but the aforementioned APIs used by the file system monitors.
188
189Documentation
190-------------
191
192`fswatch` provides the following [documentation]:
193
194  * Texinfo documentation, included with the distribution.
195  * HTML documentation.
196  * PDF documentation.
197  * A [wiki] page.
198  * A man page.
199
200`fswatch` official documentation is provided in Texinfo format.  This is the
201most comprehensive source of information about `fswatch` and the only
202authoritative one.  The man page, in particular, is a stub that suggests the
203user to use the info page instead.
204
205If you are installing `fswatch` using a package manager and you would like the
206PDF manual to be bundled into the package, please send a feature request to the
207package maintainer.
208
209[documentation]: http://emcrisostomo.github.io/fswatch/doc
210[wiki]: https://github.com/emcrisostomo/fswatch/wiki
211
212Localization
213------------
214
215`fswatch` is localizable and internally uses GNU `gettext` to decouple
216localizable string from their translation.  The currently available locales are:
217
218  * English (`en`).
219  * Italian (`it`).
220  * Spanish (`es`).
221
222To build `fswatch` with localization support, you need to have `gettext`
223installed on your system.  If `configure` cannot find `<libintl.h>` or the
224linker cannot find `libintl`, then you may need to manually provide their
225location to `configure`, usually using the `CPPFLAGS` and the `LDFLAGS`
226variables.  See `README.osx` for an example.
227
228If `gettext` is not available on your system, `fswatch` shall build correctly,
229but it will lack localization support and the only available locale will be
230English.
231
232Usage
233-----
234
235`fswatch` accepts a list of paths for which change events should be received:
236
237    $ fswatch [options] ... path-0 ... path-n
238
239The event stream is created even if any of the paths do not exist yet.  If they
240are created after `fswatch` is launched, change events will be properly
241received.  Depending on the watcher being used, newly created paths will be
242monitored after the amount of configured latency has elapsed.
243
244The output of `fswatch` can be piped to other program in order to process it
245further:
246
247    $ fswatch -0 path | while read -d "" event \
248      do \
249        // do something with ${event}
250      done
251
252To run a command when a set of change events is printed to standard output but
253no event details are required, then the following command can be used:
254
255    $ fswatch -o path | xargs -n1 -I{} program
256
257The behaviour is consistent with earlier versions of `fswatch` (v. 0.x).
258Please, read the _Compatibility Issues with fswatch v. 0.x_ section for further
259information.
260
261By default `fswatch` chooses the best monitor available on the current platform,
262in terms of performance and resource consumption.  If the user wishes to specify
263a different monitor, the `-m` option can be used to specify the monitor by name:
264
265    $ fswatch -m kqueue_monitor path
266
267The list of available monitors can be obtained with the `-h` option.
268
269For more information, refer to the `fswatch` documentation.
270
271Contributing
272------------
273
274Everybody is welcome to contribute to `fswatch`.  Please, see
275[`CONTRIBUTING`][contrib] for further information.
276
277[contrib]: CONTRIBUTING.md
278
279Bug Reports
280-----------
281
282Bug reports can be sent directly to the authors.
283
284Contact the Authors
285-------------------
286
287The author can be contacted on IRC, using the Freenode `#fswatch` channel.
288
289-----
290
291Copyright (c) 2013-2017 Enrico M. Crisostomo
292
293This program is free software; you can redistribute it and/or modify it under
294the terms of the GNU General Public License as published by the Free Software
295Foundation; either version 3, or (at your option) any later version.
296
297This program is distributed in the hope that it will be useful, but WITHOUT ANY
298WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
299PARTICULAR PURPOSE.  See the GNU General Public License for more details.
300
301You should have received a copy of the GNU General Public License along with
302this program.  If not, see <http://www.gnu.org/licenses/>.
303

README.bsd

1README.bsd
2**********
3
4Introduction
5============
6
7The kqueue-based monitor should be compatible with any *BSD release with support
8for kqueue.  So far, however, the author has only tested this release on FreeBSD
9v. >= 10.0.  Feedback on different *BSD systems is much appreciated and will
10benefit other users as well.
11
12-----
13
14Copyright (c) 2014-2015 Enrico M. Crisostomo
15
16This program is free software; you can redistribute it and/or modify it under
17the terms of the GNU General Public License as published by the Free Software
18Foundation; either version 3, or (at your option) any later version.
19
20This program is distributed in the hope that it will be useful, but WITHOUT ANY
21WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
22PARTICULAR PURPOSE.  See the GNU General Public License for more details.
23
24You should have received a copy of the GNU General Public License along with
25this program.  If not, see <http://www.gnu.org/licenses/>.

README.codestyle

1README.codestyle
2================
3
4The indent style used by `fswatch` is a custom Allman (BSD) style.  The code is
5formatted using NetBeans with the following format settings:
6
7    Indents
8    Indent Size = 2
9    Expand Tabs to Spaces = true
10    Tab Size = 2
11    Statement Continuation = 2
12    Constructor Continuation = 2
13    Preprocessor Directive = Preprocessor
14    # at Start Line = true
15    Indent Namespaces = true
16    Indent Case Statements = false
17    Absolute Label Indentation = true
18    Indent Visibility = None
19    Keep Extra Spaces = false
20
21    Braces Placement
22    Namespace Declaration = New Line
23    Class Declaration = New Line
24    Function Declaration = New Line
25    Ignore Empty Function = false
26    Lambda = New Line
27    "switch" statement = New Line
28    Other = New Line
29
30    Multiline Alignment
31    Function Parameters = true
32    Function Call Arguments = true
33    Array Initializer = false
34    "for" Statement = true
35    "if" Condition = true
36    "while" Condition = true
37    Other Parenthesis = false
38
39    New Line
40    Function Name = false
41    "catch" = true
42    "else" = true
43    "while" = true
44
45    Spaces Before Keywords
46    "catch" = true
47    "else" = true
48    "while" = true
49
50    Spaces Before Parentheses
51    Function Declaration = false
52    Function Call = false
53    "catch" = true
54    "for" = true
55    "if" = true
56    "switch" = true
57    "while" = true
58    Other Keywords = true
59
60    Spaces Around Operators
61    Assignment Operators = true
62    Binary Operators = true
63    Ternary Operators = true
64    Unary Operators = false
65
66    Spaces Before Left Braces
67    Class Declaration = true
68    Function Declaration = true
69    Lambda = true
70    Array Initializer = false
71    "catch" = true
72    "do" = true
73    "else" = true
74    "for" = true
75    "if" = true
76    "switch" = true
77    "try" = true
78    "while" = true
79
80    Spaces Within Parentheses
81    Function Declaration = false
82    Function Call = false
83    Braces = false
84    Parentheses = false
85    "catch" = false
86    "for" = false
87    "if" = false
88    "switch" = false
89    Type Cast = false
90    "while" = false
91
92    Other Spaces
93    Before Comma = false
94    After Comma = true
95    Before Semicolon = false
96    After Semicolon = true
97    Before Colon = true
98    After Colon = true
99    After Type Cast = true
100    After operator Keyword = false
101
102    Blank Lines
103    Before Class = 1
104    After Class Header = 0
105    Before Function = 1
106
107    Other
108    Add Leading Star in = true
109    Toggle block comment = false
110    Insert 'inline' keyword = false
111

README.freebsd

1README.freebsd
2**************
3
4Introduction
5============
6
7This file describes the steps required to build this bundle on a supported
8FreeBSD system.  See README for more information about the tested
9configurations.
10
11The kqueue-based monitor should be compatible with any *BSD release with support
12for kqueue.  So far, however, the author has only tested this release on FreeBSD
13v. >= 10.0.  Feedback on different *BSD systems is much appreciated and will
14benefit other users as well.
15
16Installation
17============
18
19See the INSTALL file for detailed information about how to configure and install
20fswatch.
21
22fswatch is a C++ program and a C++ compiler compliant with the C++11 standard is
23required to compile it.  FreeBSD v. >= 10.0 ships by default with the CLang
24compiler suite which builds this package correctly.  The GCC compiler collection
25shipped with FreeBSD, however, is not C++11 compliant and cannot build this
26package.
27
28The configure script enforces an ordered compiler search list and clang++ will
29be used first if available.  If you do not like this choice and wish to use
30another compiler set the value of the CXX environment variable to the name of
31your compiler binary.  If, for example, you wish to use the g++ compiler, then
32use this command to configure the build:
33
34    $ ./configure CXX=g++
35
36-----
37
38Copyright (c) 2014-2015 Enrico M. Crisostomo
39
40This program is free software; you can redistribute it and/or modify it under
41the terms of the GNU General Public License as published by the Free Software
42Foundation; either version 3, or (at your option) any later version.
43
44This program is distributed in the hope that it will be useful, but WITHOUT ANY
45WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
46PARTICULAR PURPOSE.  See the GNU General Public License for more details.
47
48You should have received a copy of the GNU General Public License along with
49this program.  If not, see <http://www.gnu.org/licenses/>.

README.gnu-build-system

1README.gnu-build-system
2=======================
3
4Introduction
5------------
6
7`fswatch` is built using the GNU Build System (a.k.a. the Autotools) and
8developers willing to modify the configuration files must have the GNU Build
9System installed in order to do so.
10
11For further information about the GNU Build System and its use, please refer to
12its official documentation.
13
14Installing the GNU Build System
15-------------------------------
16
17To install the GNU Build System, the following operations must be performed:
18
19  * Get the GNU Build System components:
20    - [Autoconf] (>= v. 2.69).
21    - [Automake]: (>= v. 1.14.1).
22    - [Libtool]: (>= v. 2.4.2).
23    - [Gettext]: (>= v. 0.19.4).
24
25  * Install the packages in the following order:
26    - Autoconf
27    - Automake
28    - Libtool
29    - Gettext
30
31  * From now on, `<bundle>` will indicate any of the above-mentioned
32     components.
33
34  * Grab the sources:
35
36        $ wget <sources-url>
37
38  * Uncompress the source bundle:
39
40        $ gunzip <bundle>.tar.gz
41        $ tar -xf <bundle>.tar
42
43  * Configure the GNU Build System using the provided `autogen.sh` script:
44
45        $ ./autogen.sh
46
47    Whenever any component of the GNU Build System is updated, the `--force`
48    option should be passed to `autogen.sh`, which in turn forwards it to
49    `autoreconf`, to make sure that automatically generated scripts and macros
50    are updated:
51
52        $ ./autogen.sh --force
53
54  * Configure the package:
55
56        $ ./configure [...]
57
58  * If you want to install the package in the default location
59    (`/usr/local/bin`) you can invoke `./configure` with no option, otherwise
60    provide the desired installation directory using the `--prefix` option:
61
62        $ ./configure --prefix=/destdir
63
64  * Build the package:
65
66        $ make
67
68  * Test the components:
69
70        $ make check
71
72  * Test the installed components:
73
74        $ make check
75
76  * Install the components:
77
78        $ make install
79
80    Depending on the installation directory additional privileges may be
81    required.
82
83  * Add the installation directory to the `PATH`, otherwise builds of the
84    package may fail:
85
86        $ export PATH=/destdir/bin:$PATH
87
88[Autoconf]: https://www.gnu.org/software/autoconf/
89[Automake]: https://www.gnu.org/software/automake/
90[Libtool]: https://www.gnu.org/software/libtool/
91[Gettext]: https://www.gnu.org/software/gettext/
92-----
93
94Copyright (c) 2014-2017 Enrico M. Crisostomo
95
96This program is free software; you can redistribute it and/or modify it under
97the terms of the GNU General Public License as published by the Free Software
98Foundation; either version 3, or (at your option) any later version.
99
100This program is distributed in the hope that it will be useful, but WITHOUT ANY
101WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
102PARTICULAR PURPOSE.  See the GNU General Public License for more details.
103
104You should have received a copy of the GNU General Public License along with
105this program.  If not, see <http://www.gnu.org/licenses/>.
106

README.illumos

1README.solaris
2**************
3
4Introduction
5============
6
7This file describes the steps required to build this bundle on a supported
8system running the Solaris or the Illumos kernel.  See README for more
9information about the tested configurations.
10
11When Illumos was created, the Solaris kernel already included the File Events
12Notification API.  Hence, the fen_monitor should be available on any system
13running Solaris (> 10) or an Illumos kernel.
14
15Additionally, a Solaris/Illumos system should be able to use the following
16monitors:
17
18  * inotify_monitor, depending on the kernel version.
19
20  * poll_monitor.
21
22So far, however, the author has only tested this release on SmartOS.  Feedback
23on different Solaris/Illumos systems is much appreciated and will benefit other
24users as well.
25
26Installation
27============
28
29See the INSTALL file for detailed information about how to configure and install
30fswatch.
31
32fswatch is a C++ program and a C++ compiler compliant with the C++11 standard is
33required to compile it.  Check the documentation of your distribution to learn
34how to install the required software.
35
36The configure script enforces an ordered compiler search list and clang++ will
37be used first if available.  If you do not like this choice and wish to use
38another compiler set the value of the CXX environment variable to the name of
39your compiler binary.  If, for example, you wish to use the g++ compiler, then
40use this command to configure the build:
41
42    $ ./configure CXX=g++
43
44-----
45
46Copyright (c) 2015 Enrico M. Crisostomo
47
48This program is free software; you can redistribute it and/or modify it under
49the terms of the GNU General Public License as published by the Free Software
50Foundation; either version 3, or (at your option) any later version.
51
52This program is distributed in the hope that it will be useful, but WITHOUT ANY
53WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
54PARTICULAR PURPOSE.  See the GNU General Public License for more details.
55
56You should have received a copy of the GNU General Public License along with
57this program.  If not, see <http://www.gnu.org/licenses/>.

README.libfswatch.md

1README
2======
3
4`libfswatch` is a library that provides developers the functionality of
5`fswatch`, the main `libfswatch` frontend.  The library provides both C and C++
6bindings.
7
8`libfswatch` provides the following [documentation]:
9
10  * Texinfo documentation, included with the distribution.
11  * HTML documentation.
12  * PDF documentation.
13  * A [wiki] page.
14  * A man page.
15
16`libfswatch` official documentation is provided in Texinfo format.  This is the
17most comprehensive source of information about `libfswatch` and the only
18authoritative one.  The man page, in particular, is a stub that suggests the
19user to use the info page instead.
20
21If you are installing `libfswatch` using a package manager and you would like
22the PDF manual to be bundled into the package, please send a feature request to
23the package maintainer.
24
25[documentation]: http://emcrisostomo.github.io/fswatch/doc
26[wiki]: https://github.com/emcrisostomo/fswatch/wiki
27
28Bug Reports
29-----------
30
31Bug reports can be sent directly to the authors.
32
33Contact the Authors
34-------------------
35
36The author can be contacted on IRC, using the Freenode `#fswatch` channel.
37
38-----
39
40Copyright (c) 2013-2016 Enrico M. Crisostomo
41
42This program is free software; you can redistribute it and/or modify it under
43the terms of the GNU General Public License as published by the Free Software
44Foundation; either version 3, or (at your option) any later version.
45
46This program is distributed in the hope that it will be useful, but WITHOUT ANY
47WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
48PARTICULAR PURPOSE.  See the GNU General Public License for more details.
49
50You should have received a copy of the GNU General Public License along with
51this program.  If not, see <http://www.gnu.org/licenses/>.
52

README.linux

1README.linux
2************
3
4Introduction
5============
6
7This file describes the steps required to build fswatch on a supported GNU/Linux
8system.
9
10The supported monitors on GNU/Linux systems are:
11
12  * The inotify monitor (on Linux kernels > 2.6.13).
13  * The poll monitor.
14
15The availability of the inotify API is checked by configure and it will be built
16into fswatch when found.  When available, the inotify monitor is the default
17choice on GNU/Linux systems.
18
19The list of monitors built into libfswatch can be read in the help message of
20fswatch:
21
22    $ fswatch --help
23
24Installation
25============
26
27See the INSTALL file for detailed information about how to configure and install
28fswatch.
29
30fswatch is a C++ program and a C++ compiler compliant with the C++11 standard is
31required to compile it.  Reasonably recent GNU/Linux distributions usually ship
32at least two such compilers:
33
34  * GCC.
35  * Clang.
36
37Please, check your distribution documentation to find an appropriate C++
38compiler and how to install it.
39
40The configure script enforces an ordered compiler search list and clang++ will
41be used first if available.  If you do not like this choice and wish to use
42another compiler set the value of the CXX environment variable to the name of
43your compiler binary.  If, for example, you wish to use the g++ compiler, then
44use this command to configure the build:
45
46    $ ./configure CXX=g++
47
48-----
49
50Copyright (c) 2014-2015 Enrico M. Crisostomo
51
52This program is free software; you can redistribute it and/or modify it under
53the terms of the GNU General Public License as published by the Free Software
54Foundation; either version 3, or (at your option) any later version.
55
56This program is distributed in the hope that it will be useful, but WITHOUT ANY
57WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
58PARTICULAR PURPOSE.  See the GNU General Public License for more details.
59
60You should have received a copy of the GNU General Public License along with
61this program.  If not, see <http://www.gnu.org/licenses/>.
62

README.md

1[![License](https://img.shields.io/badge/license-GPL--3.0-blue.svg?style=flat)](https://github.com/emcrisostomo/fswatch/blob/master/COPYING)
2
3README
4======
5
6`fswatch` is a file change monitor that receives notifications when the contents
7of the specified files or directories are modified.  `fswatch` implements
8several monitors:
9
10  * A monitor based on the _File System Events API_ of Apple OS X.
11  * A monitor based on _kqueue_, a notification interface introduced in FreeBSD
12    4.1 (and supported on most *BSD systems, including OS X).
13  * A monitor based on the _File Events Notification_ API of the Solaris kernel
14    and its derivatives.
15  * A monitor based on _inotify_, a Linux kernel subsystem that reports file
16    system changes to applications.
17  * A monitor based on _ReadDirectoryChangesW_, a Microsoft Windows API that
18    reports changes to a directory.
19  * A monitor which periodically stats the file system, saves file modification
20    times in memory, and manually calculates file system changes (which works
21    anywhere `stat (2)` can be used).
22
23`fswatch` should build and work correctly on any system shipping either of the
24aforementioned APIs.
25
26Table of Contents
27-----------------
28
29  * [libfswatch](#libfswatch)
30  * [Features](#features)
31  * [Limitations](#limitations)
32  * [Getting fswatch](#getting-fswatch)
33  * [Building from Source](#building-from-source)
34  * [Installation](#installation)
35  * [Documentation](#documentation)
36  * [Localization](#localization)
37  * [Usage](#usage)
38  * [Contributing](#contributing)
39  * [Bug Reports](#bug-reports)
40
41libfswatch
42----------
43
44`fswatch` is a frontend of `libfswatch`, a library with C and C++ binding.  More
45information on `libfswatch` can be found [here][README.libfswatch.md].
46
47[README.libfswatch.md]: README.libfswatch.md
48
49Features
50--------
51
52`fswatch` main features are:
53
54  * Support for many OS-specific APIs such as kevent, inotify, and FSEvents.
55  * Recursive directory monitoring.
56  * Path filtering using including and excluding regular expressions.
57  * Customizable record format.
58  * Support for periodic idle events.
59
60Limitations
61-----------
62
63The limitations of `fswatch` depend largely on the monitor being used:
64
65  * The **FSEvents** monitor, available only on OS X, has no known limitations,
66    and scales very well with the number of files being observed.
67
68  * The **File Events Notification** monitor, available on Solaris kernels and
69    its derivatives, has no known limitations.
70
71  * The **kqueue** monitor, available on any \*BSD system featuring kqueue,
72    requires a file descriptor to be opened for every file being watched.  As a
73    result, this monitor scales badly with the number of files being observed,
74    and may begin to misbehave as soon as the `fswatch` process runs out of file
75    descriptors.  In this case, `fswatch` dumps one error on standard error for
76    every file that cannot be opened.
77
78  * The **inotify** monitor, available on Linux since kernel 2.6.13, may suffer
79    a queue overflow if events are generated faster than they are read from the
80    queue.  In any case, the application is guaranteed to receive an overflow
81    notification which can be handled to gracefully recover.  `fswatch`
82    currently throws an exception if a queue overflow occurs.  Future versions
83    will handle the overflow by emitting proper notifications.
84
85  * The **Windows** monitor can only establish a watch _directories_, not files.
86    To watch a file, its parent directory must be watched in order to receive
87    change events for all the directory's children, _recursively_ at any depth.
88    Optionally, change events can be filtered to include only changes to the
89    desired file.
90
91  * The **poll** monitor, available on any platform, only relies on
92    available CPU and memory to perform its task.  The performance of this
93    monitor degrades linearly with the number of files being watched.
94
95Usage recommendations are as follows:
96
97  * On OS X, use only the `FSEvents` monitor (which is the default behaviour).
98
99  * On Solaris and its derivatives use the _File Events Notification_ monitor.
100
101  * On Linux, use the `inotify` monitor (which is the default behaviour).
102
103  * If the number of files to observe is sufficiently small, use the `kqueue`
104    monitor.  Beware that on some systems the maximum number of file descriptors
105    that can be opened by a process is set to a very low value (values as low as
106    256 are not uncommon), even if the operating system may allow a much larger
107    value.  In this case, check your OS documentation to raise this limit on
108    either a per process or a system-wide basis.
109
110  * If feasible, watch directories instead of files.  Properly crafting the
111    receiving side of the events to deal with directories may sensibly reduce
112    the monitor resource consumption.
113
114  * On Windows, use the `windows` monitor.
115
116  * If none of the above applies, use the poll monitor.  The authors' experience
117    indicates that `fswatch` requires approximately 150 MB of RAM memory to
118    observe a hierarchy of 500.000 files with a minimum path length of 32
119    characters.  A common bottleneck of the poll monitor is disk access, since
120    `stat()`-ing a great number of files may take a huge amount of time.  In
121    this case, the latency should be set to a sufficiently large value in order
122    to reduce the performance degradation that may result from frequent disk
123    access.
124
125Getting fswatch
126---------------
127
128A regular user may be able to fetch `fswatch` from the package manager of your
129OS or a third-party one.  If you are looking for `fswatch` for OS X, you can
130install it using either [MacPorts] or [Homebrew]:
131
132```
133# MacPorts
134$ port install fswatch
135
136# Homebrew
137$ brew install fswatch
138```
139
140Check your favourite package manager and let us know if `fswatch` is missing
141there.
142
143[MacPorts]: https://www.macports.org
144[Homebrew]: http://brew.sh
145
146Building from Source
147--------------------
148
149A user who wishes to build `fswatch` should get a [release tarball][release].
150A release tarball contains everything a user needs to build `fswatch` on their
151system, following the instructions detailed in the Installation section below
152and the `INSTALL` file.
153
154A developer who wishes to modify `fswatch` should get the sources (either from a
155source tarball or cloning the repository) and have the GNU Build System
156installed on their machine.  Please read `README.gnu-build-system` to get further
157details about how to bootstrap `fswatch` from sources on your machine.
158
159Getting a copy of the source repository is not recommended unless you are a
160developer, you have the GNU Build System installed on your machine, and you know
161how to bootstrap it on the sources.
162
163[release]: https://github.com/emcrisostomo/fswatch/releases
164
165Installation
166------------
167
168See the `INSTALL` file for detailed information about how to configure and
169install `fswatch`.  Since the `fswatch` builds and uses dynamic libraries, in
170some platforms you may need to perform additional tasks before you can use
171`fswatch`:
172
173  * Make sure the installation directory of dynamic libraries (`$PREFIX/lib`) is
174    included in the lookup paths of the dynamic linker of your operating system.
175    The default path, `/usr/local/lib`, will work in nearly every operating
176    system.
177  * Refreshing the links and cache to the dynamic libraries may be required.  In
178    GNU/Linux systems you may need to run `ldconfig`:
179
180        $ ldconfig
181
182`fswatch` is a C++ program and a C++ compiler compliant with the C++11 standard
183is required to compile it.  Check your OS documentation for information about
184how to install the C++ toolchain and the C++ runtime.
185
186No other software packages or dependencies are required to configure and install
187`fswatch` but the aforementioned APIs used by the file system monitors.
188
189Documentation
190-------------
191
192`fswatch` provides the following [documentation]:
193
194  * Texinfo documentation, included with the distribution.
195  * HTML documentation.
196  * PDF documentation.
197  * A [wiki] page.
198  * A man page.
199
200`fswatch` official documentation is provided in Texinfo format.  This is the
201most comprehensive source of information about `fswatch` and the only
202authoritative one.  The man page, in particular, is a stub that suggests the
203user to use the info page instead.
204
205If you are installing `fswatch` using a package manager and you would like the
206PDF manual to be bundled into the package, please send a feature request to the
207package maintainer.
208
209[documentation]: http://emcrisostomo.github.io/fswatch/doc
210[wiki]: https://github.com/emcrisostomo/fswatch/wiki
211
212Localization
213------------
214
215`fswatch` is localizable and internally uses GNU `gettext` to decouple
216localizable string from their translation.  The currently available locales are:
217
218  * English (`en`).
219  * Italian (`it`).
220  * Spanish (`es`).
221
222To build `fswatch` with localization support, you need to have `gettext`
223installed on your system.  If `configure` cannot find `<libintl.h>` or the
224linker cannot find `libintl`, then you may need to manually provide their
225location to `configure`, usually using the `CPPFLAGS` and the `LDFLAGS`
226variables.  See `README.osx` for an example.
227
228If `gettext` is not available on your system, `fswatch` shall build correctly,
229but it will lack localization support and the only available locale will be
230English.
231
232Usage
233-----
234
235`fswatch` accepts a list of paths for which change events should be received:
236
237    $ fswatch [options] ... path-0 ... path-n
238
239The event stream is created even if any of the paths do not exist yet.  If they
240are created after `fswatch` is launched, change events will be properly
241received.  Depending on the watcher being used, newly created paths will be
242monitored after the amount of configured latency has elapsed.
243
244The output of `fswatch` can be piped to other program in order to process it
245further:
246
247    $ fswatch -0 path | while read -d "" event \
248      do \
249        // do something with ${event}
250      done
251
252To run a command when a set of change events is printed to standard output but
253no event details are required, then the following command can be used:
254
255    $ fswatch -o path | xargs -n1 -I{} program
256
257The behaviour is consistent with earlier versions of `fswatch` (v. 0.x).
258Please, read the _Compatibility Issues with fswatch v. 0.x_ section for further
259information.
260
261By default `fswatch` chooses the best monitor available on the current platform,
262in terms of performance and resource consumption.  If the user wishes to specify
263a different monitor, the `-m` option can be used to specify the monitor by name:
264
265    $ fswatch -m kqueue_monitor path
266
267The list of available monitors can be obtained with the `-h` option.
268
269For more information, refer to the `fswatch` documentation.
270
271Contributing
272------------
273
274Everybody is welcome to contribute to `fswatch`.  Please, see
275[`CONTRIBUTING`][contrib] for further information.
276
277[contrib]: CONTRIBUTING.md
278
279Bug Reports
280-----------
281
282Bug reports can be sent directly to the authors.
283
284Contact the Authors
285-------------------
286
287The author can be contacted on IRC, using the Freenode `#fswatch` channel.
288
289-----
290
291Copyright (c) 2013-2017 Enrico M. Crisostomo
292
293This program is free software; you can redistribute it and/or modify it under
294the terms of the GNU General Public License as published by the Free Software
295Foundation; either version 3, or (at your option) any later version.
296
297This program is distributed in the hope that it will be useful, but WITHOUT ANY
298WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
299PARTICULAR PURPOSE.  See the GNU General Public License for more details.
300
301You should have received a copy of the GNU General Public License along with
302this program.  If not, see <http://www.gnu.org/licenses/>.
303

README.osx

1README.osx
2**********
3
4Introduction
5============
6
7This file describes the steps required to build this bundle on a supported Apple
8OS X system.  A complete C/C++ toolchain for OS X is provided with Apple XCode,
9which can be freely installed from the Apple App Store.  See README for more
10information about the tested configurations.
11
12XCode
13=====
14
15If you plan to build the bundle with CLang/LLVM, the easiest way to get a
16working toolchain is installing Apple XCode.  Apple XCode ships with both the
17CLang/LLVM and the GCC compiler.
18
19XCode, however, does not install some required command line tools by default.
20To install them, the following operations must be performed:
21
22  1. Choose the "XCode/Preferences..." menu item.
23
24  2. Navigate to the "Downloads" pane.
25
26  3. Select the "Components" tab.
27
28  4. Select the "Command Line Tools" item and press the "Install" button.
29
30XCode 4.x
31=========
32
33XCode 4 ships with the following C/C++ compilers:
34
35  1. Apple clang++/LLVM v. 4.2:
36       Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
37       Target: x86_64-apple-darwin12.4.0
38       Thread model: posix
39
40  2. GNU GCC v. 4.2.1:
41       i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1
42       (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
43
44Only clang++ implements the required C++11 features required by fswatch, so that
45it must be configured with this compiler:
46
47  $ CXX=clang++ ./configure
48
49XCode 5.x
50=========
51
52XCode 5 ships with the following C/C++ compilers:
53
54  1. Apple clang++/LLVM v. 5.0:
55       Apple LLVM version 5.0 (clang-500.2.75) (based on LLVM 3.3svn)
56       Target: x86_64-apple-darwin12.5.0
57       Thread model: posix
58
59  2. GNU GCC v. 5.0:
60       Apple LLVM version 5.0 (clang-500.2.76) (based on LLVM 3.3svn)
61       Target: x86_64-apple-darwin12.5.0
62       Thread model: posix
63
64The GCC suite has been deprecated in favour of LLVM/CLang and gcc/g++ are now
65aliases to clang/clang++.  The project can be configured with the default
66compiler:
67
68  $ ./configure
69
70GNU Build System
71================
72
73The GNU Build System is required only by developers willing to modify the code
74on a OS X machine.  Regular users only willing to install fswatch do not need
75the GNU Build System.
76
77Recent XCode Command Line Tools releases are not shipping all the components of
78the GNU Build System any longer.  OS X users are thus required to build an
79alternate GNU Build System on their system.
80
81The required source bundles can be downloaded from their official web pages:
82
83  1. Autoconf:
84
85     (http://www.gnu.org/software/autoconf/) (>= v. 2.69)
86
87  2. Automake
88
89     (http://www.gnu.org/software/automake/) (>= v. 1.14.1)
90
91  3. Libtool:
92
93     (http://www.gnu.org/software/libtool/)  (>= v. 2.4.2)
94
95Libtool is not required to build this package but it's a core component of the
96GNU Build System.
97
98XCode Command Line Tools still ships GNU M4 (v. 1.4.6).
99
100To avoid conflicts with the binaries installed by XCode, it is strongly
101suggested to install the GNU Build System in an alternate location (such as the
102default /usr/local/bin) or in a private user folder.  To choose the desired
103install location, use the --prefix configure option.
104
105For further instruction on building the GNU Build System from scratch, please
106check the README.gnu-build-system file.
107
108Localization and gettext
109========================
110
111fswatch is localizable and locale support requires GNU gettext to be available
112at build time.  OS X does not ship gettext you will need to build it yourself or
113use a package manager such as MacPorts or Homebrew to install it.
114
115Depending on gettext installation path, configure may not be able to find
116<libintl.h> or libintl.  In this case, you will need to instruct configure about
117their location (this example assumes you use MacPorts' default installation path
118/opt/local):
119
120  $ CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" ./configure
121
122If configure detects that gettext is available, you will find a message such as:
123
124  checking whether to use NLS... yes
125
126or, which is equivalent, config.h will contain the following definition:
127
128  #define ENABLE_NLS 1
129
130-----
131
132Copyright (c) 2014-2015 Enrico M. Crisostomo
133
134This program is free software; you can redistribute it and/or modify it under
135the terms of the GNU General Public License as published by the Free Software
136Foundation; either version 3, or (at your option) any later version.
137
138This program is distributed in the hope that it will be useful, but WITHOUT ANY
139WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
140PARTICULAR PURPOSE.  See the GNU General Public License for more details.
141
142You should have received a copy of the GNU General Public License along with
143this program.  If not, see <http://www.gnu.org/licenses/>.
144

README.smartos

1README.smartos
2**************
3
4Introduction
5============
6
7This file describes the steps required to build this bundle on SmartOS.  A
8complete C/C++ toolchain for SmartOS is provided on the base-multiarch image.
9
10The user is currently using the following image for the development of fswatch
11on SmartOS:
12
13    UUID:    9250f5a8-6e9c-11e5-9cdb-67fab8707bfd
14    NAME:    base-multiarch
15    VERSION: 15.3.0
16
17Setting Up a Development Zone
18=============================
19
20A development zone can be setup using the following procedure:
21
22  * Search for the latest base-multiarch image:
23
24        $ imgadm avail | grep base-multiarch
25        9250f5a8-6e9c-11e5-9cdb-67fab8707bfd  base-multiarch            15.3.0      smartos  2015-10-09T15:44:05Z
26
27  * Install the latest image available:
28
29        $ imgadm import 9250f5a8-6e9c-11e5-9cdb-67fab8707bfd
30
31  * Create a zone manifest called development.json.  A simple zone manifest
32    template is the following:
33
34        {
35          "brand": "joyent",
36          "image_uuid": "9250f5a8-6e9c-11e5-9cdb-67fab8707bfd",
37          "alias": "development",
38          "hostname": "development",
39          "max_physical_memory": 4096,
40          "quota": 10,
41          "resolvers": ["8.8.8.8", "8.8.4.4"],
42          "nics": [
43            {
44              "nic_tag": "admin",
45              "ip": "dhcp"
46            }
47          ]
48        }
49
50  * Install a zone using the specified image and manifest:
51
52        $ vmadm create -f development.json
53
54Prerequisites
55=============
56
57The following packages must be installed on the zone where fswatch is built:
58
59  * autoconf
60
61  * automake
62
63  * gettext
64
65  * libtool
66
67  * gcc49
68
69  * git
70
71  * gmake
72
73  * gtexinfo
74
75Packages can be installed using pkgin:
76
77    $ pkgin update
78    $ pkgin install package ...
79
80Installation
81============
82
83See the INSTALL file for detailed information about how to configure and install
84fswatch.
85
86fswatch is a C++ program and a C++ compiler compliant with the C++11 standard is
87required to compile it.  Check the documentation of your distribution to learn
88how to install the required software.
89
90The configure script enforces an ordered compiler search list and clang++ will
91be used first if available.  If you do not like this choice and wish to use
92another compiler set the value of the CXX environment variable to the name of
93your compiler binary.  If, for example, you wish to use the g++ compiler, then
94use this command to configure the build:
95
96    $ ./configure CXX=g++
97
98-----
99
100Copyright (c) 2015 Enrico M. Crisostomo
101
102This program is free software; you can redistribute it and/or modify it under
103the terms of the GNU General Public License as published by the Free Software
104Foundation; either version 3, or (at your option) any later version.
105
106This program is distributed in the hope that it will be useful, but WITHOUT ANY
107WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
108PARTICULAR PURPOSE.  See the GNU General Public License for more details.
109
110You should have received a copy of the GNU General Public License along with
111this program.  If not, see <http://www.gnu.org/licenses/>.

README.solaris

1README.solaris
2**************
3
4Introduction
5============
6
7This file describes the steps required to build this bundle on a supported
8system running the Solaris or the Illumos kernel.  See README for more
9information about the tested configurations.
10
11When Illumos was created, the Solaris kernel already included the File Events
12Notification API.  Hence, the fen_monitor should be available on any system
13running Solaris (> 10) or an Illumos kernel.
14
15Additionally, a Solaris/Illumos system should be able to use the following
16monitors:
17
18  * inotify_monitor, depending on the kernel version.
19
20  * poll_monitor.
21
22So far, however, the author has only tested this release on SmartOS.  Feedback
23on different Solaris/Illumos systems is much appreciated and will benefit other
24users as well.
25
26Installation
27============
28
29See the INSTALL file for detailed information about how to configure and install
30fswatch.
31
32fswatch is a C++ program and a C++ compiler compliant with the C++11 standard is
33required to compile it.  Check the documentation of your distribution to learn
34how to install the required software.
35
36The configure script enforces an ordered compiler search list and clang++ will
37be used first if available.  If you do not like this choice and wish to use
38another compiler set the value of the CXX environment variable to the name of
39your compiler binary.  If, for example, you wish to use the g++ compiler, then
40use this command to configure the build:
41
42    $ ./configure CXX=g++
43
44-----
45
46Copyright (c) 2015 Enrico M. Crisostomo
47
48This program is free software; you can redistribute it and/or modify it under
49the terms of the GNU General Public License as published by the Free Software
50Foundation; either version 3, or (at your option) any later version.
51
52This program is distributed in the hope that it will be useful, but WITHOUT ANY
53WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
54PARTICULAR PURPOSE.  See the GNU General Public License for more details.
55
56You should have received a copy of the GNU General Public License along with
57this program.  If not, see <http://www.gnu.org/licenses/>.

README.windows

1README.windows
2**************
3
4Introduction
5============
6
7This file describes the steps required to build fswatch on Windows.  fswatch was
8born as a POSIX application and the Windows monitor has been developed trying to
9reduce the dependencies on the Windows API at a minimum.  To fulfill this goal,
10a dependency to Cygwin has been introduced.
11
12Windows has historically provided multiple versions of the same API for single
13byte and multibyte character sets.  We have decided to only support the
14multibyte API: the Windows monitor will thus not build on Windows system
15supporting only the single-byte APIs.  In this case, the only available monitor
16on the Windows OS will be the poll monitor.
17
18Cygwin
19======
20
21Cygwin is a required dependency and must be installed to provide the toolchain
22and the libraries required by fswatch.  The current Cygwin distribution can be
23downloaded at:
24
25    https://cygwin.com
26
27Cygwin is a modular environment and the following componentes are required to
28successfully build fswatch:
29
30  * GNU GCC C++ compiler.
31
32  * GNU Autoconf.
33
34  * GNU Automake.
35
36  * GNU Autoconf.
37
38  * GNU libtool.
39
40The following are optional:
41
42  * GNU gettext (optional)
43
44Windows SDK
45===========
46
47The Windows SDK is required to successfully build fswatch since it ships the
48headers and the libraries required to build Windows applications.  Please,
49consult your Windows documentation to get the latest SDK for your platform.
50
51GNU Build System
52================
53
54For further instruction on building the GNU Build System from scratch, please
55check the README.gnu-build-system file.
56
57Localization and gettext
58========================
59
60fswatch is localizable and locale support requires GNU gettext to be available
61at build time.
62
63Depending on gettext installation path, configure may not be able to find
64<libintl.h> or libintl.  In this case, you will need to instruct configure about
65their location:
66
67  $ CPPFLAGS="-I/path/to/include" LDFLAGS="-L/path/to/lib" ./configure
68
69If configure detects that gettext is available, you will find a message such as:
70
71  checking whether to use NLS... yes
72
73or, which is equivalent, config.h will contain the following definition:
74
75  #define ENABLE_NLS 1
76
77-----
78
79Copyright (c) 2014-2015 Enrico M. Crisostomo
80
81This program is free software; you can redistribute it and/or modify it under
82the terms of the GNU General Public License as published by the Free Software
83Foundation; either version 3, or (at your option) any later version.
84
85This program is distributed in the hope that it will be useful, but WITHOUT ANY
86WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
87PARTICULAR PURPOSE.  See the GNU General Public License for more details.
88
89You should have received a copy of the GNU General Public License along with
90this program.  If not, see <http://www.gnu.org/licenses/>.
91