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

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

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