X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Froutines2.c;h=b414b47315af0d21e67df9361cb1c29940cb156b;hb=1e656d277fe91b7c4f5d73eab4a0dd0b7a173145;hp=374464cbbc91c95579ad9b7f9faa3f8c9374a357;hpb=11b790da92082ff80b9060e0b1dc6678718601c8;p=citadel.git diff --git a/citadel/routines2.c b/citadel/routines2.c index 374464cbb..b414b4731 100644 --- a/citadel/routines2.c +++ b/citadel/routines2.c @@ -5,7 +5,6 @@ * */ -#include "sysdep.h" #include #include #include @@ -31,13 +30,14 @@ #include #include #include +#include +#include "sysdep.h" #include "citadel.h" #include "citadel_ipc.h" #include "citadel_decls.h" #include "routines2.h" #include "routines.h" #include "commands.h" -#include "tools.h" #include "messages.h" #ifndef HAVE_SNPRINTF #include "snprintf.h" @@ -51,7 +51,7 @@ extern char temp[]; extern char tempdir[]; -extern char *axdefs[7]; +extern char *axdefs[8]; extern long highest_msg_read; extern long maxmsgnum; extern unsigned room_flags; @@ -90,16 +90,16 @@ void entregis(CtdlIPC *ipc) { /* register with name and address */ char buf[SIZ]; - char tmpname[SIZ]; - char tmpaddr[SIZ]; - char tmpcity[SIZ]; - char tmpstate[SIZ]; - char tmpzip[SIZ]; - char tmpphone[SIZ]; + char tmpname[30]; + char tmpaddr[25]; + char tmpcity[15]; + char tmpstate[3]; + char tmpzip[11]; + char tmpphone[15]; char tmpemail[SIZ]; - char tmpcountry[SIZ]; - char diruser[SIZ]; - char dirnode[SIZ]; + char tmpcountry[32]; + char diruser[256]; + char dirnode[256]; char holdemail[SIZ]; char *reg = NULL; int ok = 0; @@ -118,27 +118,27 @@ void entregis(CtdlIPC *ipc) if (r / 100 == 1) { int a = 0; - while (reg && strlen(reg) > 0) { + while (reg && !IsEmptyStr(reg)) { - extract_token(buf, reg, 0, '\n'); + extract_token(buf, reg, 0, '\n', sizeof buf); remove_token(reg, 0, '\n'); if (a == 2) - strcpy(tmpname, buf); + safestrncpy(tmpname, buf, sizeof tmpname); else if (a == 3) - strcpy(tmpaddr, buf); + safestrncpy(tmpaddr, buf, sizeof tmpaddr); else if (a == 4) - strcpy(tmpcity, buf); + safestrncpy(tmpcity, buf, sizeof tmpcity); else if (a == 5) - strcpy(tmpstate, buf); + safestrncpy(tmpstate, buf, sizeof tmpstate); else if (a == 6) - strcpy(tmpzip, buf); + safestrncpy(tmpzip, buf, sizeof tmpzip); else if (a == 7) - strcpy(tmpphone, buf); + safestrncpy(tmpphone, buf, sizeof tmpphone); else if (a == 9) - strcpy(tmpemail, buf); + safestrncpy(tmpemail, buf, sizeof tmpemail); else if (a == 10) - strcpy(tmpcountry, buf); + safestrncpy(tmpcountry, buf, sizeof tmpcountry); ++a; } } @@ -152,16 +152,16 @@ void entregis(CtdlIPC *ipc) do { ok = 1; - strcpy(holdemail, tmpemail); + safestrncpy(holdemail, tmpemail, sizeof holdemail); strprompt("Email address", tmpemail, 31); r = CtdlIPCDirectoryLookup(ipc, tmpemail, buf); if (r / 100 == 2) { - extract_token(diruser, buf, 0, '@'); - extract_token(dirnode, buf, 1, '@'); + extract_token(diruser, buf, 0, '@', sizeof diruser); + extract_token(dirnode, buf, 1, '@', sizeof dirnode); striplt(diruser); striplt(dirnode); if ((strcasecmp(diruser, fullname)) - || (strcasecmp(dirnode, serv_info.serv_nodename))) { + || (strcasecmp(dirnode, ipc->ServInfo.nodename))) { scr_printf( "\nYou can't use %s as your address.\n", tmpemail); @@ -169,13 +169,13 @@ void entregis(CtdlIPC *ipc) "It is already in use by %s @ %s.\n", diruser, dirnode); ok = 0; - strcpy(tmpemail, holdemail); + safestrncpy(tmpemail, holdemail, sizeof tmpemail); } } } while (ok == 0); /* now send the registration info back to the server */ - reg = (char *)realloc(reg, 4096); /* Overkill? */ + reg = (char *)realloc(reg, SIZ); if (reg) { sprintf(reg, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", tmpname, tmpaddr, tmpcity, tmpstate, @@ -190,7 +190,7 @@ void entregis(CtdlIPC *ipc) void updatels(CtdlIPC *ipc) { /* make all messages old in current room */ - char buf[SIZ]; + char buf[256]; int r; /* IPC response code */ if (rc_alt_semantics) { @@ -216,7 +216,7 @@ void updatels(CtdlIPC *ipc) */ void updatelsa(CtdlIPC *ipc) { - char buf[SIZ]; + char buf[256]; int r; /* IPC response code */ r = CtdlIPCSetLastRead(ipc, highest_msg_read, buf); @@ -230,10 +230,10 @@ void updatelsa(CtdlIPC *ipc) */ void cli_upload(CtdlIPC *ipc) { - char flnm[SIZ]; + char flnm[PATH_MAX]; char desc[151]; - char buf[SIZ]; - char tbuf[SIZ]; + char buf[256]; + char tbuf[256]; int r; /* IPC response code */ int a; int fd; @@ -257,10 +257,13 @@ void cli_upload(CtdlIPC *ipc) /* basename of filename */ strcpy(tbuf, flnm); if (haschar(tbuf, '/')) - strcpy(tbuf, strrchr(tbuf, '/')); + extract_token(tbuf, flnm, + num_tokens(tbuf, '/') - 1, + '/', sizeof tbuf + ); /* filename.1, filename.2, etc */ if (a > 0) { - sprintf(buf + strlen(buf), ".%d", a); + sprintf(&tbuf[strlen(tbuf)], ".%d", a); } /* Try upload */ r = CtdlIPCFileUpload(ipc, tbuf, desc, flnm, progress, buf); @@ -269,7 +272,8 @@ void cli_upload(CtdlIPC *ipc) else break; ++a; - }; + } + if (a > 0) scr_printf("Saved as '%s'\n", tbuf); } @@ -278,8 +282,8 @@ void cli_upload(CtdlIPC *ipc) */ void cli_image_upload(CtdlIPC *ipc, char *keyname) { - char flnm[SIZ]; - char buf[SIZ]; + char flnm[PATH_MAX]; + char buf[256]; int r; /* Can we upload this image? */ @@ -304,9 +308,9 @@ void cli_image_upload(CtdlIPC *ipc, char *keyname) */ void upload(CtdlIPC *ipc, int c) { /* c = upload mode */ - char flnm[SIZ]; + char flnm[PATH_MAX]; char desc[151]; - char buf[SIZ]; + char buf[256]; char tbuf[4096]; int xfer_pid; int a, b; @@ -323,7 +327,7 @@ void upload(CtdlIPC *ipc, int c) else newprompt("Enter filename: ", flnm, 15); - for (a = 0; a < strlen(flnm); ++a) + for (a = 0; !IsEmptyStr(&flnm[a]); ++a) if ((flnm[a] == '/') || (flnm[a] == '\\') || (flnm[a] == '>') || (flnm[a] == '?') || (flnm[a] == '*') || (flnm[a] == ';') || (flnm[a] == '&')) @@ -341,7 +345,7 @@ void upload(CtdlIPC *ipc, int c) chdir(tempdir); switch (c) { case 0: - sttybbs(0); + stty_ctdl(0); scr_printf("Receiving %s - press Ctrl-D to end.\n", flnm); fp = fopen(flnm, "w"); do { @@ -358,17 +362,17 @@ void upload(CtdlIPC *ipc, int c) exit(0); case 1: screen_reset(); - sttybbs(3); + stty_ctdl(3); execlp("rx", "rx", flnm, NULL); exit(1); case 2: screen_reset(); - sttybbs(3); + stty_ctdl(3); execlp("rb", "rb", NULL); exit(1); case 3: screen_reset(); - sttybbs(3); + stty_ctdl(3); execlp("rz", "rz", NULL); exit(1); } @@ -376,7 +380,7 @@ void upload(CtdlIPC *ipc, int c) do { b = ka_wait(&a); } while ((b != xfer_pid) && (b != (-1))); - sttybbs(0); + stty_ctdl(0); screen_set(); if (a != 0) { @@ -409,8 +413,8 @@ void upload(CtdlIPC *ipc, int c) int val_user(CtdlIPC *ipc, char *user, int do_validate) { int a; - char cmd[SIZ]; - char buf[SIZ]; + char cmd[256]; + char buf[256]; char *resp = NULL; int ax = 0; char answer[2]; @@ -421,7 +425,7 @@ int val_user(CtdlIPC *ipc, char *user, int do_validate) if (r / 100 == 1) { a = 0; do { - extract_token(buf, resp, 0, '\n'); + extract_token(buf, resp, 0, '\n', sizeof buf); remove_token(resp, 0, '\n'); ++a; if (a == 1) @@ -446,7 +450,12 @@ int val_user(CtdlIPC *ipc, char *user, int do_validate) scr_printf("%s\n", buf); if (a == 11) scr_printf("%s\n", buf); - } while (strlen(resp)); + } while (!IsEmptyStr(resp)); + +/* TODODRW: discrepancy here. Parts of the code refer to axdefs[7] as the highest + * but most of it limits it to axdefs[6]. + * Webcit limits to 6 as does the code here but there are 7 in axdefs.h + */ scr_printf("Current access level: %d (%s)\n", ax, axdefs[ax]); } else { scr_printf("%s\n%s\n", user, &cmd[4]); @@ -485,8 +494,8 @@ int val_user(CtdlIPC *ipc, char *user, int do_validate) void validate(CtdlIPC *ipc) { /* validate new users */ - char cmd[SIZ]; - char buf[SIZ]; + char cmd[256]; + char buf[256]; int finished = 0; int r; /* IPC response code */ @@ -497,7 +506,7 @@ void validate(CtdlIPC *ipc) if (r / 100 == 2) scr_printf("%s\n", cmd); if (r / 100 == 3) { - extract(buf, cmd, 0); + extract_token(buf, cmd, 0, '|', sizeof buf); if (val_user(ipc, buf, 1) != 0) finished = 1; } } while (finished == 0); @@ -506,10 +515,11 @@ void validate(CtdlIPC *ipc) void subshell(void) { int a, b; + + screen_reset(); + stty_ctdl(SB_RESTORE); a = fork(); if (a == 0) { - screen_reset(); - sttybbs(SB_RESTORE); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); execlp(getenv("SHELL"), getenv("SHELL"), NULL); @@ -519,7 +529,7 @@ void subshell(void) do { b = ka_wait(NULL); } while ((a != b) && (a != (-1))); - sttybbs(0); + stty_ctdl(0); screen_set(); } @@ -529,10 +539,10 @@ void subshell(void) void deletefile(CtdlIPC *ipc) { char filename[32]; - char buf[SIZ]; + char buf[256]; newprompt("Filename: ", filename, 31); - if (strlen(filename) == 0) + if (IsEmptyStr(filename)) return; CtdlIPCDeleteFile(ipc, filename, buf); err_printf("%s\n", buf); @@ -543,10 +553,10 @@ void deletefile(CtdlIPC *ipc) */ void netsendfile(CtdlIPC *ipc) { - char filename[32], destsys[20], buf[SIZ]; + char filename[32], destsys[20], buf[256]; newprompt("Filename: ", filename, 31); - if (strlen(filename) == 0) + if (IsEmptyStr(filename)) return; newprompt("System to send to: ", destsys, 19); CtdlIPCNetSendFile(ipc, filename, destsys, buf); @@ -561,10 +571,10 @@ void movefile(CtdlIPC *ipc) { char filename[64]; char newroom[ROOMNAMELEN]; - char buf[SIZ]; + char buf[256]; newprompt("Filename: ", filename, 63); - if (strlen(filename) == 0) + if (IsEmptyStr(filename)) return; newprompt("Enter target room: ", newroom, ROOMNAMELEN - 1); CtdlIPCMoveFile(ipc, filename, newroom, buf); @@ -577,7 +587,7 @@ void movefile(CtdlIPC *ipc) */ void list_bio(CtdlIPC *ipc) { - char buf[SIZ]; + char buf[256]; char *resp = NULL; int pos = 1; int r; /* IPC response code */ @@ -587,8 +597,8 @@ void list_bio(CtdlIPC *ipc) pprintf("%s\n", buf); return; } - while (strlen(resp)) { - extract_token(buf, resp, 0, '\n'); + while (resp && !IsEmptyStr(resp)) { + extract_token(buf, resp, 0, '\n', sizeof buf); remove_token(resp, 0, '\n'); if ((pos + strlen(buf) + 5) > screenwidth) { pprintf("\n"); @@ -607,8 +617,8 @@ void list_bio(CtdlIPC *ipc) */ void read_bio(CtdlIPC *ipc) { - char who[SIZ]; - char buf[SIZ]; + char who[256]; + char buf[256]; char *resp = NULL; int r; /* IPC response code */ @@ -624,8 +634,8 @@ void read_bio(CtdlIPC *ipc) pprintf("%s\n", buf); return; } - while (strlen(resp)) { - extract_token(buf, resp, 0, '\n'); + while (!IsEmptyStr(resp)) { + extract_token(buf, resp, 0, '\n', sizeof buf); remove_token(resp, 0, '\n'); pprintf("%s\n", buf); } @@ -633,661 +643,4 @@ void read_bio(CtdlIPC *ipc) } -/* - * General system configuration command - */ -void do_system_configuration(CtdlIPC *ipc) -{ - char buf[SIZ]; - char sc[31][SIZ]; - char *resp = NULL; - struct ExpirePolicy *expirepolicy = NULL; - int a; - int logpages = 0; - int r; /* IPC response code */ - - /* Clear out the config buffers */ - memset(&sc[0][0], 0, sizeof(sc)); - - /* Fetch the current config */ - r = CtdlIPCGetSystemConfig(ipc, &resp, buf); - if (r / 100 == 1) { - a = 0; - while (strlen(resp)) { - extract_token(buf, resp, 0, '\n'); - remove_token(resp, 0, '\n'); - if (a < 31) { - strcpy(&sc[a][0], buf); - } - ++a; - } - } - if (resp) free(resp); - resp = NULL; - /* Fetch the expire policy (this will silently fail on old servers, - * resulting in "default" policy) - */ - r = CtdlIPCGetMessageExpirationPolicy(ipc, 2, &expirepolicy, buf); - - /* Identification parameters */ - - strprompt("Node name", &sc[0][0], 15); - strprompt("Fully qualified domain name", &sc[1][0], 63); - strprompt("Human readable node name", &sc[2][0], 20); - strprompt("Modem dialup number", &sc[3][0], 15); - strprompt("Geographic location of this system", &sc[12][0], 31); - strprompt("Name of system administrator", &sc[13][0], 25); - strprompt("Paginator prompt", &sc[10][0], 79); - - /* Security parameters */ - - snprintf(sc[7], sizeof sc[7], "%d", (boolprompt( - "Require registration for new users", - atoi(&sc[7][0])))); - snprintf(sc[29], sizeof sc[29], "%d", (boolprompt( - "Disable self-service user account creation", - atoi(&sc[29][0])))); - strprompt("Initial access level for new users", &sc[6][0], 1); - strprompt("Access level required to create rooms", &sc[19][0], 1); - snprintf(sc[4], sizeof sc[4], "%d", (boolprompt( - "Automatically give room aide privs to a user who creates a private room", - atoi(&sc[4][0])))); - - snprintf(sc[8], sizeof sc[8], "%d", (boolprompt( - "Automatically move problem user messages to twit room", - atoi(&sc[8][0])))); - - strprompt("Name of twit room", &sc[9][0], ROOMNAMELEN); - snprintf(sc[11], sizeof sc[11], "%d", (boolprompt( - "Restrict Internet mail to only those with that privilege", - atoi(&sc[11][0])))); - snprintf(sc[26], sizeof sc[26], "%d", (boolprompt( - "Allow Aides to Zap (forget) rooms", - atoi(&sc[26][0])))); - snprintf(sc[30], sizeof sc[30], "%d", (boolprompt( - "Allow system Aides access to user mailboxes", - atoi(&sc[30][0])))); - - if (strlen(&sc[18][0]) > 0) logpages = 1; - else logpages = 0; - logpages = boolprompt("Log all pages", logpages); - if (logpages) { - strprompt("Name of logging room", &sc[18][0], ROOMNAMELEN); - } - else { - sc[18][0] = 0; - } - - - /* Server tuning */ - - strprompt("Server connection idle timeout (in seconds)", &sc[5][0], 4); - strprompt("Maximum concurrent sessions", &sc[14][0], 4); - strprompt("Maximum message length", &sc[20][0], 20); - strprompt("Minimum number of worker threads", &sc[21][0], 3); - strprompt("Maximum number of worker threads", &sc[22][0], 3); - - /* no longer applicable ... deprecated - strprompt("Server-to-server networking password", &sc[15][0], 19); - */ - - strprompt("How often to run network jobs (in seconds)", &sc[28][0], 5); - strprompt("POP3 server port (-1 to disable)", &sc[23][0], 5); - strprompt("IMAP server port (-1 to disable)", &sc[27][0], 5); - strprompt("SMTP server port (-1 to disable)", &sc[24][0], 5); - - /* This logic flips the question around, because it's one of those - * situations where 0=yes and 1=no - */ - a = atoi(sc[25]); - a = (a ? 0 : 1); - a = boolprompt("Correct forged From: lines during authenticated SMTP", - a); - a = (a ? 0 : 1); - snprintf(sc[25], sizeof sc[25], "%d", a); - - /* Expiry settings */ - strprompt("Default user purge time (days)", &sc[16][0], 5); - strprompt("Default room purge time (days)", &sc[17][0], 5); - - /* Angels and demons dancing in my head... */ - do { - snprintf(buf, sizeof buf, "%d", expirepolicy->expire_mode); - strprompt("System default message expire policy (? for list)", - buf, 1); - if (buf[0] == '?') { - scr_printf("\n" - "1. Never automatically expire messages\n" - "2. Expire by message count\n" - "3. Expire by message age\n"); - } - } while ((buf[0] < '1') || (buf[0] > '3')); - expirepolicy->expire_mode = buf[0] - '0'; - - /* ...lunatics and monsters underneath my bed */ - if (expirepolicy->expire_mode == 2) { - snprintf(buf, sizeof buf, "%d", expirepolicy->expire_value); - strprompt("Keep how many messages online?", buf, 10); - expirepolicy->expire_value = atol(buf); - } - if (expirepolicy->expire_mode == 3) { - snprintf(buf, sizeof buf, "%d", expirepolicy->expire_value); - strprompt("Keep messages for how many days?", buf, 10); - expirepolicy->expire_value = atol(buf); - } - /* Save it */ - scr_printf("Save this configuration? "); - if (yesno()) { - r = 1; - for (a = 0; a < 31; a++) - r += 1 + strlen(sc[a]); - resp = (char *)calloc(1, r); - if (!resp) { - err_printf("Can't save config - out of memory!\n"); - logoff(ipc, 1); - } - for (a = 0; a < 31; a++) { - strcat(resp, sc[a]); - strcat(resp, "\n"); - } - r = CtdlIPCSetSystemConfig(ipc, resp, buf); - if (r / 100 != 4) { - err_printf("%s\n", buf); - } - free(resp); - r = CtdlIPCSetMessageExpirationPolicy(ipc, 2, expirepolicy, buf); - if (r / 100 != 2) { - err_printf("%s\n", buf); - } - } -} - - -/* - * support function for do_internet_configuration() - */ -void get_inet_rec_type(CtdlIPC *ipc, char *buf) { - int sel; - - keyopt(" <1> localhost (Alias for this computer)\n"); - keyopt(" <2> gateway domain (Domain for all Citadel systems)\n"); - keyopt(" <3> smart-host (Forward all outbound mail to this host)\n"); - keyopt(" <4> directory (Consult the Global Address Book)\n"); - keyopt(" <5> SpamAssassin (Address of SpamAssassin server)\n"); - keyopt(" <6> RBL (domain suffix of spam hunting RBL)\n"); - sel = intprompt("Which one", 1, 1, 6); - switch(sel) { - case 1: strcpy(buf, "localhost"); - return; - case 2: strcpy(buf, "gatewaydomain"); - return; - case 3: strcpy(buf, "smarthost"); - return; - case 4: strcpy(buf, "directory"); - return; - case 5: strcpy(buf, "spamassassin"); - return; - case 6: strcpy(buf, "rbl"); - return; - } -} - - -/* - * Internet mail configuration - */ -void do_internet_configuration(CtdlIPC *ipc) -{ - char buf[SIZ]; - char *resp = NULL; - int num_recs = 0; - char **recs = NULL; - char ch; - int badkey; - int i, j; - int quitting = 0; - int r; - - r = CtdlIPCGetSystemConfigByType(ipc, INTERNETCFG, &resp, buf); - if (r / 100 == 1) { - while (strlen(resp)) { - extract_token(buf, resp, 0, '\n'); - remove_token(resp, 0, '\n'); - ++num_recs; - if (num_recs == 1) recs = malloc(sizeof(char *)); - else recs = realloc(recs, (sizeof(char *)) * num_recs); - recs[num_recs-1] = malloc(strlen(buf) + 1); - strcpy(recs[num_recs-1], buf); - } - } - if (resp) free(resp); - - do { - scr_printf("\n"); - color(BRIGHT_WHITE); - scr_printf("### Host or domain Record type \n"); - color(DIM_WHITE); - scr_printf("--- -------------------------------------------------- --------------------\n"); - for (i=0; idd|elete|ave|uit"); - switch(ch) { - case 'a': - newprompt("Enter host name: ", - buf, 50); - striplt(buf); - if (strlen(buf) > 0) { - ++num_recs; - if (num_recs == 1) - recs = malloc(sizeof(char *)); - else recs = realloc(recs, - (sizeof(char *)) * num_recs); - strcat(buf, "|"); - get_inet_rec_type(ipc, - &buf[strlen(buf)]); - recs[num_recs-1] = strdup(buf); - } - break; - case 'd': - i = intprompt("Delete which one", - 1, 1, num_recs) - 1; - free(recs[i]); - --num_recs; - for (j=i; j 0) { - do { - e_ex_code = 0; - b = ka_wait(&e_ex_code); - } while ((b != editor_pid) && (b >= 0)); - editor_pid = (-1); - sttybbs(0); - screen_set(); - } - - if (file_checksum(filename) == cksum) { - err_printf("*** Not saving changes.\n"); - e_ex_code = 1; - } - - if (e_ex_code == 0) { /* Save changes */ - changefp = fopen(changefile, "w"); - CtdlIPC_putline(ipc, "GNET"); - CtdlIPC_getline(ipc, buf); - if (buf[0] == '1') { - while(CtdlIPC_getline(ipc, buf), strcmp(buf, "000")) { - extract(instr, buf, 0); - if (strcasecmp(instr, entrytype)) { - fprintf(changefp, "%s\n", buf); - } - } - } - tempfp = fopen(filename, "r"); - while (fgets(buf, sizeof buf, tempfp) != NULL) { - for (i=0; i 0) { - fprintf(changefp, "%s|%s\n", entrytype, buf); - } - } - fclose(tempfp); - fclose(changefp); - - /* now write it to the server... */ - CtdlIPC_putline(ipc, "SNET"); - CtdlIPC_getline(ipc, buf); - if (buf[0] == '4') { - changefp = fopen(changefile, "r"); - if (changefp != NULL) { - while (fgets(buf, sizeof buf, - changefp) != NULL) { - buf[strlen(buf) - 1] = 0; - CtdlIPC_putline(ipc, buf); - } - fclose(changefp); - } - CtdlIPC_putline(ipc, "000"); - } - } - - unlink(filename); /* Delete the temporary files */ - unlink(changefile); -} - - -/* - * IGnet node configuration - */ -void do_ignet_configuration(CtdlIPC *ipc) { - char buf[SIZ]; - int num_recs = 0; - char **recs = NULL; - char ch; - int badkey; - int i, j; - int quitting = 0; - - - snprintf(buf, sizeof buf, "CONF getsys|%s", IGNETCFG); - CtdlIPC_putline(ipc, buf); - CtdlIPC_getline(ipc, buf); - if (buf[0] == '1') while (CtdlIPC_getline(ipc, buf), strcmp(buf, "000")) { - ++num_recs; - if (num_recs == 1) recs = malloc(sizeof(char *)); - else recs = realloc(recs, (sizeof(char *)) * num_recs); - recs[num_recs-1] = malloc(SIZ); - strcpy(recs[num_recs-1], buf); - } - - do { - scr_printf("\n"); - color(BRIGHT_WHITE); - scr_printf( "### " - " Node " - " Secret " - " Host or IP " - "Port#\n"); - color(DIM_WHITE); - scr_printf( "--- " - "---------------- " - "------------------ " - "-------------------------------- " - "-----\n"); - for (i=0; idd|elete|ave|uit"); - switch(ch) { - case 'a': - ++num_recs; - if (num_recs == 1) - recs = malloc(sizeof(char *)); - else recs = realloc(recs, - (sizeof(char *)) * num_recs); - newprompt("Enter node name : ", buf, 16); - strcat(buf, "|"); - newprompt("Enter shared secret: ", - &buf[strlen(buf)], 18); - strcat(buf, "|"); - newprompt("Enter host or IP : ", - &buf[strlen(buf)], 32); - strcat(buf, "|504"); - strprompt("Enter port number : ", - &buf[strlen(buf)-3], 5); - recs[num_recs-1] = strdup(buf); - break; - case 'd': - i = intprompt("Delete which one", - 1, 1, num_recs) - 1; - free(recs[i]); - --num_recs; - for (j=i; jdd|elete|ave|uit"); - switch(ch) { - case 'a': - ++num_recs; - if (num_recs == 1) - recs = malloc(sizeof(char *)); - else recs = realloc(recs, - (sizeof(char *)) * num_recs); - newprompt("Enter user name: ", buf, 28); - strcat(buf, "|"); - newprompt("Enter room name: ", - &buf[strlen(buf)], 28); - strcat(buf, "|"); - newprompt("Enter node name: ", - &buf[strlen(buf)], 16); - strcat(buf, "|"); - recs[num_recs-1] = strdup(buf); - break; - case 'd': - i = intprompt("Delete which one", - 1, 1, num_recs) - 1; - free(recs[i]); - --num_recs; - for (j=i; j