Annotation of libaitsess/src/sess.c, revision 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>