Annotation of libaitsync/src/tool.c, revision 1.1.1.1.2.2

1.1       misho       1: /*************************************************************************
                      2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
                      3: *  by Michael Pounov <misho@openbsd-bg.org>
                      4: *
                      5: * $Author: misho $
1.1.1.1.2.2! misho       6: * $Id: tool.c,v 1.1.1.1.2.1 2011/05/08 00:49:45 misho Exp $
1.1       misho       7: *
                      8: *************************************************************************/
                      9: #include "global.h"
                     10: #include "tool.h"
                     11: 
                     12: 
                     13: /*
                     14:  * sync_mksig() Make signature from chunk
                     15:  * @id = chunk id
                     16:  * @off = file offset
                     17:  * @buf = chunk buffer for calculate signature
                     18:  * @buflen = buffer length in bytes
                     19:  * @sc = Chunk structure for fill
                     20: */
                     21: inline void sync_mksig(int id, off_t off, u_char * __restrict buf, int buflen, sync_chunk_t * __restrict sc)
                     22: {
                     23:        MD5_CTX ctx;
                     24: 
                     25:        MD5_Init(&ctx);
                     26:        memset(sc, 0, sizeof(sync_chunk_t));
                     27:        sc->sc_magic = DLTSYNC_MAGIC;
                     28:        sc->sc_id = id;
                     29:        sc->sc_off = off;
                     30:        sc->sc_len = buflen;
                     31:        sc->sc_roll = crcAdler(buf, buflen);
                     32:        MD5_Update(&ctx, buf, buflen);
                     33:        MD5_Final(sc->sc_cksum, &ctx);
                     34: }
                     35: 
                     36: /*
                     37:  * syncWriteNum() Write to handle converted number to bigendian
                     38:  * @f = handle
                     39:  * @ulNum = number to convert
                     40:  * @nNumLen = length of number to bytes
                     41:  * return: -1 error, != -1 writed bytes to handle
                     42: */
                     43: inline int syncWriteNum(int f, u_long ulNum, int nNumLen)
                     44: {
                     45:        u_char buf[sizeof ulNum];
                     46:        register int i;
                     47: 
                     48:        if (nNumLen < 1 || nNumLen > ULONG_MAX) {
                     49:                syncSetErr(-1, "Illegal number len %d\n", nNumLen);
                     50:                return -1;
                     51:        }
                     52: 
                     53:        for (i = nNumLen - 1; i; i--) {
                     54:                buf[i] = (u_char) ulNum;
                     55:                ulNum >>= 8;
                     56:        }
                     57: 
                     58:        return write(f, buf, nNumLen);
                     59: }
1.1.1.1.2.1  misho      60: 
                     61: #ifndef HAVE_MKSTEMPS
1.1.1.1.2.2! misho      62: #define TEMPCHARS       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
        !            63: #define NUM_CHARS       (sizeof(TEMPCHARS) - 1)
        !            64: 
        !            65: int
        !            66: mkstemps(char *path, int slen)
        !            67: {
        !            68:        char *start, *cp, *ep;
        !            69:        const char *tempchars = TEMPCHARS;
        !            70:        unsigned int tries = 1;
        !            71:        size_t len;
        !            72:        int fd;
        !            73: 
        !            74:        assert(path);
        !            75:        len = strlen(path);
        !            76:        if (len == 0 || slen >= len) {
        !            77:                errno = EINVAL;
        !            78:                goto end;
        !            79:        } else
        !            80:                ep = path + len - slen;
        !            81: 
        !            82:        for (start = ep; start > path && start[-1] == 'X'; start--) {
        !            83:                if (tries < INT_MAX / NUM_CHARS)
        !            84:                        tries *= NUM_CHARS;
        !            85:        }
        !            86:        tries *= 2;
        !            87: 
        !            88:        do {
        !            89:                for (cp = start; cp != ep; cp++)
        !            90:                        *cp = tempchars[arc4random_uniform(NUM_CHARS)];
        !            91: 
        !            92:                fd = open(path, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR);
        !            93:                if (fd != -1 || errno != EEXIST)
        !            94:                        return fd;
        !            95:        } while (--tries);
        !            96: 
        !            97:        errno = EEXIST;
        !            98: end:
        !            99:        return -1;
        !           100: }
1.1.1.1.2.1  misho     101: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>