#include "ufk.h" TABLE set_table[] = { "debug", 1, "escape", 2, "line", 3, "baud", 4, "configuration", 5, "timeout", 6, "prompt", 7, "filetype", 8, "log", 9, "duplex", 10, "handshake", 11, "block_check_type", 12, "repeat_quote", 13, "retry", 14, "packet_length", 15, "padding", 16, "padchar", 17, "start_of_packet", 18, "end_of_line", 19, "quote", 20, "eight_bit_quote", 21, "incomplete", 22, "delay", 23, "warning", 24, "mapping", 25, "auto_recover", 26, "attributes", 27, "", 0 }; set() { int fpoint; fpoint = parse(params[1], set_table); /* Parse 'set' command */ if (fpoint == NULL) /* Ambiguous */ prterr(ER_AMBIGSET); else if (fpoint == ERROR) /* Unknown */ prterr(ER_UNKNWSET); else if (!synerr(3)) /* Dispatch to command if no error */ switch(fpoint) { case 1: set_debug(); break; case 2: set_escape(); break; case 3: set_line(); break; case 4: set_baud(FALSE,0); break; case 5: set_config(); break; case 6: set_timeout(); break; case 7: set_prompt(); break; case 8: set_filetype(); break; case 9: set_log(); break; case 10: set_dup(); break; case 11: set_hsh(); break; case 12: set_block_check_type(); break; case 13: set_repeat_quote(); break; case 14: set_retry(); break; case 15: set_packet_length(); break; case 16: set_padding(); break; case 17: set_padchar(); break; case 18: set_start_of_packet(); break; case 19: set_end_of_line(); break; case 20: set_quote(); break; case 21: set_eight_bit_quote(); break; case 22: set_incomplete(); break; case 23: set_delay(); break; case 24: set_warning(); break; case 25: set_mapping(); break; case 26: set_auto_recover(); break; case 27: set_attributes(); } } set_debug() { int temp; if ((temp = set_onoff(2)) != ERROR) { debug = temp; if (dbgfil != ERROR) /* Close file */ fclose(dbgfil); dbgfil = ERROR; } else if (tolower(*params[2]) == 'l') /* Open debug log file */ { if (numprm < 4) prterr(ER_FSPCREQ); else if (dbgfil != ERROR) prterr(ER_FILEOPEN); else { strcpy(dbgfname,params[3]); if ((dbgfil = fopen(params[3],"w")) == NULL) prterr(ER_OPENERR); else debug = 2; } } else synerr(0); } set_escape() { escchr = *params[2]; /* Get escape character */ } set_line() { char save_descr[20]; close_port(FALSE,TRUE); /* Make sure it's closed */ if (tolower(*params[2]) == 'r') strcpy(tty_descr,"Remote"); /* Remote connection */ else { strcpy(save_descr,tty_descr); /* Save port */ strcpy(tty_descr,params[2]); /* Setup new port */ if (!open_port(FALSE,TRUE)) /* Check the port */ { strcpy(tty_descr,save_descr); /* Restore old descriptor */ prterr(ER_INVDEV); } else { close_port(FALSE,TRUE); /* Make sure it's closed */ call_baud = TRUE; /* Make sure baudrate will be set */ } } } set_baud(startup,argv) int startup; char *argv[]; { int temp, found, *p; static int v_speed[] = { 75, 150, 300, 600, 1200, 2400, 4800, 9600, 0 }; if (!strcmp(tty_descr,"Remote")) { prterr(ER_NOREMBD); return(NULL); } p = v_speed; if (startup) temp = atoi(*argv++); /* Get speed value */ else temp = atoi(params[2]); /* Get speed value */ found = FALSE; while (*p) /* Do until end of table */ if (temp == *p++) found = TRUE; if (found) { if (!baud(tty_descr,temp)) speed = temp; /* Set new speed value */ else prterr(ER_NOBAUD); call_baud = FALSE; /* No need to call it anymore when opening line */ } else { if (startup) return(ERROR); else prterr(ER_INVBAUD); } return (NULL); } set_config() { int temp; temp = atoi(params[2]); /* Get configuration */ if ((temp < 0) || (temp > 7)) /* Check range */ prterr(ER_ILLVALUE); else { config = temp; /* Set new value */ close_port(FALSE,TRUE); } } set_timeout() { int temp; temp = atoi(params[2]); /* Get timeout value */ if ((temp <= 0) || (temp > 100)) /* Check range */ prterr(ER_ILLVALUE); else mytime = temp; /* Set new value */ } set_prompt() { if (strlen(params[2]) > 20) params[2][20] = '\0'; /* Truncate string */ strcpy(prompt, params[2]); /* Setup new prompt */ } set_filetype() { char temp; temp = tolower(*params[2]); if (temp == 'a') /* ASCII */ image = FALSE; else if (temp == 'b') /* BINARY */ image = TRUE; else synerr(0); } set_log() { if ((params[2][0] == '-') && logfileopen) { /* Close file */ fclose(lfp); logfile[0] = '\0'; /* Zap filename */ logfileopen = logging = FALSE; } else { if (logfileopen) prterr(ER_FILEOPEN); else { if (strlen(params[2]) > 80) params[2][80] = '\0'; /* Truncate string */ strcpy(logfile,params[2]); if ((lfp = fopen(logfile, "w")) == NULL) { prterr(ER_OPENERR); logfile[0] = '\0'; /* Zap filename */ logfileopen = logging = FALSE; } else { logfileopen = TRUE; setbuf(lfp,0); } } } } set_dup() { char ch; ch = tolower(*params[2]); if (ch == 'f') fulldup = TRUE; else if (ch == 'h') fulldup = FALSE; else synerr(0); } set_hsh() { char start_tmp, stop_tmp; if (!synerr(4)) /* Be sure there are enough parameters */ { start_tmp = atoi(params[2]); /* Set data start character */ stop_tmp = atoi(params[3]); /* Set data stop character */ if ((start_tmp < 0) || (start_tmp > 127) || (stop_tmp < 0) || (stop_tmp > 127)) prterr(ER_ILLVALUE); else dstart = start_tmp; dstop = stop_tmp; } } set_quote() { char c; if (check_quote(c = *params[2])) { if ((c != myeightquote) && (c != myrptquote)) myquote = c; else prterr(ER_CHRINUSE); } } set_eight_bit_quote() { char c; if (toupper(c = *params[2]) == 'N') myeightquote = 0; /* No eight bit quoting done */ else if (check_quote(c)) { if ((c != myquote) && (c != myrptquote)) myeightquote = c; else prterr(ER_CHRINUSE); } } set_repeat_quote() { char c; if (toupper(c = *params[2]) == 'N') myrptquote = 0; /* No repeat quoting done */ else if (check_quote(c)) { if ((c != myquote) && (c != myeightquote)) myrptquote = c; else prterr(ER_CHRINUSE); } } set_packet_length() { int size; size = atoi(params[2]); if ((size < 10) || (size > BIG_SIZE - 8)) prterr(ER_INVLENG); else maxpacksiz = size; } set_padding() { int ptmp; ptmp = atoi(params[2]); if (ptmp > 94) prterr(ER_VALOUTRN); else mypad = ptmp; } set_padchar() { int ptmp; sscanf(params[2], "%x", &ptmp); mypchar = ptmp; } set_retry() { maxtry = atoi(params[2]); } set_end_of_line() { int etmp; sscanf(params[2], "%x", &etmp); if (etmp == mypackstart) prterr(ER_EOLDIF); else myeol = etmp; } set_start_of_packet() { int ptmp; sscanf(params[2], "%x", &ptmp); if (ptmp == myeol) prterr(ER_STRTDIF); else mypackstart = ptmp; } set_block_check_type() { char c; c = atoi(params[2]); if ((c >= 1) && (c <= 3)) myblock_check_type = c; else prterr(ER_INVCHK); } set_incomplete() { char c; c = toupper(*params[2]); if (c == 'K') save_file = TRUE; /* Keep file */ else if (c == 'D') save_file = FALSE; /* Discard file */ else synerr(0); } set_delay() { send_delay = atoi(params[2]); } set_warning() { int temp; temp = set_onoff(2); if (temp != ERROR) warning = temp; else synerr(0); } set_mapping() { int temp; temp = set_onoff(2); if (temp != ERROR) mapping = temp; else synerr(0); } set_autorecover() { int temp; temp = set_onoff(2); if (temp != ERROR) auto_recover = temp; else synerr(0); } set_attributes() { int temp; temp = set_onoff(2); if (temp != ERROR) allowattr = temp; else synerr(0); } check_quote(qchar) char qchar; { if (((qchar >= '!') && (qchar <= '>')) || ((qchar >= '{') && (qchar <= '~')) || (qchar == '`')) return (TRUE); /* Valid character */ else { prterr(ER_INVCHAR); return (FALSE); /* Invalid character */ } } set_onoff(i) int i; { make_lower(params[i]); if (strcmp(params[i], "on") == 0) return TRUE; else if ((strcmp(params[i], "of") == 0) || (strcmp(params[i], "off") == 0)) return FALSE; else return ERROR; }