1: /* Collection of frog DNA
2: *
3: * Copyright (c) 2008-2010 Claudio Matsuoka <cmatsuoka@gmail.com>
4: * Copyright (c) 2008-2016 Joachim Nilsson <troglobit@gmail.com>
5: *
6: * Permission is hereby granted, free of charge, to any person obtaining a copy
7: * of this software and associated documentation files (the "Software"), to deal
8: * in the Software without restriction, including without limitation the rights
9: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10: * copies of the Software, and to permit persons to whom the Software is
11: * furnished to do so, subject to the following conditions:
12: *
13: * The above copyright notice and this permission notice shall be included in
14: * all copies or substantial portions of the Software.
15: *
16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22: * THE SOFTWARE.
23: */
24:
25: #ifndef LITE_H_
26: #define LITE_H_
27:
28: #include <err.h>
29: #include <stdio.h>
30: #include <stdint.h> /* uint8_t, uint16_t, uint32_t, INT32_MAX, etc. */
31: #include <string.h>
32: #include <sys/stat.h>
33: #include <sys/types.h>
34: #include <sys/param.h> /* MAX(), isset(), setbit(), TRUE, FALSE, et consortes. :-) */
35: #include <unistd.h>
36:
37: typedef struct lfile lfile_t;
38:
39: char *chomp (char *str);
40:
41: int fexist (char *file);
42: int fisdir (char *file);
43: mode_t fmode (char *file);
44:
45: FILE *tempfile (void);
46: ssize_t copyfile (char *src, char *dst, int len, int sym);
47: int movefile (char *src, char *dst);
48: int fcopyfile (FILE *src, FILE *dst);
49: size_t fsendfile (FILE *src, FILE *dst, size_t len);
50:
51: int ifconfig (char *ifname, char *addr, char *mask, int up);
52:
53: lfile_t*lfopen (char *file, char *sep);
54: void lfclose (lfile_t *lf);
55: char *lftok (lfile_t *lf);
56: char *lfgetkey (lfile_t *lf, char *key);
57: int lfgetint (lfile_t *lf, char *key);
58: int fgetint (char *file, char *sep, char *key);
59:
60: int mkpath (char *dir, mode_t mode);
61: int makepath (char *dir);
62:
63: int dir (const char *dir, const char *type, int (*filter) (const char *file), char ***list, int strip);
64: int rsync (char *src, char *dst, int delete, int (*filter) (const char *file));
65:
66: int pidfile (const char *basename);
67: int pidfile_signal(const char *pidfile, int signal);
68: pid_t pidfile_read (const char *pidfile);
69: pid_t pidfile_poll (const char *pidfile);
70:
71: #ifndef strlcpy
72: size_t strlcpy (char *dst, const char *src, size_t siz);
73: #endif
74: #ifndef strlcat
75: size_t strlcat (char *dst, const char *src, size_t siz);
76: #endif
77: #ifndef strtonum
78: long long strtonum (const char *numstr, long long minval, long long maxval, const char **errstrp);
79: #endif
80:
81: int tree(char *path, int show_perms);
82:
83: #ifndef touch
84: # define touch(x) do { if (mknod((x), S_IFREG|0644, 0) && errno != EEXIST) warn("Failed creating %s", x); } while (0)
85: #endif
86: #ifndef makedir
87: # define makedir(x, p) do { if (mkdir(x, p) && errno != EEXIST) warn("Failed creating directory %s", x); } while (0)
88: #endif
89: #ifndef makefifo
90: # define makefifo(x, p) do { if (mkfifo(x, p) && errno != EEXIST) warn("Failed creating FIFO %s", x); } while (0)
91: #endif
92: #ifndef erase
93: # define erase(x) do { if (remove(x) && errno != ENOENT) warn("Failed removing %s", x); } while (0)
94: #endif
95: #ifndef chardev
96: # define chardev(x,m,maj,min) mknod((x), S_IFCHR|(m), makedev((maj),(min)))
97: #endif
98: #ifndef blkdev
99: # define blkdev(x,m,maj,min) mknod((x), S_IFBLK|(m), makedev((maj),(min)))
100: #endif
101:
102: #ifndef S_ISEXEC
103: # define S_ISEXEC(m) (((m) & S_IXUSR) == S_IXUSR)
104: #endif
105:
106: /* Unline isset(), setbit() et al, these work with integers/shorts/longwords/etc. */
107: #ifndef ISCLR
108: #define ISCLR(word,bit) ((word & (1 << (bit)) ? 0 : 1))
109: #endif
110: #ifndef ISSET
111: #define ISSET(word,bit) ((word & (1 << (bit)) ? 1 : 0))
112: #endif
113: #ifndef ISOTHER
114: #define ISOTHER(word,bit) ((word & ~(1 << (bit)) ? 1 : 0)) /* Is any other bit set? */
115: #endif
116: #ifndef SETBIT
117: #define SETBIT(word,bit) (word |= (1 << (bit)))
118: #endif
119: #ifndef CLRBIT
120: #define CLRBIT(word,bit) (word &= ~(1 << (bit)))
121: #endif
122:
123: /* From The Practice of Programming, by Kernighan and Pike */
124: #ifndef NELEMS
125: #define NELEMS(array) (sizeof(array) / sizeof(array[0]))
126: #endif
127:
128: /* Mark a function variable as unused, useful for generic callbacks */
129: #ifndef UNUSED
130: #define UNUSED(x) UNUSED_ ## x __attribute__ ((unused))
131: #endif
132:
133: /* Does directory end with a slash? */
134: static inline int fisslashdir(char *dir)
135: {
136: if (!dir)
137: return 0;
138:
139: if (strlen(dir) > 0)
140: return dir[strlen(dir) - 1] == '/';
141:
142: return 0;
143: }
144:
145: /* Convert string to natural number (0-2147483647), returns -1 on error. */
146: static inline int atonum(const char *str)
147: {
148: int val = -1;
149: const char *errstr;
150:
151: if (str) {
152: val = strtonum(str, 0, INT32_MAX, &errstr);
153: if (errstr)
154: return -1;
155: }
156:
157: return val;
158: }
159:
160: /* Validate string, non NULL and not zero length */
161: static inline int string_valid(const char *s)
162: {
163: return s && strlen(s);
164: }
165:
166: /* Relaxed comparison, e.g., sys_string_match("small", "smaller") => TRUE */
167: static inline int string_match(const char *a, const char *b)
168: {
169: size_t min = MIN(strlen(a), strlen(b));
170:
171: return !strncasecmp(a, b, min);
172: }
173:
174: /* Strict comparison, e.g., sys_string_match("small", "smaller") => FALSE */
175: static inline int string_compare (const char *a, const char *b)
176: {
177: return strlen(a) == strlen(b) && !strcmp(a, b);
178: }
179:
180: /* Strict comparison, like sys_string_compare(), but case insensitive,
181: * e.g., sys_string_match("small", "SmAlL") => TRUE
182: */
183: static inline int string_case_compare (const char *a, const char *b)
184: {
185: return strlen (a) == strlen (b) && !strcasecmp (a, b);
186: }
187:
188: #define min(a,b) \
189: ({ \
190: __typeof__ (a) _a = (a); \
191: __typeof__ (b) _b = (b); \
192: _a < _b ? _a : _b; \
193: })
194:
195: #define max(a,b) \
196: ({ \
197: __typeof__ (a) _a = (a); \
198: __typeof__ (b) _b = (b); \
199: _a > _b ? _a : _b; \
200: })
201:
202: /* Compat */
203: #define copy_filep(src,dst) fcopyfile(src,dst)
204: #define pidfile_read_pid(file) pifile_read(file)
205: #define signal_pidfile(file,signo) pidfile_signal(file,signo)
206:
207: #endif /* LITE_H_ */
208:
209: /**
210: * Local Variables:
211: * version-control: t
212: * indent-tabs-mode: t
213: * c-file-style: "linux"
214: * End:
215: */
216:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>