argument checking in rig_set_conf, patch from Zhang Bo + edit

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2593 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.2.9
Stéphane Fillod, F8CFE 2009-01-25 14:25:46 +00:00
rodzic 48ea7c9263
commit 03cc4f3787
1 zmienionych plików z 150 dodań i 128 usunięć

Wyświetl plik

@ -7,13 +7,13 @@
* \file src/conf.c * \file src/conf.c
* \brief Rig configuration interface * \brief Rig configuration interface
* \author Stephane Fillod * \author Stephane Fillod
* \date 2000-2006 * \date 2000-2009
*/ */
/* /*
* Hamlib Interface - configuration interface * Hamlib Interface - configuration interface
* Copyright (c) 2000-2006 by Stephane Fillod * Copyright (c) 2000-2009 by Stephane Fillod
* *
* $Id: conf.c,v 1.17 2008-05-08 12:40:04 fillods Exp $ * $Id: conf.c,v 1.18 2009-01-25 14:25:46 fillods Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -116,135 +116,157 @@ static const struct confparams frontend_cfg_params[] = {
/* /*
* frontend_set_conf * frontend_set_conf
* assumes rig!=NULL, val!=NULL * assumes rig!=NULL, val!=NULL
* TODO: check format of val before doing atoi().
*/ */
static int frontend_set_conf(RIG *rig, token_t token, const char *val) static int frontend_set_conf(RIG *rig, token_t token, const char *val)
{ {
const struct rig_caps *caps; const struct rig_caps *caps;
struct rig_state *rs; struct rig_state *rs;
int val_i; int val_i;
caps = rig->caps; caps = rig->caps;
rs = &rig->state; rs = &rig->state;
switch(token) { switch(token) {
case TOK_PATHNAME: case TOK_PATHNAME:
strcpy(rs->rigport.pathname, val); strncpy(rs->rigport.pathname, val, FILPATHLEN-1);
break; break;
case TOK_WRITE_DELAY: case TOK_WRITE_DELAY:
rs->rigport.write_delay = atoi(val); if (1 != sscanf(val, "%d", &val_i)){
break; return -RIG_EINVAL;//value format error
case TOK_POST_WRITE_DELAY: }
rs->rigport.post_write_delay = atoi(val); rs->rigport.write_delay = val_i;
break; break;
case TOK_TIMEOUT: case TOK_POST_WRITE_DELAY:
rs->rigport.timeout = atoi(val); if (1 != sscanf(val, "%d", &val_i)){
break; return -RIG_EINVAL;//value format error
case TOK_RETRY: }
rs->rigport.retry = atoi(val); rs->rigport.post_write_delay = val_i;
break; break;
case TOK_TIMEOUT:
case TOK_SERIAL_SPEED: if (1 != sscanf(val, "%d", &val_i)){
if (rs->rigport.type.rig != RIG_PORT_SERIAL) return -RIG_EINVAL;//value format error
return -RIG_EINVAL; }
rs->rigport.parm.serial.rate = atoi(val); rs->rigport.timeout = val_i;
break; break;
case TOK_DATA_BITS: case TOK_RETRY:
if (rs->rigport.type.rig != RIG_PORT_SERIAL) if (1 != sscanf(val, "%d", &val_i)){
return -RIG_EINVAL; return -RIG_EINVAL;//value format error
rs->rigport.parm.serial.data_bits = atoi(val); }
break; rs->rigport.retry = val_i;
case TOK_STOP_BITS: break;
if (rs->rigport.type.rig != RIG_PORT_SERIAL)
return -RIG_EINVAL; case TOK_SERIAL_SPEED:
rs->rigport.parm.serial.stop_bits = atoi(val); if (rs->rigport.type.rig != RIG_PORT_SERIAL)
break; return -RIG_EINVAL;
case TOK_PARITY: if (1 != sscanf(val, "%d", &val_i)){
if (rs->rigport.type.rig != RIG_PORT_SERIAL) return -RIG_EINVAL;//value format error
return -RIG_EINVAL; }
if (!strncmp(val, "None", 8)) rs->rigport.parm.serial.rate = val_i;
rs->rigport.parm.serial.parity = RIG_PARITY_NONE; break;
else if (!strncmp(val, "Odd", 8)) case TOK_DATA_BITS:
rs->rigport.parm.serial.parity = RIG_PARITY_ODD; if (rs->rigport.type.rig != RIG_PORT_SERIAL)
else if (!strncmp(val, "Even", 8)) return -RIG_EINVAL;
rs->rigport.parm.serial.parity = RIG_PARITY_EVEN; if (1 != sscanf(val, "%d", &val_i)){
else return -RIG_EINVAL;//value format error
return -RIG_EINVAL; }
break; rs->rigport.parm.serial.data_bits = val_i;
case TOK_HANDSHAKE: break;
if (rs->rigport.type.rig != RIG_PORT_SERIAL) case TOK_STOP_BITS:
return -RIG_EINVAL; if (rs->rigport.type.rig != RIG_PORT_SERIAL)
if (!strncmp(val, "None", 8)) return -RIG_EINVAL;
rs->rigport.parm.serial.handshake = RIG_HANDSHAKE_NONE; if (1 != sscanf(val, "%d", &val_i)){
else if (!strncmp(val, "XONXOFF", 8)) return -RIG_EINVAL;//value format error
rs->rigport.parm.serial.handshake = RIG_HANDSHAKE_XONXOFF; }
else if (!strncmp(val, "Hardware", 8)) rs->rigport.parm.serial.stop_bits = val_i;
rs->rigport.parm.serial.handshake = RIG_HANDSHAKE_HARDWARE; break;
else case TOK_PARITY:
return -RIG_EINVAL; if (rs->rigport.type.rig != RIG_PORT_SERIAL)
break; return -RIG_EINVAL;
if (!strcmp(val, "None"))
case TOK_RTS_STATE: rs->rigport.parm.serial.parity = RIG_PARITY_NONE;
if (rs->rigport.type.rig != RIG_PORT_SERIAL) else if (!strcmp(val, "Odd"))
return -RIG_EINVAL; rs->rigport.parm.serial.parity = RIG_PARITY_ODD;
if (!strcmp(val, "Unset")) else if (!strcmp(val, "Even"))
rs->rigport.parm.serial.rts_state = RIG_SIGNAL_UNSET; rs->rigport.parm.serial.parity = RIG_PARITY_EVEN;
else if (!strcmp(val, "ON")) else
rs->rigport.parm.serial.rts_state = RIG_SIGNAL_ON; return -RIG_EINVAL;
else if (!strcmp(val, "OFF")) break;
rs->rigport.parm.serial.rts_state = RIG_SIGNAL_OFF; case TOK_HANDSHAKE:
else if (rs->rigport.type.rig != RIG_PORT_SERIAL)
return -RIG_EINVAL; return -RIG_EINVAL;
break; if (!strcmp(val, "None"))
rs->rigport.parm.serial.handshake = RIG_HANDSHAKE_NONE;
case TOK_DTR_STATE: else if (!strcmp(val, "XONXOFF"))
if (rs->rigport.type.rig != RIG_PORT_SERIAL) rs->rigport.parm.serial.handshake = RIG_HANDSHAKE_XONXOFF;
return -RIG_EINVAL; else if (!strcmp(val, "Hardware"))
if (!strcmp(val, "Unset")) rs->rigport.parm.serial.handshake = RIG_HANDSHAKE_HARDWARE;
rs->rigport.parm.serial.dtr_state = RIG_SIGNAL_UNSET; else
else if (!strcmp(val, "ON")) return -RIG_EINVAL;
rs->rigport.parm.serial.dtr_state = RIG_SIGNAL_ON; break;
else if (!strcmp(val, "OFF"))
rs->rigport.parm.serial.dtr_state = RIG_SIGNAL_OFF; case TOK_RTS_STATE:
else if (rs->rigport.type.rig != RIG_PORT_SERIAL)
return -RIG_EINVAL; return -RIG_EINVAL;
break; if (!strcmp(val, "Unset"))
rs->rigport.parm.serial.rts_state = RIG_SIGNAL_UNSET;
case TOK_ITU_REGION: else if (!strcmp(val, "ON"))
val_i = atoi(val); rs->rigport.parm.serial.rts_state = RIG_SIGNAL_ON;
else if (!strcmp(val, "OFF"))
rs->rigport.parm.serial.rts_state = RIG_SIGNAL_OFF;
else
return -RIG_EINVAL;
break;
case TOK_DTR_STATE:
if (rs->rigport.type.rig != RIG_PORT_SERIAL)
return -RIG_EINVAL;
if (!strcmp(val, "Unset"))
rs->rigport.parm.serial.dtr_state = RIG_SIGNAL_UNSET;
else if (!strcmp(val, "ON"))
rs->rigport.parm.serial.dtr_state = RIG_SIGNAL_ON;
else if (!strcmp(val, "OFF"))
rs->rigport.parm.serial.dtr_state = RIG_SIGNAL_OFF;
else
return -RIG_EINVAL;
break;
case TOK_ITU_REGION:
if (1 != sscanf(val, "%d", &val_i)){
return -RIG_EINVAL;//value format error
}
switch(val_i) { switch(val_i) {
case RIG_ITU_REGION1: case RIG_ITU_REGION1:
rs->itu_region = val_i; rs->itu_region = val_i;
memcpy(rs->tx_range_list, caps->tx_range_list1, memcpy(rs->tx_range_list, caps->tx_range_list1,
sizeof(struct freq_range_list)*FRQRANGESIZ); sizeof(struct freq_range_list)*FRQRANGESIZ);
memcpy(rs->rx_range_list, caps->rx_range_list1, memcpy(rs->rx_range_list, caps->rx_range_list1,
sizeof(struct freq_range_list)*FRQRANGESIZ); sizeof(struct freq_range_list)*FRQRANGESIZ);
break; break;
case RIG_ITU_REGION2: case RIG_ITU_REGION2:
case RIG_ITU_REGION3: case RIG_ITU_REGION3:
rs->itu_region = val_i; rs->itu_region = val_i;
memcpy(rs->tx_range_list, caps->tx_range_list2, memcpy(rs->tx_range_list, caps->tx_range_list2,
sizeof(struct freq_range_list)*FRQRANGESIZ); sizeof(struct freq_range_list)*FRQRANGESIZ);
memcpy(rs->rx_range_list, caps->rx_range_list2, memcpy(rs->rx_range_list, caps->rx_range_list2,
sizeof(struct freq_range_list)*FRQRANGESIZ); sizeof(struct freq_range_list)*FRQRANGESIZ);
break; break;
default: default:
return -RIG_EINVAL; return -RIG_EINVAL;
} }
break; break;
case TOK_VFO_COMP: case TOK_VFO_COMP:
rs->vfo_comp = atof(val); rs->vfo_comp = atof(val);
break; break;
case TOK_POLL_INTERVAL: case TOK_POLL_INTERVAL:
rs->poll_interval = atof(val); rs->poll_interval = atof(val);
break; break;
default: default:
return -RIG_EINVAL; return -RIG_EINVAL;
} }
return RIG_OK; return RIG_OK;
} }
/* /*