File: API.md

package info (click to toggle)
libite 2.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,188 kB
  • sloc: sh: 4,665; ansic: 4,165; makefile: 141
file content (459 lines) | stat: -rw-r--r-- 13,658 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
API Documentation
=================


Important Note
--------------

When using functions like `mkpath()`, `makepath()`, and `makefifo()`,
make sure your `umask()` is correct so you do not accidentally create
files and directories accessible to other users than intended.


Helper Macros
-------------

- `atonum(str)`

  Convert string to natural number, works for 32-bit non-negative
  integers.  Returns -1 on error.  (Uses `strtonum()` internally.)

- `blkdev(dev)`

  Create block device

- `chardev(dev)`

  Create character device

- `erase(path)`

  Erase file/directory with `remove()`.  Errors on `stderr`

- `erasef(fmt, ...)`

  Like `erase()` but takes a formatted printf-like string as argument.

- `makedir(path)`

  Create directory, like `mkdir()`.  Errors on `stderr`

- `makefifo(path)`

  Create a FIFO, like `mkfifo()`.  Errors on `stderr`

- `min(a,b)`/`max(a,b)`

  These macros take care to avoid double evaluation.

- `touch(path)`

  Create a file, or update mtime.  Errors on `stderr`

- `touchf(fmt, ...)`

  Like `touch()` but takes a formatted printf-like string as argument.

- `S_ISEXEC(mode_t m)`

  Mysteriously missing from GLIBC

- `ISCLR(word,bit)`

  Is bit in (integer) word cleared?

- `ISSET(word,bit)`

  Is bit in (integer) word set?

- `ISOTHER(word,bit)`

  Are any other bits, except bit, in (integer) word set?

- `SETBIT(word,bit)`

  Set bit in (integer) word.

- `CLRBIT(word,bit)`

  Clear bit in (integer) word.

- `NELEMS(array)`

  Returns the number of elements in an array.  From the great book, The
  Practice of Programming, by Kernighan and Pike.


Generic Functions
-----------------

- `chomp(str)`

  Perl like chomp function, chop off last char if newline.

- `copyfile(src, dst, len, opt)`

  Like the shell `cp(1)` and `dd(1),`, can also copy symlinks and
  preserve the mtime of the source file.  The opt argument can be
  a mask of:
  
  - `LITE_FOPT_COPYFILE_SYM (0x01)`
  - `LITE_FOPT_KEEP_MTIME   (0x02)`
  
  In releases prior to v2.0 the opt argument was called `symlink`.
  The APIs are 100% compatible if the value `1` was used to enable
  the symlink option.

- `dir(dir, ext, filter, list, strip)`

  Wrapper for `scandir()` with optional filter.  Returns a list of
  names: files and directories that must be freed after use.  See
  the unit test for an example, or take a look at `glob(3)`, it's
  probably what you want anyway.

- `fcopyfile(src, dst)`

  Like `copyfile()` but uses already open `FILE *` pointers.  Copies
  from current file positions to current file positions until EOF.

- `fexist(file)`

  Check for the existence of a file, returns True(1) or False(0).

- `fisdir(path)`

  Check for the existence of a directory, returns True(1) or False(0).

- `fopenf(mode, fmt, ...)` and `vfopenf(mode, fmt, ap)`

  Like `fopen()`, but takes a formatted string as argument.  This
  greatly simplifies operations that usually consist of composing a
  filename from parts into a dynamic buffer before actually opening
  the file.
  
  > **Notice:** the swapped order of `pathname` and `mode`!

- `fremove(fmt, ...)`

  Like `remove()`, but takes a formatted string as argument.  This
  greatly simplifies operations that usually consist of composing a
  filename from parts into a dynamic buffer before actually removing
  the file.

- `fsendfile(src, dst, len)`

  Copy data between file streams, very similar to `fcopyfile()`, but
  `dst` is allowed to be `NULL` to be able to read and discard `len`
  bytes from `src`.

- `ifconfig(ifname, addr, mask, up)`

  Basic ifconfig like operations on an interface.  Only supports IPv4
  addresses.  Note that mask is not CIDR notation.

- `lfopen(file, sep)`, `lfclose(lf)`

  LITE file API for parsing UNIX style configuration files like
  `/etc/protocols` and `/etc/services`.

- `lftok(lf)`

  Read tokens, delimited by `sep`, from file opened with `lfopen()`.

- `lfgetkey(lf, key)`

  Find `key` in file opened with `lfopen()`, return value/argument.

- `lfgetint(lf, key)`

  Wrapper for `lfgetkey()`, returns positive integer value to `key`,
  or `-1` if `key` is not found.

- `fgetint(file, sep, key)`

  Wrapper for `lfopen()`, `lfgetint()`, and `lfclose()`.  Useful for
  when only reading a single `key` from a file.

- `makepath(dir)`

  Create all components of the specified directory.

- `mkpath(dir, mode)`

  Like `makepath()`, but also takes a `mode_t` permission mode argument.

- `fmkpath(mode, fmt, ...)`

  Like `mkpath()`, but takes a formatted string as argument.

  > **Notice:** the swapped order of `pathname` and `mode`!

- `movefile(src, dst)`

  Like `copyfile()`, but renames `src` to `dst`, or recreates symlink
  with the `dst` name.  On successful operation the source is removed
  and the function returns POSIX OK (0).

- `pidfile(name)`

  Create a daemon PID file using either the `name` as a full path, if
  `name` starts with `/`, or in `_PATH_VARRUN` using `name` as the
  basename of the application.  If `name` is `NULL`, then `__progname`
  is used as the basename.  The resulting file name is available to the
  user as a read-only pointer:

        extern char *__pidfile_name;

  Use this function to create a PID file for your daemon when it is
  ready to receive signals.  A client application may poll for the
  existence of this file, so make sure to have your signal handlers
  properly setup before calling this function.

  The PID file is removed when the program exits, using an `atexit()`
  handler.  However, depending on how the program terminates the file
  may still exist even though the program is no longer running.

  Calling this function multiple times updates the mtime of the file.
  Only one `atexit()` handler is created, regardless of the amount of
  times the function is called.  If the file is removed, subsequent
  calls to this function will recreate the file.
  
  See below for a link to OpenBSD man page.

- `pidfile_read(pidfile)`

  Read PID from pid file created by `pidfile()`.

- `pidfile_signal(pidfile, signal)`

  Send signal to PID found in pid file created by `pidfile()`.

- `progress(percent, max_width)`

  Simple ASCII progress bar with a spinner.  Start it with `percent=0`
  and set the `max_width=chars` to indicate width of the progress bar.
  Called multiple times with the same percentage value cause spinner to
  spin.

- `rsync(src, dst, opt, *filter())`

  Very simple `rsync()` to copy files and directories recursively.  It
  supports pruning files from the destination tree that do not exist in
  the source tree and preserving the mtime of the source files.  The opt
  argument can be a mask of:
  
  - `LITE_FOPT_RSYNC_DELETE (0x01)`
  - `LITE_FOPT_KEEP_MTIME   (0x02)`
  
  In releases prior to v2.0 the argument controlling pruning was called
  `delete`, it is now called `opt`.  The APIs are 100% compatible if the
  value `1` was used.

- `runbg(cmd, delay)`

  Run a command in the background, after delay microseconds, essentially
  a background `execvp()` with a delay.  The function employs double-fork
  to prevent zombies and closes all open files, including stdio.
  
```C
    char *cmd[] = { "sh", "-c", "echo 'hej' >/tmp/foo", NULL};

    runbg(cmd, 200000); /* Create /tmp/foo after 200 millisec */
    /* Execution continues here immediately */
```

- `strmatch(str, list)`, `strnmatch(str, list, len)`

  Find matching string in an array of strings.  Returns index in array on
  match, or `-1` on error or not found.  `strnmatch()` takes an extra arg
  to compare only `len` number of characters from `str`.

- `strtrim(str)`

  Trims a string from any leading and trailing white-space, returns the
  trimmed result in the same buffer.

- `systemf(fmt, ...)`

  Like `system()`, but takes a formatted string as argument.  This
  greatly simplifies operations that usually consist of composing a
  command from parts into a dynamic buffer before calling it.

- `telnet_open(addr, port), telnet_close(ctx), telnet_expect(ctx, script, output)`

  Poor mans telnet expect in C.  Opens connection to a Telnet service;
  FTP, Telnet, similar, and run an expect-like script.

- `telnet_session(addr, port, script output)`

  Wrapper for the above three in one API.

- `tempfile()`

  Secure replacement for `tmpfile()`.  Creates an invisible temporary
  file in `/tmp` that is removed when the returned `FILE` pointer is
  closed.
  
  **Note:** Requires Linux v3.11, or later, will fall back to the old
    and unsafe `tmpfile()` on older systems.

- `truncatef(length, fmt, ...)`

  Like `truncate()`, but takes a formatted string as argument.  This
  simplifies some operations when the filename otherwise have to be
  composed from parts into a separate array before calling the real
  function.

- `which(cmd)`, `whichp(cmd)`

  C implementation of UNIX which(1).  Returns a malloc'ed string with the
  full path to `cmd` on success, otherwise `NULL`.
  
  `whichp()` is a predicate function, returns `TRUE` or `FALSE`.

  **Note:** `which("/bin/ps aux")` will return `/bin/ps`, or `TRUE`,
  provided of course `/bin/ps` exists.

- `yorn(fmt, ...)`

  Pose a question to user, appended with `(y/N)?`, returns `TRUE` for
  yes (both `y` and `Y` are handled) and `FALSE` for everything else.


Procfile Functions
------------------

These functions can be used to simplify access to data in `/proc` and
`/sys` on a Linux system.

### String Functions

- `readsnf(line, len, fmt, ...)`

  Read first line from a file composed from `fmt`, with optional args.
  At most `len` bytes from the file are stored in `line`.

  On success this function returns `line` with any trailing newlines
  `chomp()`ed off.  On error `NULL` is returned.

- `vreadsnf(line, len, fmt, ap)`

  Similar to `readsnf()` but takes a `va_list` argument instead.

- `writesf(str, mode, fmt, ...)`

  Write the string buffer `str`, with an additional newline, to a file
  composed from `fmt`, with optional args.  The file is opened with the
  given `mode`, e.g. "w+", which allows for both replacing and appending
  file content.

  The function returns POSIX OK(0) on success or -1 on failure with the
  `errno` variable set to a value from either `fopen()` or `fclose()`.

### Integer Functions

Read and write 32-bit and 64-bit signed values from/to files.

- `vreadllf(value, fmt, ap)` and `readllf(value, fmt, ...)`

  Only the first line is read.  If the line has newline that is stripped
  before calling `strtoll()` on the line.  The arguments to the latter
  function is such that it can convert also from a hexadecimal value.

  This function may fail and return -1 on opening the file, reading a
  line, or if the `strtoll()` function fails.  All of which set the
  `errno` variable.  Otherwise this function return POSIX OK(0).

- `readdf(value, fmt, ...)`

  Read a signed 32-bit value from a file composed from `fmt`, with
  optional args.  This function use `vreadllf()` with an additional
  range checking for `INT_MIN` and `INT_MAX`.  Values outside that
  cause this function to return -1 with `errno` set to `ERANGE`.

- `writedf(value, mode, fmt, ...)`

  Write a signed 32-bit `value` to a file composed from `fmt`, with
  optional args.  The file is opened with the given `mode`, e.g. "w+",
  which allows for both replacing and appending file content.

  The function returns POSIX OK(0) on success or -1 on failure with the
  `errno` variable set to a value from either `fopen()` or `fclose()`.

- `writellf(value, mode, fmt, ...)`

  Write a signed 64-bit `value` to a file composed from `fmt`, with
  optional args.  The file is opened with the given `mode`, e.g. "w+",
  which allows for both replacing and appending file content.

  The function returns POSIX OK(0) on success or -1 on failure with the
  `errno` variable set to a value from either `fopen()` or `fclose()`.


GNU Functions
-------------

The following are useful GNU functions, that do not exist on *BSD, and
some other platforms.

- `strdupa(str)`

  http://man7.org/linux/man-pages/man3/strdupa.3.html

- `strndupa(str)`

  http://man7.org/linux/man-pages/man3/strndupa.3.html

- `strnlen(str, lim)`

  http://man7.org/linux/man-pages/man3/strnlen.3.html


OpenBSD/NetBSD/FreeBSD Functions
--------------------------------

The following are popular functions and highly useful macros from the
*BSD world of UNIX that are sadly missing on Linux.

- `fparseln(fp, *len, *lineno, delim, flags)`

  http://man.openbsd.org/OpenBSD-current/man3/fparseln.3

- `pidfile(basename)`

  http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/pidfile.3

  **Note:** the version of `pidfile()` in -lite has been extended to
  handle it being called multiple times, i.e. to not create multiple
  `atexit()` handlers, and also to export a few internal paths:

	- `__pidfile_path`: prefix path, default `_PATH_VARRUN`.  Notice the
	  trailing slash requirement if you want to override it!
	- `__pidfile_name`: full path to PID file , similar to `__progname`.
	  See previous section for details.

- `reallocarray(ptr, nmemb, size)`

  http://man.openbsd.org/OpenBSD-current/man3/reallocarray.3

- `strlcpy(dst, src, len)`

  http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/strlcpy.3

- `strlcat(dst, src, len)`

  http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/strlcat.3

- `strtonum()`

  http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/strtonum.3

- `sys/queue.h` API

  http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/LIST_EMPTY.3

- `sys/tree.h` API

  Niels Provos' famous splay and red-black tree implementation.

  http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/SPLAY_FOREACH.3