Annotation of embedaddon/pimd/libite/lite.h, revision 1.1

1.1     ! misho       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>