Annotation of embedaddon/pimd/libite/README.md, revision 1.1
1.1 ! misho 1: -lite | Frog DNA, basically
! 2: ===========================
! 3: [![Travis Status][]][Travis]
! 4:
! 5: Libite is a lightweight library of *frog DNA*. It can be used to fill
! 6: the gaps in any dinosaur project. It holds useful functions and macros
! 7: developed by both [Finit][1] and the [OpenBSD][2] project. Most notably
! 8: the string functions: [strlcpy(3)][3], [strlcat(3)][3] and the highly
! 9: useful *BSD [sys/queue.h][4] and [sys/tree.h][7] API's.
! 10:
! 11: Libite is the frog DNA missing in GNU libc. However, -lite does not aim
! 12: to become another [GLIB][5]! One noticeable gap in GLIBC is the missing
! 13: `_SAFE` macros in tje BSD `sys/queue.h` API — highly recommended
! 14: when traversing lists to delete/free nodes.
! 15:
! 16: The code is open sourced under a mix of the [MIT/X11 license][MIT], the
! 17: [ISC license][ISC] used by OpenBSD, and [BSD licenses][BSD], all of them
! 18: are extremely liberal and can be used freely in proprietary software if
! 19: needed.
! 20:
! 21: For an introduction to why Libite happened, and how you can use it, see
! 22: [this blog post][6].
! 23:
! 24:
! 25: Using -lite
! 26: -----------
! 27:
! 28: Libite is by default installed as a library and a set of include files.
! 29: To prevent clashing with include files of the same name -lite employs a
! 30: include file namespace `lite/`, which is recommended to use in your
! 31: applications:
! 32:
! 33: #include <lite/lite.h>
! 34: #include <lite/conio.h>
! 35: #include <lite/queue.h>
! 36: #include <lite/tree.h>
! 37:
! 38: The output from the `pkg-config` tool holds no surprises:
! 39:
! 40: $ pkg-config --libs --static --cflags libite
! 41: -I/usr/local/include -L/usr/local/lib -lite @LTLIBINTL@
! 42:
! 43:
! 44: Helper Macros
! 45: -------------
! 46:
! 47: - `atonum(str)`
! 48:
! 49: Convert string to natural number, works for 32-bit non-negative
! 50: integers. Returns -1 on error. (Uses `strtonum()` internally.)
! 51:
! 52: - `blkdev(dev)`
! 53:
! 54: Create block device
! 55:
! 56: - `chardev(dev)`
! 57:
! 58: Create character device
! 59:
! 60: - `erase(path)`
! 61:
! 62: Erase file/directory with `remove()`. Errors on stderr
! 63:
! 64: - `makedir(path)`
! 65:
! 66: Create directory, like `mkdir()`. Errors on stderr
! 67:
! 68: - `makefifo(path)`
! 69:
! 70: Create a FIFO, like `mkfifo()`. Errors on stderr
! 71:
! 72: - `min(a,b)`/`max(a,b)`
! 73:
! 74: These macros take care to avoid double evaluation.
! 75:
! 76: - `touch(path)`
! 77:
! 78: Create a file, or update mtime. Errors on stderr
! 79:
! 80: - `S_ISEXEC(mode_t m)`
! 81:
! 82: Mysteriously missing from GLIBC
! 83:
! 84: - `ISCLR(word,bit)`
! 85:
! 86: Is bit in (integer) word cleared?
! 87:
! 88: - `ISSET(word,bit)`
! 89:
! 90: Is bit in (integer) word set?
! 91:
! 92: - `ISOTHER(word,bit)`
! 93:
! 94: Is any other bits, except bit, in (integer) word set?
! 95:
! 96: - `SETBIT(word,bit)`
! 97:
! 98: Set bit in (integer) word.
! 99:
! 100: - `CLRBIT(word,bit)`
! 101:
! 102: Clear bit in (integer) word.
! 103:
! 104: - `NELEMS(array)`
! 105:
! 106: Returns the number of elements in an array. From the great book, The
! 107: Practice of Programming, by Kernighan and Pike.
! 108:
! 109: - `UNUSED(var)`
! 110:
! 111: Shorter and more readable version of `var __attribute__ ((unused))`
! 112:
! 113:
! 114: Generic Functions
! 115: -----------------
! 116:
! 117: - `chomp(str)`
! 118:
! 119: Perl like chomp function, chop off last char if newline.
! 120:
! 121: - `copyfile(src, dst, len, symlink)`
! 122:
! 123: Like the shell `cp(1)` and `dd(1),` can also create symlinks.
! 124:
! 125: - `dir(dir, ext, filter, list, strip)`
! 126:
! 127: Wrapper for `scandir()` with optional filter. Returns a list of
! 128: names: files and directories that must be freed after use. See
! 129: the unit test at the bottom for an example.
! 130:
! 131: - `fcopyfile(src, dst)`
! 132:
! 133: Like `copyfile()` but uses already open `FILE *` pointers. Copies
! 134: from current file positions to current file positions until EOF.
! 135:
! 136: - `fexist(file)`
! 137:
! 138: Check for the existance of a file, returns True(1) or False(0).
! 139:
! 140: - `fisdir(path)`
! 141:
! 142: Check for the existance of a directory, returns True(1) or False(0).
! 143:
! 144: - `fmode(file)`
! 145:
! 146: Returns the `mode_t` bits of a file or directory.
! 147:
! 148: - `fsendfile(src, dst, len)`
! 149:
! 150: Copy data between file streams, very similar to `fcopyfile()`, but
! 151: `dst` is allowed to be `NULL` to be able to read and discard `len`
! 152: bytes from `src`.
! 153:
! 154: - `ifconfig(ifname, addr, mask, up)`
! 155:
! 156: Basic ifconfig like operations on an interface. Only supports IPv4
! 157: adresses. Note that mask is not CIDR notation.
! 158:
! 159: - `lfopen(file, sep)`, `lfclose(lf)`
! 160:
! 161: API for parsing UNIX style configuration files like `/etc/protocols`
! 162: and `/etc/services`.
! 163:
! 164: - `lftok(lf)`
! 165:
! 166: Read tokens, delimeted by `sep`, from file opened with `lfopen()`.
! 167:
! 168: - `lfgetkey(lf, key)`
! 169:
! 170: Find `key` in file opened with `lfopen()`, return value/argument.
! 171:
! 172: - `lfgetint(lf, key)`
! 173:
! 174: Wrapper for `lfgetkey()`, returns positive integer value to `key`,
! 175: or `-1` if `key` is not found.
! 176:
! 177: - `fgetint(file, sep, key)`
! 178:
! 179: Wrapper for `lfopen()`, `lfgetint()`, and `lfclose()`. Useful for
! 180: when only reading a single `key` from a file.
! 181:
! 182: - `makepath(dir)`
! 183:
! 184: Create all components of the specified directory.
! 185:
! 186: - `mkpath(dir, mode)`
! 187:
! 188: Like `makepath()`, but also takes a `mode_t` permission mode argument.
! 189:
! 190: - `movefile(src, dst)`
! 191:
! 192: Like `copyfile()`, but renames `src` to `dst`, or recreates symlink
! 193: with the `dst` name. On successful operation the source is removed
! 194: and the function returns POSIX OK (0).
! 195:
! 196: - `pidfile(basename)`
! 197:
! 198: Create a daemon PID file in `_PATH_VARRUN` using either `basename` or,
! 199: if `basename` is `NULL`, `__progname`. The resulting file name is
! 200: available to the user as a read-only pointer:
! 201:
! 202: extern char *__pidfile_name;
! 203:
! 204: Use this function to create a PID file for your daemon when it is
! 205: ready to receive signals. A client application may poll for the
! 206: existence of this file, so make sure to have your signal handlers
! 207: properly setup before calling this function.
! 208:
! 209: The pidfile is removed when the program exits, using an `atexit()`
! 210: handler. However, depending on how the program terminates the file
! 211: may still exist even though the program is no longer running. This
! 212: is only a problem for clients.
! 213:
! 214: Calling this function multiple times updates the mtime of the file.
! 215: Only one `atexit()` handler is created, regardless of the amount of
! 216: times the function is called.
! 217:
! 218: See below for link to OpenBSD man page.
! 219:
! 220: - `pidfile_read(pidfile)`
! 221:
! 222: Read PID from pid file created by `pidfile()`.
! 223:
! 224: - `pidfile_signal(pidfile, signal)`
! 225:
! 226: Send signal to PID found in pid file created by `pidfile()`.
! 227:
! 228: - `progress(percent, max_width)`
! 229:
! 230: Simple ASCII progress bar with a spinner. Start it with `percent=0`
! 231: and set the `max_width=chars` to indicate width of the progress bar.
! 232: Called multiple times with the same percentage value cause spinner to
! 233: spin.
! 234:
! 235: - `rsync(src, dst, delete, *filter())`
! 236:
! 237: Very simple `rsync()` to copy files files and directories
! 238: recursively.
! 239:
! 240: - `tempfile()`
! 241:
! 242: Secure replacement for `tmpfile()`. Creates an invisible temporary
! 243: file in `/tmp` that is removed when the returned `FILE` pointer is
! 244: closed.
! 245:
! 246: **Note:** Requires Linux v3.11, or later, will fall back to the old
! 247: and unsafe `tmpfile()` on older systems.
! 248:
! 249: - `tree(path, show_perms)`
! 250:
! 251: Very simple `/bin/tree` replacement. Draw ASCII tree of `path`, with
! 252: optional listing of file and directory permissions if `show_perms` is
! 253: set. The `path` argument should be a directory.
! 254:
! 255:
! 256: OpenBSD Functions
! 257: -----------------
! 258:
! 259: The following are popular OpenBSD functions and highly useful macros.
! 260:
! 261: - `pidfile(basename)`
! 262:
! 263: http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/pidfile.3
! 264:
! 265: **Note:** this version of `pidfile()` has been extended to handle it
! 266: being called multiple times, and also to export the path to the PID
! 267: file `__pidfile_name`, similar to `__progname`. See previous section
! 268: for details.
! 269:
! 270: - `strlcpy(dst, src, len)`
! 271:
! 272: http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/strlcpy.3
! 273:
! 274: - `strlcat(dst, src, len)`
! 275:
! 276: http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/strlcat.3
! 277:
! 278: - `strtonum()`
! 279:
! 280: http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/strtonum.3
! 281:
! 282: - `sys/queue.h` API
! 283:
! 284: http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/LIST_EMPTY.3
! 285:
! 286: - `sys/tree.h` API
! 287:
! 288: Niels Provos' famous splay and red-black tree implementation.
! 289:
! 290: http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/SPLAY_FOREACH.3
! 291:
! 292:
! 293: Build & Install
! 294: ---------------
! 295:
! 296: The library is built for and developed on GNU/Linux systems as a light
! 297: weight utility library. Libite (LITE) employs the de facto standard GNU
! 298: configure and build system:
! 299:
! 300: ./configure
! 301: make all
! 302: make install
! 303:
! 304:
! 305: TODO
! 306: ----
! 307:
! 308: - Improve documentation, possibly use kdoc or gdoc2 to generate docs from API.
! 309: - Continuously, update OpenBSD functions/macros.
! 310:
! 311: [1]: https://github.com/troglobit/finit
! 312: [2]: http://www.openbsd.org/
! 313: [3]: http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy
! 314: [4]: http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/LIST_EMPTY.3
! 315: [5]: https://developer.gnome.org/glib/
! 316: [6]: http://troglobit.com/blog/2015/07/02/howto-using-lite-with-a-git-based-application/
! 317: [7]: http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/SPLAY_FOREACH.3
! 318: [MIT]: https://en.wikipedia.org/wiki/MIT_License
! 319: [ISC]: https://en.wikipedia.org/wiki/ISC_license
! 320: [BSD]: https://en.wikipedia.org/wiki/BSD_licenses
! 321: [Travis]: https://travis-ci.org/troglobit/libite
! 322: [Travis Status]: https://travis-ci.org/troglobit/libite.png?branch=master
! 323:
! 324: <!--
! 325: -- Local Variables:
! 326: -- mode: markdown
! 327: -- End:
! 328: -->
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>