Annotation of libaitsess/src/sess.c, revision 1.2.2.1

1.2       misho       1: /*************************************************************************
                      2: * (C) 2008 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
                      3: *  by Michael Pounov <misho@openbsd-bg.org>
                      4: *
                      5: * $Author: misho $
1.2.2.1 ! misho       6: * $Id: sess.c,v 1.2 2011/04/30 21:35:21 misho Exp $
1.2       misho       7: *
1.2.2.1 ! 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 "aitsess.h"
                     48: 
                     49: 
                     50: /*
1.2       misho      51:  * sess_FreeValues() Free all values from value array allocated from sess_GetValues()
                     52:  * @ppsVals = Array strings
                     53:  * return: none
                     54: */
                     55: inline void sess_FreeValues(char *** __restrict ppsVals)
                     56: {
                     57:        char **ptr;
                     58: 
                     59:        for (ptr = *ppsVals; *ptr; ptr++)
                     60:                free(*ptr);
                     61:        free(*ppsVals);
                     62:        *ppsVals = NULL;
                     63: }
                     64: 
                     65: /*
                     66:  * sess_GetValues() Get all values from session shared memory
                     67:  * @s = Session item
                     68:  * @ppsVals = Return array strings
                     69:  * return: -1 error: in parameter, !=-1 count of returned strings in ppsVals (must be free after use!)
                     70: */
                     71: int sess_GetValues(tagSess * __restrict s, char ***ppsVals)
                     72: {
                     73:        register int i;
                     74:        char **valz, *Shared = NULL;
                     75:        char *peer, *p_brk;
                     76: 
                     77:        if (!s || !ppsVals)
                     78:                return -1;
                     79:        valz = malloc(sizeof(caddr_t));
                     80:        if (!valz) {
                     81:                LOGERR;
                     82:                return -1;
                     83:        } else
                     84:                *valz = NULL;
                     85: 
                     86:        // allocated memory & mirrored shared memory into this
                     87:        Shared = malloc(s->eom);
                     88:        if (!Shared) {
                     89:                LOGERR;
                     90:                free(valz);
                     91:                return -1;
                     92:        } else
                     93:                memcpy(Shared, s->addr, s->eom);
                     94: 
                     95:        for (i = 0, peer = strtok_r(Shared, MEM_DELIM"\r\n", &p_brk); peer; 
                     96:                        peer = strtok_r(NULL, MEM_DELIM"\r\n", &p_brk)) {
                     97:                if (!strchr(peer, '='))
                     98:                        continue;
                     99:                else
                    100:                        i++;
                    101: 
                    102:                valz = realloc(valz, (i + 1) * sizeof(caddr_t));
                    103:                if (!valz) {
                    104:                        LOGERR;
                    105:                        free(Shared);
                    106:                        return -1;
                    107:                } else
                    108:                        valz[i] = NULL;
                    109: 
                    110:                valz[i - 1] = strdup(peer);
                    111:        }
                    112: 
                    113:        free(Shared);
                    114:        *ppsVals = valz;
                    115:        return i;
                    116: }
                    117: 
                    118: /*
1.1       misho     119:  * sess_GetValue() Get value from session shared memory from attribute
                    120:  * @s = Session item
                    121:  * @csAttr = Attribute for search
                    122:  * @psVal = Return string buffer
                    123:  * @pnLen = Length of return string buffer, 
                    124:        // *{pnLen} input is max_size of buffer & output is really taken bytes
                    125:  * return: 0 not found, -1 error: in parameter, >0 get position, if define item merged with IS_DEF
                    126: */
                    127: int sess_GetValue(tagSess * __restrict s, const char *csAttr, char *psVal, int *pnLen)
                    128: {
                    129:        register int i;
                    130:        int def = IS_VAL;
                    131:        char *Shared = NULL;
                    132:        char *peer, *p_brk, *a_brk, *attr, *val;
                    133: 
                    134:        if (!s || !csAttr || !*csAttr)
                    135:                return -1;
                    136:        if (psVal) {
                    137:                if (pnLen && *pnLen > 0)
                    138:                        memset(psVal, 0, *pnLen);
                    139:                else
                    140:                        return -1;
                    141:        }
                    142: 
                    143:        // allocated memory & mirrored shared memory into this
                    144:        Shared = malloc(s->eom);
                    145:        if (!Shared) {
                    146:                LOGERR;
                    147:                return -1;
                    148:        } else
                    149:                memcpy(Shared, s->addr, s->eom);
                    150: 
1.2       misho     151:        for (i = 1, peer = strtok_r(Shared, MEM_DELIM"\r\n", &p_brk); peer; 
                    152:                        i++, peer = strtok_r(NULL, MEM_DELIM"\r\n", &p_brk)) {
1.1       misho     153:                attr = strtok_r(peer, "=\r\n", &a_brk);
                    154:                if (attr && !strncmp(attr, csAttr, MAX_ATTRIBUTE)) {
                    155:                        val = strtok_r(NULL, "=\r\n", &a_brk);
                    156:                        if (val && strlen(val)) {
                    157:                                if (psVal)
1.2       misho     158:                                        strlcpy(psVal, val, *pnLen);
1.1       misho     159:                                if (pnLen)
                    160:                                        *pnLen = strlen(val);
                    161:                        } else
                    162:                                def = IS_DEF;
                    163: 
                    164:                        free(Shared);
                    165:                        return i | def;
                    166:                }
                    167:        }
                    168: 
                    169:        free(Shared);
                    170:        return 0;
                    171: }
                    172: 
                    173: /*
                    174:  * sess_DelValue() Delete item from session shared memory
                    175:  * @s = Session item
                    176:  * @csAttr = Attribute for erasing
                    177:  * return: 0 Ok, -1 error: in parameter
                    178: */
                    179: int sess_DelValue(tagSess * __restrict s, const char *csAttr)
                    180: {
                    181:        register int i;
                    182:        int ret, attrlen;
                    183:        char *Buffer, *Shared, szAttr[MAX_ATTRIBUTE + 1];
                    184:        char *peer, *p_brk;
                    185: 
                    186:        if (!s || !csAttr || !*csAttr)
                    187:                return -1;
                    188:        else
                    189:                attrlen = strlen(csAttr);
                    190:        Buffer = Shared = NULL;
                    191:        memset(szAttr, 0, MAX_ATTRIBUTE + 1);
                    192:        strncpy(szAttr, csAttr, MAX_ATTRIBUTE - 1);
                    193:        strcat(szAttr, "=");
                    194: 
                    195:        Buffer = malloc(s->eom);
                    196:        if (!Buffer) {
                    197:                LOGERR;
                    198:                return -1;
                    199:        } else
                    200:                memset(Buffer, 0, s->eom);
                    201:        Shared = malloc(s->eom);
                    202:        if (!Shared) {
                    203:                LOGERR;
                    204:                free(Buffer);
                    205:                return -1;
                    206:        } else {
                    207:                DEC_SEMAPHORE(s, ret);
                    208:                memcpy(Shared, s->addr, s->eom);
                    209:        }
                    210: 
1.2       misho     211:        for (i = 1, peer = strtok_r(Shared, MEM_DELIM"\r\n", &p_brk); peer; 
                    212:                        i++, peer = strtok_r(NULL, MEM_DELIM"\r\n", &p_brk)) {
1.1       misho     213:                if (!strncmp(peer, csAttr, attrlen))
1.2       misho     214:                        if (peer[attrlen] == '=' || peer[attrlen] == *MEM_DELIM || !peer[attrlen] ||
1.1       misho     215:                                        peer[attrlen] == '\r' || peer[attrlen] == '\n')
                    216:                                continue;
                    217: 
                    218:                strcat(Buffer, peer);
1.2       misho     219:                strcat(Buffer, MEM_DELIM);
1.1       misho     220:        }
                    221: 
                    222:        memset(s->addr, 0, s->eom);
                    223:        memcpy(s->addr, Buffer, s->eom);
                    224: 
                    225:        if (s->type == SHARED_MAP)
                    226:                msync(s->addr, 0, MS_SYNC | MS_INVALIDATE);
                    227: 
                    228:        ADD_SEMAPHORE(s, ret);
                    229:        free(Shared);
                    230:        free(Buffer);
                    231:        return 0;
                    232: }
                    233: 
                    234: /*
                    235:  * sess_SetValue() Set item into session shared memory or update if find it
                    236:  * @s = Session item
                    237:  * @csAttr = Attribute
                    238:  * @psVal = Value
                    239:  * return: 0 nothing, -1 error: in parameter, 
                    240:        >0 set position, if add item merged with IS_ADD and if define item merged with IS_DEF
                    241: */
                    242: int sess_SetValue(tagSess * __restrict s, const char *csAttr, const char *psVal)
                    243: {
                    244:        register int i;
                    245:        int upd, ret, def = IS_VAL;
                    246:        char *Buffer, *Shared, szAttr[MAX_ATTRIBUTE + 1];
                    247:        char *peer, *p_brk;
                    248: 
                    249:        if (!s || !csAttr || !*csAttr)
                    250:                return -1;
                    251:        else
                    252:                Buffer = Shared = NULL;
                    253:        memset(szAttr, 0, MAX_ATTRIBUTE + 1);
                    254:        strncpy(szAttr, csAttr, MAX_ATTRIBUTE - 1);
                    255:        strcat(szAttr, "=");
                    256: 
                    257:        Buffer = malloc(s->eom);
                    258:        if (!Buffer) {
                    259:                LOGERR;
                    260:                return -1;
                    261:        } else
                    262:                memset(Buffer, 0, s->eom);
                    263:        Shared = malloc(s->eom);
                    264:        if (!Shared) {
                    265:                LOGERR;
                    266:                free(Buffer);
                    267:                return -1;
                    268:        } else {
                    269:                DEC_SEMAPHORE(s, ret);
                    270:                memcpy(Shared, s->addr, s->eom);
                    271:        }
                    272: 
1.2       misho     273:        for (i = 1, upd = 0, peer = strtok_r(Shared, MEM_DELIM"\r\n", &p_brk); peer; 
                    274:                        i++, peer = strtok_r(NULL, MEM_DELIM"\r\n", &p_brk)) {
1.1       misho     275:                if (!strncmp(peer, szAttr, strlen(szAttr))) {
                    276:                        upd++;
                    277:                        if (psVal) {
                    278:                                strcat(Buffer, szAttr);
                    279:                                strcat(Buffer, psVal);
1.2       misho     280:                                strcat(Buffer, MEM_DELIM);
1.1       misho     281:                        } else {
                    282:                                strcat(Buffer, csAttr);
1.2       misho     283:                                strcat(Buffer, MEM_DELIM);
1.1       misho     284:                                def = IS_DEF;
                    285:                        }
                    286:                        continue;
                    287:                }
                    288: 
                    289:                strcat(Buffer, peer);
1.2       misho     290:                strcat(Buffer, MEM_DELIM);
1.1       misho     291:        }
                    292: 
                    293:        if (!upd) {
                    294:                if (psVal) {
                    295:                        strcat(Buffer, szAttr);
                    296:                        strcat(Buffer, psVal);
1.2       misho     297:                        strcat(Buffer, MEM_DELIM);
1.1       misho     298:                } else {
                    299:                        strcat(Buffer, csAttr);
1.2       misho     300:                        strcat(Buffer, MEM_DELIM);
1.1       misho     301:                        def = IS_DEF;
                    302:                }
                    303:                def |= IS_ADD;
                    304:        }
                    305: 
                    306:        memset(s->addr, 0, s->eom);
                    307:        memcpy(s->addr, Buffer, s->eom);
                    308: 
                    309:        if (s->type == SHARED_MAP)
                    310:                msync(s->addr, 0, MS_SYNC | MS_INVALIDATE);
                    311: 
                    312:        ADD_SEMAPHORE(s, ret);
                    313:        free(Shared);
                    314:        free(Buffer);
                    315:        return upd | def;
                    316: }

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