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

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.3! misho       6: * $Id: tool.c,v 1.1.1.1.2.2 2011/05/09 13:46:12 misho Exp $
1.1       misho       7: *
1.1.1.1.2.3! misho       8: **************************************************************************
        !             9: The ELWIX and AITNET software is distributed under the following
        !            10: terms:
        !            11: 
        !            12: All of the documentation and software included in the ELWIX and AITNET
        !            13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
        !            14: 
        !            15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
        !            16:        by Michael Pounov <misho@elwix.org>.  All rights reserved.
        !            17: 
        !            18: Redistribution and use in source and binary forms, with or without
        !            19: modification, are permitted provided that the following conditions
        !            20: are met:
        !            21: 1. Redistributions of source code must retain the above copyright
        !            22:    notice, this list of conditions and the following disclaimer.
        !            23: 2. Redistributions in binary form must reproduce the above copyright
        !            24:    notice, this list of conditions and the following disclaimer in the
        !            25:    documentation and/or other materials provided with the distribution.
        !            26: 3. All advertising materials mentioning features or use of this software
        !            27:    must display the following acknowledgement:
        !            28: This product includes software developed by Michael Pounov <misho@elwix.org>
        !            29: ELWIX - Embedded LightWeight unIX and its contributors.
        !            30: 4. Neither the name of AITNET nor the names of its contributors
        !            31:    may be used to endorse or promote products derived from this software
        !            32:    without specific prior written permission.
        !            33: 
        !            34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
        !            35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            44: SUCH DAMAGE.
        !            45: */
1.1       misho      46: #include "global.h"
                     47: #include "tool.h"
                     48: 
                     49: 
                     50: /*
                     51:  * sync_mksig() Make signature from chunk
                     52:  * @id = chunk id
                     53:  * @off = file offset
                     54:  * @buf = chunk buffer for calculate signature
                     55:  * @buflen = buffer length in bytes
                     56:  * @sc = Chunk structure for fill
                     57: */
                     58: inline void sync_mksig(int id, off_t off, u_char * __restrict buf, int buflen, sync_chunk_t * __restrict sc)
                     59: {
                     60:        MD5_CTX ctx;
                     61: 
                     62:        MD5_Init(&ctx);
                     63:        memset(sc, 0, sizeof(sync_chunk_t));
                     64:        sc->sc_magic = DLTSYNC_MAGIC;
                     65:        sc->sc_id = id;
                     66:        sc->sc_off = off;
                     67:        sc->sc_len = buflen;
                     68:        sc->sc_roll = crcAdler(buf, buflen);
                     69:        MD5_Update(&ctx, buf, buflen);
                     70:        MD5_Final(sc->sc_cksum, &ctx);
                     71: }
                     72: 
                     73: /*
                     74:  * syncWriteNum() Write to handle converted number to bigendian
                     75:  * @f = handle
                     76:  * @ulNum = number to convert
                     77:  * @nNumLen = length of number to bytes
                     78:  * return: -1 error, != -1 writed bytes to handle
                     79: */
                     80: inline int syncWriteNum(int f, u_long ulNum, int nNumLen)
                     81: {
                     82:        u_char buf[sizeof ulNum];
                     83:        register int i;
                     84: 
                     85:        if (nNumLen < 1 || nNumLen > ULONG_MAX) {
                     86:                syncSetErr(-1, "Illegal number len %d\n", nNumLen);
                     87:                return -1;
                     88:        }
                     89: 
                     90:        for (i = nNumLen - 1; i; i--) {
                     91:                buf[i] = (u_char) ulNum;
                     92:                ulNum >>= 8;
                     93:        }
                     94: 
                     95:        return write(f, buf, nNumLen);
                     96: }
1.1.1.1.2.1  misho      97: 
                     98: #ifndef HAVE_MKSTEMPS
1.1.1.1.2.2  misho      99: #define TEMPCHARS       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
                    100: #define NUM_CHARS       (sizeof(TEMPCHARS) - 1)
                    101: 
                    102: int
                    103: mkstemps(char *path, int slen)
                    104: {
                    105:        char *start, *cp, *ep;
                    106:        const char *tempchars = TEMPCHARS;
                    107:        unsigned int tries = 1;
                    108:        size_t len;
                    109:        int fd;
                    110: 
                    111:        assert(path);
                    112:        len = strlen(path);
                    113:        if (len == 0 || slen >= len) {
                    114:                errno = EINVAL;
                    115:                goto end;
                    116:        } else
                    117:                ep = path + len - slen;
                    118: 
                    119:        for (start = ep; start > path && start[-1] == 'X'; start--) {
                    120:                if (tries < INT_MAX / NUM_CHARS)
                    121:                        tries *= NUM_CHARS;
                    122:        }
                    123:        tries *= 2;
                    124: 
                    125:        do {
                    126:                for (cp = start; cp != ep; cp++)
                    127:                        *cp = tempchars[arc4random_uniform(NUM_CHARS)];
                    128: 
                    129:                fd = open(path, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR);
                    130:                if (fd != -1 || errno != EEXIST)
                    131:                        return fd;
                    132:        } while (--tries);
                    133: 
                    134:        errno = EEXIST;
                    135: end:
                    136:        return -1;
                    137: }
1.1.1.1.2.1  misho     138: #endif

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