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

1.1.1.1.2.1! misho       1: /*************************************************************************
        !             2: * (C) 2008 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
        !             3: *  by Michael Pounov <misho@openbsd-bg.org>
        !             4: *
        !             5: * $Author: misho $
        !             6: * $Id: global.h,v 1.1.1.1.2.2 2008/09/30 20:00:26 misho Exp $
        !             7: *
        !             8: *************************************************************************/
1.1       misho       9: #include "global.h"
                     10: #include "aitsess.h"
                     11: 
                     12: 
                     13: /*
                     14:  * sess_GetValue() Get value from session shared memory from attribute
                     15:  * @s = Session item
                     16:  * @csAttr = Attribute for search
                     17:  * @psVal = Return string buffer
                     18:  * @pnLen = Length of return string buffer, 
                     19:        // *{pnLen} input is max_size of buffer & output is really taken bytes
                     20:  * return: 0 not found, -1 error: in parameter, >0 get position, if define item merged with IS_DEF
                     21: */
                     22: int sess_GetValue(tagSess * __restrict s, const char *csAttr, char *psVal, int *pnLen)
                     23: {
                     24:        register int i;
                     25:        int def = IS_VAL;
                     26:        char *Shared = NULL;
                     27:        char *peer, *p_brk, *a_brk, *attr, *val;
                     28: 
                     29:        if (!s || !csAttr || !*csAttr)
                     30:                return -1;
                     31:        if (psVal) {
                     32:                if (pnLen && *pnLen > 0)
                     33:                        memset(psVal, 0, *pnLen);
                     34:                else
                     35:                        return -1;
                     36:        }
                     37: 
                     38:        // allocated memory & mirrored shared memory into this
                     39:        Shared = malloc(s->eom);
                     40:        if (!Shared) {
                     41:                LOGERR;
                     42:                return -1;
                     43:        } else
                     44:                memcpy(Shared, s->addr, s->eom);
                     45: 
                     46:        for (i = 1, peer = strtok_r(Shared, ":\r\n", &p_brk); peer; 
                     47:                        i++, peer = strtok_r(NULL, ":\r\n", &p_brk)) {
                     48:                attr = strtok_r(peer, "=\r\n", &a_brk);
                     49:                if (attr && !strncmp(attr, csAttr, MAX_ATTRIBUTE)) {
                     50:                        val = strtok_r(NULL, "=\r\n", &a_brk);
                     51:                        if (val && strlen(val)) {
                     52:                                if (psVal)
                     53:                                        strncpy(psVal, val, *pnLen);
                     54:                                if (pnLen)
                     55:                                        *pnLen = strlen(val);
                     56:                        } else
                     57:                                def = IS_DEF;
                     58: 
                     59:                        free(Shared);
                     60:                        return i | def;
                     61:                }
                     62:        }
                     63: 
                     64:        free(Shared);
                     65:        return 0;
                     66: }
                     67: 
                     68: /*
                     69:  * sess_DelValue() Delete item from session shared memory
                     70:  * @s = Session item
                     71:  * @csAttr = Attribute for erasing
                     72:  * return: 0 Ok, -1 error: in parameter
                     73: */
                     74: int sess_DelValue(tagSess * __restrict s, const char *csAttr)
                     75: {
                     76:        register int i;
                     77:        int ret, attrlen;
                     78:        char *Buffer, *Shared, szAttr[MAX_ATTRIBUTE + 1];
                     79:        char *peer, *p_brk;
                     80: 
                     81:        if (!s || !csAttr || !*csAttr)
                     82:                return -1;
                     83:        else
                     84:                attrlen = strlen(csAttr);
                     85:        Buffer = Shared = NULL;
                     86:        memset(szAttr, 0, MAX_ATTRIBUTE + 1);
                     87:        strncpy(szAttr, csAttr, MAX_ATTRIBUTE - 1);
                     88:        strcat(szAttr, "=");
                     89: 
                     90:        Buffer = malloc(s->eom);
                     91:        if (!Buffer) {
                     92:                LOGERR;
                     93:                return -1;
                     94:        } else
                     95:                memset(Buffer, 0, s->eom);
                     96:        Shared = malloc(s->eom);
                     97:        if (!Shared) {
                     98:                LOGERR;
                     99:                free(Buffer);
                    100:                return -1;
                    101:        } else {
                    102:                DEC_SEMAPHORE(s, ret);
                    103:                memcpy(Shared, s->addr, s->eom);
                    104:        }
                    105: 
                    106:        for (i = 1, peer = strtok_r(Shared, ":\r\n", &p_brk); peer; 
                    107:                        i++, peer = strtok_r(NULL, ":\r\n", &p_brk)) {
                    108:                if (!strncmp(peer, csAttr, attrlen))
                    109:                        if (peer[attrlen] == '=' || peer[attrlen] == ':' || !peer[attrlen] ||
                    110:                                        peer[attrlen] == '\r' || peer[attrlen] == '\n')
                    111:                                continue;
                    112: 
                    113:                strcat(Buffer, peer);
                    114:                strcat(Buffer, "\n");
                    115:        }
                    116: 
                    117:        memset(s->addr, 0, s->eom);
                    118:        memcpy(s->addr, Buffer, s->eom);
                    119: 
                    120:        if (s->type == SHARED_MAP)
                    121:                msync(s->addr, 0, MS_SYNC | MS_INVALIDATE);
                    122: 
                    123:        ADD_SEMAPHORE(s, ret);
                    124:        free(Shared);
                    125:        free(Buffer);
                    126:        return 0;
                    127: }
                    128: 
                    129: /*
                    130:  * sess_SetValue() Set item into session shared memory or update if find it
                    131:  * @s = Session item
                    132:  * @csAttr = Attribute
                    133:  * @psVal = Value
                    134:  * return: 0 nothing, -1 error: in parameter, 
                    135:        >0 set position, if add item merged with IS_ADD and if define item merged with IS_DEF
                    136: */
                    137: int sess_SetValue(tagSess * __restrict s, const char *csAttr, const char *psVal)
                    138: {
                    139:        register int i;
                    140:        int upd, ret, def = IS_VAL;
                    141:        char *Buffer, *Shared, szAttr[MAX_ATTRIBUTE + 1];
                    142:        char *peer, *p_brk;
                    143: 
                    144:        if (!s || !csAttr || !*csAttr)
                    145:                return -1;
                    146:        else
                    147:                Buffer = Shared = NULL;
                    148:        memset(szAttr, 0, MAX_ATTRIBUTE + 1);
                    149:        strncpy(szAttr, csAttr, MAX_ATTRIBUTE - 1);
                    150:        strcat(szAttr, "=");
                    151: 
                    152:        Buffer = malloc(s->eom);
                    153:        if (!Buffer) {
                    154:                LOGERR;
                    155:                return -1;
                    156:        } else
                    157:                memset(Buffer, 0, s->eom);
                    158:        Shared = malloc(s->eom);
                    159:        if (!Shared) {
                    160:                LOGERR;
                    161:                free(Buffer);
                    162:                return -1;
                    163:        } else {
                    164:                DEC_SEMAPHORE(s, ret);
                    165:                memcpy(Shared, s->addr, s->eom);
                    166:        }
                    167: 
                    168:        for (i = 1, upd = 0, peer = strtok_r(Shared, ":\r\n", &p_brk); peer; 
                    169:                        i++, peer = strtok_r(NULL, ":\r\n", &p_brk)) {
                    170:                if (!strncmp(peer, szAttr, strlen(szAttr))) {
                    171:                        upd++;
                    172:                        if (psVal) {
                    173:                                strcat(Buffer, szAttr);
                    174:                                strcat(Buffer, psVal);
                    175:                                strcat(Buffer, "\n");
                    176:                        } else {
                    177:                                strcat(Buffer, csAttr);
                    178:                                strcat(Buffer, "\n");
                    179:                                def = IS_DEF;
                    180:                        }
                    181:                        continue;
                    182:                }
                    183: 
                    184:                strcat(Buffer, peer);
                    185:                strcat(Buffer, "\n");
                    186:        }
                    187: 
                    188:        if (!upd) {
                    189:                if (psVal) {
                    190:                        strcat(Buffer, szAttr);
                    191:                        strcat(Buffer, psVal);
                    192:                        strcat(Buffer, "\n");
                    193:                } else {
                    194:                        strcat(Buffer, csAttr);
                    195:                        strcat(Buffer, "\n");
                    196:                        def = IS_DEF;
                    197:                }
                    198:                def |= IS_ADD;
                    199:        }
                    200: 
                    201:        memset(s->addr, 0, s->eom);
                    202:        memcpy(s->addr, Buffer, s->eom);
                    203: 
                    204:        if (s->type == SHARED_MAP)
                    205:                msync(s->addr, 0, MS_SYNC | MS_INVALIDATE);
                    206: 
                    207:        ADD_SEMAPHORE(s, ret);
                    208:        free(Shared);
                    209:        free(Buffer);
                    210:        return upd | def;
                    211: }

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