Merge branch 'master' into libusb-1-0

Catch up this branch to changes made in master.
libusb-1-0
Nate Bargmann 2016-02-15 08:16:48 -06:00
commit b3e6c460fe
8 zmienionych plików z 3048 dodań i 3075 usunięć

1
.gitignore vendored
Wyświetl plik

@ -6,6 +6,7 @@
*.o
*.lo
*.la
*.orig
*.swp
Makefile
Makefile.in

Wyświetl plik

@ -542,17 +542,29 @@ readability. Align closing braces with the opening block's keyword. In
function definitions put the opening brace on its own line under the
definition's parameter line.
Hamlib source code is no place for an entry into the obsfucated C contest!
A configuration file for the Artistic Style (http://astyle.sourceforge.net/)
utility can be found in the scripts directory. The settings it provides should
conform reasonably close to the Linux style guide referenced above. This file
can be copied to $HOME/.astylerc where it will be used as the default
configuration. If you already have an existing .astylerc, passing
--options=/path/to/hamlib/scripts/astylerc
will use this file as the configuration for formatting. Consider using this
utility whenever working on a given C source file in Hamlib.
Hamlib source code is no place for an entry into the obfuscated C contest!
Many of us are hobbyists and write this for fun. Easy to read and
understand logic is preferred over a clever solution. If your solution must
be written in a clever fashion, please document it well in your comments.
Any header files included from the hamlib/ directory should be enclosed
in <>:
Any header files included from the hamlib/ directory should be enclosed in <>:
#include <hamlib/rig.h> # Per GNU GCC documentation
Other included header files (backend and rig specific headers) should be
enclosed in "":
#include "yaesu.h"
Contributed code should always keep the source base in a compilable state,
@ -581,6 +593,7 @@ Hamlib should also compile with the following common compilers:
Portability issues to watch:
* C99 is probably (in 2016) a reasonable target
* little vs. big endian systems (use shifts or adhoc functions)
* 64 bit int: avoid them in API
* printf/scanf of 64bit int: use PRIll (cast value to int64_t) and SCNll
@ -672,6 +685,9 @@ big, you can send it as a compressed attachment.
8.3.1 Changelog
A ChangeLog file is no longer manually maintained. At some point it may be
automatically generated from the Git commit log for source tarballs.
Simply summarize your changes when the files are committed to Git or, if
providing patches to the mailing list, provide a summary so the uploader can
include it in the commit message which will show in the commit log (Git

Plik diff jest za duży Load Diff

Wyświetl plik

@ -83,6 +83,7 @@ int drake_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, int *d
if (retval == -RIG_ETIMEOUT)
retval = 0;
if (retval < 0)
return retval;
@ -127,7 +128,7 @@ int drake_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
* 10Hz resolution
* TODO: round nearest?
*/
freq_len = sprintf((char *) freqbuf,"F%07d" EOM, (unsigned int)freq/10);
freq_len = sprintf((char *) freqbuf, "F%07d" EOM, (unsigned int)freq / 10);
retval = drake_transaction(rig, (char *) freqbuf, freq_len, (char *) ackbuf, &ack_len);
return retval;
@ -145,14 +146,14 @@ int drake_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
double f;
char fmult;
retval = drake_transaction (rig, "RF" EOM, 3, freqbuf, &freq_len);
retval = drake_transaction(rig, "RF" EOM, 3, freqbuf, &freq_len);
if (retval != RIG_OK)
return retval;
/* RA command returns *fffff.ff*mHz<CR> */
if (freq_len != 15) {
rig_debug(RIG_DEBUG_ERR,"drake_get_freq: wrong answer %s, "
rig_debug(RIG_DEBUG_ERR, "drake_get_freq: wrong answer %s, "
"len=%d\n", freqbuf, freq_len);
return -RIG_ERJCTED;
}
@ -161,10 +162,10 @@ int drake_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
freqbuf[9] = '\0';
/* extract freq */
sscanf(freqbuf+1, "%lf", &f);
sscanf(freqbuf + 1, "%lf", &f);
f *= 1000.0;
if (fmult=='M'||fmult=='m')
if (fmult == 'M' || fmult == 'm')
f *= 1000.0;
*freq = (freq_t)f;
@ -184,23 +185,28 @@ int drake_set_vfo(RIG *rig, vfo_t vfo)
switch (vfo) {
case RIG_VFO_A : vfo_function = 'A'; break;
case RIG_VFO_B : vfo_function = 'B'; break;
case RIG_VFO_VFO: vfo_function = 'F'; break;
case RIG_VFO_MEM: vfo_function = 'C'; break;
default:
rig_debug(RIG_DEBUG_ERR,"drake_set_vfo: unsupported VFO %d\n",
rig_debug(RIG_DEBUG_ERR, "drake_set_vfo: unsupported VFO %d\n",
vfo);
return -RIG_EINVAL;
}
cmd_len = 0;
if ((vfo_function=='A')||(vfo_function=='B'))
if ((vfo_function == 'A') || (vfo_function == 'B'))
cmd_len = sprintf((char *) cmdbuf, "V%c" EOM, vfo_function);
if ((vfo_function=='F')||(vfo_function=='C'))
if ((vfo_function == 'F') || (vfo_function == 'C'))
cmd_len = sprintf((char *) cmdbuf, "%c" EOM, vfo_function);
retval = drake_transaction (rig, (char *) cmdbuf, cmd_len, (char *) ackbuf, &ack_len);
retval = drake_transaction(rig, (char *) cmdbuf, cmd_len, (char *) ackbuf, &ack_len);
return retval;
}
@ -215,26 +221,29 @@ int drake_get_vfo(RIG *rig, vfo_t *vfo)
char mdbuf[BUFSZ];
char cvfo;
retval = drake_transaction (rig, "RA" EOM, 3, mdbuf, &mdbuf_len);
retval = drake_transaction(rig, "RA" EOM, 3, mdbuf, &mdbuf_len);
if (retval != RIG_OK)
return retval;
if (mdbuf_len < 35) {
rig_debug(RIG_DEBUG_ERR,"drake_get_vfo: wrong answer %s, "
rig_debug(RIG_DEBUG_ERR, "drake_get_vfo: wrong answer %s, "
"len=%d\n", mdbuf, mdbuf_len);
return -RIG_ERJCTED;
}
if (mdbuf[0]=='*')
if (mdbuf[0] == '*')
*vfo = RIG_VFO_MEM;
else {
cvfo = (mdbuf[9] & 0x38);
switch (cvfo) {
case '0' : *vfo = RIG_VFO_B; break;
case '8' : *vfo = RIG_VFO_A; break;
default : rig_debug(RIG_DEBUG_ERR,
"drake_get_vfo: unsupported vfo %c\n", cvfo);
"drake_get_vfo: unsupported vfo %c\n", cvfo);
*vfo = RIG_VFO_VFO;
return -RIG_EINVAL;
}
@ -255,22 +264,28 @@ int drake_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
switch (mode) {
case RIG_MODE_CW: mode_sel = MD_CW; break;
case RIG_MODE_ECSSUSB:
case RIG_MODE_USB: mode_sel = MD_USB; break;
case RIG_MODE_ECSSLSB:
case RIG_MODE_LSB: mode_sel = MD_LSB; break;
case RIG_MODE_FM: mode_sel = MD_FM; break;
case RIG_MODE_AMS:
case RIG_MODE_AM: mode_sel = MD_AM; break;
case RIG_MODE_RTTY: mode_sel = MD_RTTY; break;
default:
rig_debug(RIG_DEBUG_ERR,"drake_set_mode: "
rig_debug(RIG_DEBUG_ERR, "drake_set_mode: "
"unsupported mode %d\n", mode);
return -RIG_EINVAL;
}
mdbuf_len = sprintf((char *) mdbuf, "M%c" EOM, mode_sel);
retval = drake_transaction (rig, (char *) mdbuf, mdbuf_len, (char *) ackbuf, &ack_len);
retval = drake_transaction(rig, (char *) mdbuf, mdbuf_len, (char *) ackbuf, &ack_len);
if (retval != RIG_OK)
return retval;
@ -282,25 +297,31 @@ int drake_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
switch (width) {
case 500: width_sel = '0'; break;
case 1800: width_sel = '1'; break;
case 2300: width_sel = '2'; break;
case 4000: width_sel = '4'; break;
case 6000: width_sel = '6'; break;
default:
rig_debug(RIG_DEBUG_ERR,"drake_set_mode: "
rig_debug(RIG_DEBUG_ERR, "drake_set_mode: "
"unsupported width %d\n", width);
return -RIG_EINVAL;
}
mdbuf_len = sprintf((char *) mdbuf, "W%c" EOM, width_sel);
retval = drake_transaction (rig, (char *) mdbuf, mdbuf_len, (char *) ackbuf, &ack_len);
retval = drake_transaction(rig, (char *) mdbuf, mdbuf_len, (char *) ackbuf, &ack_len);
}
if ((mode == RIG_MODE_AMS) || (mode == RIG_MODE_ECSSUSB) || (mode == RIG_MODE_ECSSLSB) ||
(mode == RIG_MODE_AM) || (mode == RIG_MODE_USB) || (mode == RIG_MODE_LSB)) {
mdbuf_len = sprintf((char *) mdbuf, "S%c" EOM,
((mode == RIG_MODE_AMS) || (mode==RIG_MODE_ECSSUSB) || (mode==RIG_MODE_ECSSLSB))
((mode == RIG_MODE_AMS) || (mode == RIG_MODE_ECSSUSB) || (mode == RIG_MODE_ECSSLSB))
? 'O' : 'F');
retval = drake_transaction (rig, (char *) mdbuf, mdbuf_len, (char *) ackbuf, &ack_len);
retval = drake_transaction(rig, (char *) mdbuf, mdbuf_len, (char *) ackbuf, &ack_len);
}
return retval;
@ -314,18 +335,18 @@ int drake_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
{
int mdbuf_len, retval;
char mdbuf[BUFSZ];
char mdbuf[BUFSZ];
char cmode;
char cwidth;
char csynch;
retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
retval = drake_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
if (retval != RIG_OK)
return retval;
if (mdbuf_len != 8) {
rig_debug(RIG_DEBUG_ERR,"drake_get_mode: wrong answer %s, "
rig_debug(RIG_DEBUG_ERR, "drake_get_mode: wrong answer %s, "
"len=%d\n", mdbuf, mdbuf_len);
return -RIG_ERJCTED;
}
@ -334,12 +355,17 @@ int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
cwidth = mdbuf[4];
csynch = mdbuf[5];
switch(cwidth & 0x37){
switch (cwidth & 0x37) {
case '0': *width = s_Hz(500); break;
case '1': *width = s_Hz(1800); break;
case '2': *width = s_Hz(2300); break;
case '3': *width = s_Hz(4000); break;
case '4': *width = s_Hz(6000); break;
default :
rig_debug(RIG_DEBUG_ERR,
"drake_get_mode: unsupported width %c\n",
@ -349,10 +375,13 @@ int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
}
if ((cwidth >= '0') && (cwidth <= '4')) {
switch(cmode & 0x33){
switch (cmode & 0x33) {
case '0': *mode = RIG_MODE_LSB; break;
case '1': *mode = RIG_MODE_RTTY; break;
case '2': *mode = RIG_MODE_FM; *width = s_Hz(12000); break;
default :
rig_debug(RIG_DEBUG_ERR,
"drake_get_mode: unsupported mode %c\n",
@ -361,10 +390,13 @@ int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
return -RIG_EINVAL;
}
} else {
switch(cmode & 0x33){
switch (cmode & 0x33) {
case '0': *mode = RIG_MODE_USB; break;
case '1': *mode = RIG_MODE_CW; break;
case '2': *mode = RIG_MODE_AM; break;
default :
rig_debug(RIG_DEBUG_ERR,
"drake_get_mode: unsupported mode %c\n",
@ -377,13 +409,12 @@ int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
if ((csynch & 0x34) == '4') {
if (*mode == RIG_MODE_AM)
*mode = RIG_MODE_AMS;
else
if (*mode == RIG_MODE_USB)
*mode = RIG_MODE_ECSSUSB;
else
if (*mode == RIG_MODE_LSB)
*mode = RIG_MODE_ECSSLSB;
else if (*mode == RIG_MODE_USB)
*mode = RIG_MODE_ECSSUSB;
else if (*mode == RIG_MODE_LSB)
*mode = RIG_MODE_ECSSLSB;
}
return RIG_OK;
}
@ -396,7 +427,7 @@ int drake_set_ant(RIG *rig, vfo_t vfo, ant_t ant)
unsigned char buf[16], ackbuf[16];
int len, ack_len, retval;
len = sprintf((char *) buf,"A%c" EOM, ant==RIG_ANT_1?'1':(ant==RIG_ANT_2?'2':'C'));
len = sprintf((char *) buf, "A%c" EOM, ant == RIG_ANT_1 ? '1' : (ant == RIG_ANT_2 ? '2' : 'C'));
retval = drake_transaction(rig, (char *) buf, len, (char *) ackbuf, &ack_len);
@ -413,23 +444,26 @@ int drake_get_ant(RIG *rig, vfo_t vfo, ant_t *ant)
char mdbuf[BUFSZ];
char cant;
retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
retval = drake_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
if (retval != RIG_OK)
return retval;
if (mdbuf_len != 8) {
rig_debug(RIG_DEBUG_ERR,"drake_get_ant: wrong answer %s, "
rig_debug(RIG_DEBUG_ERR, "drake_get_ant: wrong answer %s, "
"len=%d\n", mdbuf, mdbuf_len);
return -RIG_ERJCTED;
}
cant = mdbuf[3];
switch(cant & 0x3c){
switch (cant & 0x3c) {
case '0': *ant = RIG_ANT_1; break;
case '4': *ant = RIG_ANT_3; break;
case '8': *ant = RIG_ANT_2; break;
default :
rig_debug(RIG_DEBUG_ERR,
"drake_get_ant: unsupported antenna %c\n",
@ -455,10 +489,10 @@ int drake_set_mem(RIG *rig, vfo_t vfo, int ch)
len = sprintf(buf, "C%03d" EOM, ch);
retval = drake_transaction (rig, buf, len, ackbuf, &ack_len);
retval = drake_transaction(rig, buf, len, ackbuf, &ack_len);
if (ack_len != 2) {
rig_debug(RIG_DEBUG_ERR,"drake_set_mem: could not set channel %03d.\n", ch);
rig_debug(RIG_DEBUG_ERR, "drake_set_mem: could not set channel %03d.\n", ch);
retval = -RIG_ERJCTED;
}
@ -476,13 +510,13 @@ int drake_get_mem(RIG *rig, vfo_t vfo, int *ch)
char mdbuf[BUFSZ];
int chan;
retval = drake_transaction (rig, "RC" EOM, 3, mdbuf, &mdbuf_len);
retval = drake_transaction(rig, "RC" EOM, 3, mdbuf, &mdbuf_len);
if (retval != RIG_OK)
return retval;
if (mdbuf_len != 6) {
rig_debug(RIG_DEBUG_ERR,"drake_get_mem: wrong answer %s, "
rig_debug(RIG_DEBUG_ERR, "drake_get_mem: wrong answer %s, "
"len=%d\n", mdbuf, mdbuf_len);
return -RIG_ERJCTED;
}
@ -490,7 +524,7 @@ int drake_get_mem(RIG *rig, vfo_t vfo, int *ch)
mdbuf[4] = '\0';
/* extract channel no */
sscanf(mdbuf+1, "%03d", &chan);
sscanf(mdbuf + 1, "%03d", &chan);
*ch = chan;
priv->curr_ch = chan;
@ -514,9 +548,10 @@ int drake_set_chan(RIG *rig, const channel_t *chan)
old_chan = 0;
/* set to vfo if needed */
if (old_vfo == RIG_VFO_MEM){
if (old_vfo == RIG_VFO_MEM) {
old_chan = priv->curr_ch;
retval = drake_set_vfo(rig, RIG_VFO_VFO);
if (retval != RIG_OK)
return retval;
}
@ -537,7 +572,7 @@ int drake_set_chan(RIG *rig, const channel_t *chan)
(chan->funcs & RIG_FUNC_MN) == RIG_FUNC_MN);
mdbuf_len = sprintf(mdbuf, "PR" EOM "%03d" EOM, chan->channel_num);
retval = drake_transaction (rig, mdbuf, mdbuf_len, ackbuf, &ack_len);
retval = drake_transaction(rig, mdbuf, mdbuf_len, ackbuf, &ack_len);
if (old_vfo == RIG_VFO_MEM)
drake_set_mem(rig, RIG_VFO_CURR, old_chan);
@ -554,7 +589,7 @@ int drake_get_chan(RIG *rig, channel_t *chan)
struct drake_priv_data *priv = rig->state.priv;
vfo_t old_vfo;
int old_chan;
char mdbuf[BUFSZ],freqstr[BUFSZ];
char mdbuf[BUFSZ], freqstr[BUFSZ];
int mdbuf_len, retval;
chan->vfo = RIG_VFO_MEM;
@ -592,16 +627,18 @@ int drake_get_chan(RIG *rig, channel_t *chan)
//go to new channel
retval = drake_set_mem(rig, RIG_VFO_CURR, chan->channel_num);
if (retval != RIG_OK)
return RIG_OK;
//now decypher it
retval = drake_transaction (rig, "RA" EOM, 3, mdbuf, &mdbuf_len);
retval = drake_transaction(rig, "RA" EOM, 3, mdbuf, &mdbuf_len);
if (retval != RIG_OK)
return retval;
if (mdbuf_len < 35) {
rig_debug(RIG_DEBUG_ERR,"drake_get_channel: wrong answer %s, "
rig_debug(RIG_DEBUG_ERR, "drake_get_channel: wrong answer %s, "
"len=%d\n", mdbuf, mdbuf_len);
return -RIG_ERJCTED;
}
@ -609,10 +646,13 @@ int drake_get_chan(RIG *rig, channel_t *chan)
if ((mdbuf[5] >= '4') && (mdbuf[5] <= '?'))
chan->funcs |= RIG_FUNC_NB;
switch(mdbuf[5] & 0x33){
switch (mdbuf[5] & 0x33) {
case '0': chan->levels[rig_setting2idx(RIG_LEVEL_AGC)].i = RIG_AGC_OFF; break;
case '2': chan->levels[rig_setting2idx(RIG_LEVEL_AGC)].i = RIG_AGC_FAST; break;
case '3': chan->levels[rig_setting2idx(RIG_LEVEL_AGC)].i = RIG_AGC_SLOW; break;
default : chan->levels[rig_setting2idx(RIG_LEVEL_AGC)].i = RIG_AGC_FAST;
}
@ -622,38 +662,52 @@ int drake_get_chan(RIG *rig, channel_t *chan)
if ((mdbuf[6] & 0x3c) == '4')
chan->levels[rig_setting2idx(RIG_LEVEL_ATT)].i = 10;
if ((mdbuf[6] & 0x32) =='2')
if ((mdbuf[6] & 0x32) == '2')
chan->funcs |= RIG_FUNC_MN;
switch(mdbuf[7] & 0x3c){
switch (mdbuf[7] & 0x3c) {
case '0': chan->ant = RIG_ANT_1; break;
case '4': chan->ant = RIG_ANT_3; break;
case '8': chan->ant = RIG_ANT_2; break;
default : chan->ant = RIG_ANT_NONE;
}
switch(mdbuf[8] & 0x37){
switch (mdbuf[8] & 0x37) {
case '0': chan->width = s_Hz(500); break;
case '1': chan->width = s_Hz(1800); break;
case '2': chan->width = s_Hz(2300); break;
case '3': chan->width = s_Hz(4000); break;
case '4': chan->width = s_Hz(6000); break;
default : chan->width = RIG_PASSBAND_NORMAL;
}
if ((mdbuf[8] >= '0') && (mdbuf[8] <= '4')) {
switch(mdbuf[7] & 0x33){
switch (mdbuf[7] & 0x33) {
case '0': chan->mode = RIG_MODE_LSB; break;
case '1': chan->mode = RIG_MODE_RTTY; break;
case '2': chan->mode = RIG_MODE_FM;
chan->width = s_Hz(12000); break;
default : chan->mode = RIG_MODE_NONE;
}
} else {
switch(mdbuf[7] & 0x33){
switch (mdbuf[7] & 0x33) {
case '0': chan->mode = RIG_MODE_USB; break;
case '1': chan->mode = RIG_MODE_CW; break;
case '2': chan->mode = RIG_MODE_AM; break;
default : chan->mode = RIG_MODE_NONE;
}
}
@ -667,23 +721,27 @@ int drake_get_chan(RIG *rig, channel_t *chan)
chan->mode = RIG_MODE_ECSSLSB;
}
strncpy(freqstr,mdbuf+11,9);
strncpy(freqstr, mdbuf + 11, 9);
freqstr[9] = 0x00;
if ((mdbuf[21] == 'k') || (mdbuf[21] == 'K'))
chan->freq = strtod(freqstr,NULL) * 1000.0;
chan->freq = strtod(freqstr, NULL) * 1000.0;
if ((mdbuf[21] == 'm') || (mdbuf[21] == 'M'))
chan->freq = strtod(freqstr,NULL) * 1000000.0;
chan->freq = strtod(freqstr, NULL) * 1000000.0;
strncpy(chan->channel_desc, mdbuf+25, 7);
strncpy(chan->channel_desc, mdbuf + 25, 7);
//now put the radio back the way it was
if (old_vfo != RIG_VFO_MEM) {
retval = drake_set_vfo(rig, RIG_VFO_VFO);
if (retval != RIG_OK)
return retval;
} else {
retval = drake_set_mem(rig, RIG_VFO_CURR, old_chan);
if (retval != RIG_OK)
return retval;
}
@ -701,31 +759,37 @@ int drake_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
char buf[16], ackbuf[16];
int len, ack_len, retval;
switch(op) {
switch (op) {
case RIG_OP_UP:
len = sprintf(buf,"U");
len = sprintf(buf, "U");
break;
case RIG_OP_DOWN:
len = sprintf(buf,"D");
len = sprintf(buf, "D");
break;
case RIG_OP_CPY:
len = sprintf(buf,"A E B" EOM);
len = sprintf(buf, "A E B" EOM);
break;
case RIG_OP_TO_VFO:
/* len = sprintf(buf,"C%03d" EOM, priv->curr_ch); */
len = sprintf(buf,"F" EOM);
len = sprintf(buf, "F" EOM);
break;
case RIG_OP_MCL:
len = sprintf(buf,"EC%03d" EOM, priv->curr_ch);
len = sprintf(buf, "EC%03d" EOM, priv->curr_ch);
break;
case RIG_OP_FROM_VFO:
len = sprintf(buf,"PR" EOM "%03d" EOM, priv->curr_ch);
len = sprintf(buf, "PR" EOM "%03d" EOM, priv->curr_ch);
break;
default:
return -RIG_EINVAL;
}
retval = drake_transaction(rig, buf, len, buf[len-1]==0x0d ?ackbuf:NULL, &ack_len);
retval = drake_transaction(rig, buf, len, buf[len - 1] == 0x0d ? ackbuf : NULL, &ack_len);
return retval;
}
@ -739,17 +803,20 @@ int drake_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
char buf[16], ackbuf[16];
int len, ack_len, retval;
switch(func) {
switch (func) {
case RIG_FUNC_MN:
len = sprintf(buf,"N%c" EOM, status?'O':'F');
len = sprintf(buf, "N%c" EOM, status ? 'O' : 'F');
break;
case RIG_FUNC_LOCK:
len = sprintf(buf,"L%c" EOM, status?'O':'F');
len = sprintf(buf, "L%c" EOM, status ? 'O' : 'F');
break;
case RIG_FUNC_NB:
/* TODO: NB narrow */
len = sprintf(buf,"B%c" EOM, status?'W':'F');
len = sprintf(buf, "B%c" EOM, status ? 'W' : 'F');
break;
default:
return -RIG_EINVAL;
}
@ -766,32 +833,34 @@ int drake_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
int drake_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
{
int mdbuf_len, retval;
char mdbuf[BUFSZ];
char mc;
char mdbuf[BUFSZ];
char mc;
retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
retval = drake_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
if (retval != RIG_OK)
return retval;
if (mdbuf_len != 8) {
rig_debug(RIG_DEBUG_ERR,"drake_get_func: wrong answer %s, "
rig_debug(RIG_DEBUG_ERR, "drake_get_func: wrong answer %s, "
"len=%d\n", mdbuf, mdbuf_len);
return -RIG_ERJCTED;
}
switch(func) {
switch (func) {
case RIG_FUNC_MN:
mc = mdbuf[2];
*status = ((mc & 0x32) =='2');
*status = ((mc & 0x32) == '2');
break;
case RIG_FUNC_NB:
/* TODO: NB narrow */
mc = mdbuf[1];
*status = ((mc >= '4') && (mc <= '?'));
break;
default:
rig_debug(RIG_DEBUG_ERR,"Unsupported get func %d\n",func);
rig_debug(RIG_DEBUG_ERR, "Unsupported get func %d\n", func);
return -RIG_EINVAL;
}
@ -807,18 +876,21 @@ int drake_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
char buf[16], ackbuf[16];
int len, ack_len, retval;
switch(level) {
switch (level) {
case RIG_LEVEL_PREAMP:
len = sprintf(buf,"G%c" EOM, val.i?'+':'0');
len = sprintf(buf, "G%c" EOM, val.i ? '+' : '0');
break;
case RIG_LEVEL_ATT:
len = sprintf(buf,"G%c" EOM, val.i?'-':'0');
len = sprintf(buf, "G%c" EOM, val.i ? '-' : '0');
break;
case RIG_LEVEL_AGC:
len = sprintf(buf,"A%c" EOM,
val.i==RIG_AGC_OFF?'O':
(val.i==RIG_AGC_FAST?'F':'S'));
len = sprintf(buf, "A%c" EOM,
val.i == RIG_AGC_OFF ? 'O' :
(val.i == RIG_AGC_FAST ? 'F' : 'S'));
break;
default:
return -RIG_EINVAL;
}
@ -838,97 +910,114 @@ int drake_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
char lvlbuf[BUFSZ];
char mc;
if ((level != RIG_LEVEL_RAWSTR)&&(level != RIG_LEVEL_STRENGTH)) {
retval = drake_transaction (rig, "RM" EOM, 3, lvlbuf, &lvl_len);
if ((level != RIG_LEVEL_RAWSTR) && (level != RIG_LEVEL_STRENGTH)) {
retval = drake_transaction(rig, "RM" EOM, 3, lvlbuf, &lvl_len);
if (retval != RIG_OK)
return retval;
if (lvl_len != 8) {
rig_debug(RIG_DEBUG_ERR,"drake_get_level: wrong answer %s, "
rig_debug(RIG_DEBUG_ERR, "drake_get_level: wrong answer %s, "
"len=%d\n", lvlbuf, lvl_len);
return -RIG_ERJCTED;
}
}
switch(level) {
switch (level) {
case RIG_LEVEL_RAWSTR:
retval = drake_transaction (rig, "RSS" EOM, 4, lvlbuf, &lvl_len);
retval = drake_transaction(rig, "RSS" EOM, 4, lvlbuf, &lvl_len);
if (retval != RIG_OK)
return retval;
if (lvl_len != 5) {
rig_debug(RIG_DEBUG_ERR,"drake_get_level: wrong answer"
rig_debug(RIG_DEBUG_ERR, "drake_get_level: wrong answer"
"len=%d\n", lvl_len);
return -RIG_ERJCTED;
}
lvlbuf[3] = '\0';
val->i = strtol(lvlbuf+1, (char **)NULL, 16);
val->i = strtol(lvlbuf + 1, (char **)NULL, 16);
break;
case RIG_LEVEL_STRENGTH:
retval = drake_transaction (rig, "RSS" EOM, 4, lvlbuf, &lvl_len);
retval = drake_transaction(rig, "RSS" EOM, 4, lvlbuf, &lvl_len);
if (retval != RIG_OK)
return retval;
if (lvl_len != 5) {
rig_debug(RIG_DEBUG_ERR,"drake_get_level: wrong answer"
rig_debug(RIG_DEBUG_ERR, "drake_get_level: wrong answer"
"len=%d\n", lvl_len);
return -RIG_ERJCTED;
}
lvlbuf[3] = '\0';
ss = strtol(lvlbuf+1, (char **)NULL, 16);
val->i = (int)rig_raw2val(ss,&rig->caps->str_cal);
ss = strtol(lvlbuf + 1, (char **)NULL, 16);
val->i = (int)rig_raw2val(ss, &rig->caps->str_cal);
break;
case RIG_LEVEL_PREAMP:
mc = lvlbuf[2];
if ((mc & 0x3c) == '8')
val->i = 10;
else
val->i = 0;
break;
case RIG_LEVEL_ATT:
mc = lvlbuf[2];
if ((mc & 0x3c) =='4')
if ((mc & 0x3c) == '4')
val->i = 10;
else
val->i = 0;
break;
case RIG_LEVEL_AGC:
mc = lvlbuf[1];
switch(mc & 0x33){
switch (mc & 0x33) {
case '0': val->i = RIG_AGC_OFF; break;
case '2': val->i = RIG_AGC_FAST; break;
case '3': val->i = RIG_AGC_SLOW; break;
default : val->i = RIG_AGC_FAST;
}
break;
default:
rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d\n",level);
rig_debug(RIG_DEBUG_ERR, "Unsupported get_level %d\n", level);
return -RIG_EINVAL;
}
return RIG_OK;
}
int drake_set_powerstat (RIG * rig, powerstat_t status)
int drake_set_powerstat(RIG *rig, powerstat_t status)
{
char buf[16], ackbuf[16];
int len, ack_len, retval;
len = sprintf(buf,"P%c" EOM, status==RIG_POWER_OFF?'F':'O');
len = sprintf(buf, "P%c" EOM, status == RIG_POWER_OFF ? 'F' : 'O');
retval = drake_transaction(rig, buf, len, ackbuf, &ack_len);
return retval;
}
int drake_get_powerstat (RIG * rig, powerstat_t *status)
int drake_get_powerstat(RIG *rig, powerstat_t *status)
{
int mdlen, retval;
char mdbuf[BUFSZ];
char mdbuf[BUFSZ];
retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdlen);
retval = drake_transaction(rig, "RM" EOM, 3, mdbuf, &mdlen);
if (retval != RIG_OK)
return retval;
@ -1010,11 +1099,14 @@ DECLARE_PROBERIG_BACKEND(drake)
if (!strcmp(idbuf, "R8B")) {
if (cfunc)
(*cfunc)(port, RIG_MODEL_DKR8B, data);
return RIG_MODEL_DKR8B;
}
if (!strcmp(idbuf, "R8A")) { /* TBC */
if (cfunc)
(*cfunc)(port, RIG_MODEL_DKR8A, data);
return RIG_MODEL_DKR8A;
}
@ -1022,7 +1114,7 @@ DECLARE_PROBERIG_BACKEND(drake)
* not found...
*/
if (memcmp(idbuf, "ID" EOM, 3)) /* catch loopback serial */
rig_debug(RIG_DEBUG_VERBOSE,"probe_drake: found unknown device "
rig_debug(RIG_DEBUG_VERBOSE, "probe_drake: found unknown device "
"with ID '%s', please report to Hamlib "
"developers.\n", idbuf);

Plik diff jest za duży Load Diff

32
scripts/astylerc 100644
Wyświetl plik

@ -0,0 +1,32 @@
# astylerc--custom options for astyle
# Intended to follow the Linux style guide as closely as possible:
# https://www.kernel.org/doc/Documentation/CodingStyle
# Linux kernel style formatting/indenting.
style=linux
# Use tabs with a width of 8 spaces.
indent=force-tab=8
# Pad empty lines around header blocks (e.g. 'if', 'for', 'while'...).
break-blocks
# Remove extra space padding around parenthesis on the inside and outside.
unpad-paren
# Insert space padding around operators.
pad-oper
# Insert space padding after paren headers only (e.g. 'if', 'for', 'while'...).
pad-header
# Attach a pointer operator (*) to name (name) and reference operator (&)
# to type (type).
align-pointer=name
align-reference=type
# Don't break one-line blocks.
keep-one-line-blocks
# Don't break complex statements and multiple statements residing on a single line.
keep-one-line-statements

Wyświetl plik

@ -76,15 +76,14 @@
* TODO: add an option to read from a file
*/
#define SHORT_OPTIONS "m:r:p:d:P:D:s:c:T:t:C:lLuovhV"
static struct option long_options[] =
{
static struct option long_options[] = {
{"model", 1, 0, 'm'},
{"rig-file", 1, 0, 'r'},
{"ptt-file", 1, 0, 'p'},
{"dcd-file", 1, 0, 'd'},
{"ptt-type", 1, 0, 'P'},
{"dcd-type", 1, 0, 'D'},
{"serial-speed",1, 0, 's'},
{"serial-speed", 1, 0, 's'},
{"civaddr", 1, 0, 'c'},
{"listen-addr", 1, 0, 'T'},
{"port", 1, 0, 't'},
@ -106,7 +105,7 @@ struct handle_data {
socklen_t clilen;
};
void * handle_socket(void * arg);
void *handle_socket(void *arg);
void usage(void);
int interactive = 1; /* no cmd because of daemon */
@ -120,7 +119,7 @@ const char *src_addr = NULL; /* INADDR_ANY */
#define MAXCONFLEN 128
static void handle_error (enum rig_debug_level_e lvl, const char *msg)
static void handle_error(enum rig_debug_level_e lvl, const char *msg)
{
int e;
#ifdef __MINGW32__
@ -128,6 +127,7 @@ static void handle_error (enum rig_debug_level_e lvl, const char *msg)
lpMsgBuf = (LPVOID)"Unknown error";
e = WSAGetLastError();
if (FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
@ -136,18 +136,19 @@ static void handle_error (enum rig_debug_level_e lvl, const char *msg)
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
// Default language
(LPTSTR)&lpMsgBuf, 0, NULL)) {
rig_debug (lvl, "%s: Network error %d: %s\n", msg, e, lpMsgBuf);
rig_debug(lvl, "%s: Network error %d: %s\n", msg, e, lpMsgBuf);
LocalFree(lpMsgBuf);
} else {
rig_debug (lvl, "%s: Network error %d\n", msg, e);
rig_debug(lvl, "%s: Network error %d\n", msg, e);
}
#else
e = errno;
rig_debug (lvl, "%s: Network error %d: %s\n", msg, e, strerror (e));
rig_debug(lvl, "%s: Network error %d: %s\n", msg, e, strerror(e));
#endif
}
int main (int argc, char *argv[])
int main(int argc, char *argv[])
{
RIG *my_rig; /* handle to rig (instance) */
rig_model_t my_model = RIG_MODEL_DUMMY;
@ -157,7 +158,7 @@ int main (int argc, char *argv[])
int verbose = 0;
int show_conf = 0;
int dump_caps_opt = 0;
const char *rig_file=NULL, *ptt_file=NULL, *dcd_file=NULL;
const char *rig_file = NULL, *ptt_file = NULL, *dcd_file = NULL;
ptt_type_t ptt_type = RIG_PTT_NONE;
dcd_type_t dcd_type = RIG_DCD_NONE;
int serial_rate = 0;
@ -175,51 +176,63 @@ int main (int argc, char *argv[])
int c;
int option_index = 0;
c = getopt_long (argc, argv, SHORT_OPTIONS,
long_options, &option_index);
c = getopt_long(argc, argv, SHORT_OPTIONS,
long_options, &option_index);
if (c == -1)
break;
switch(c) {
switch (c) {
case 'h':
usage();
exit(0);
case 'V':
version();
exit(0);
case 'm':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
my_model = atoi(optarg);
break;
case 'r':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
rig_file = optarg;
break;
case 'p':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
ptt_file = optarg;
break;
case 'd':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
dcd_file = optarg;
break;
case 'P':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
if (!strcmp(optarg, "RIG"))
ptt_type = RIG_PTT_RIG;
else if (!strcmp(optarg, "DTR"))
@ -234,12 +247,15 @@ int main (int argc, char *argv[])
ptt_type = RIG_PTT_NONE;
else
ptt_type = atoi(optarg);
break;
case 'D':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
if (!strcmp(optarg, "RIG"))
dcd_type = RIG_DCD_RIG;
else if (!strcmp(optarg, "DSR"))
@ -254,59 +270,77 @@ int main (int argc, char *argv[])
dcd_type = RIG_DCD_NONE;
else
dcd_type = atoi(optarg);
break;
case 'c':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
civaddr = optarg;
break;
case 's':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
serial_rate = atoi(optarg);
break;
case 'C':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
if (*conf_parms != '\0')
strcat(conf_parms, ",");
strncat(conf_parms, optarg, MAXCONFLEN-strlen(conf_parms));
strncat(conf_parms, optarg, MAXCONFLEN - strlen(conf_parms));
break;
case 't':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
portno = optarg;
break;
case 'T':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
src_addr = optarg;
break;
case 'o':
vfo_mode++;
break;
case 'v':
verbose++;
break;
case 'L':
show_conf++;
break;
case 'l':
list_models();
exit(0);
case 'u':
dump_caps_opt++;
break;
default:
usage(); /* unknown option? */
exit(1);
@ -343,17 +377,22 @@ int main (int argc, char *argv[])
*/
if (ptt_type != RIG_PTT_NONE)
my_rig->state.pttport.type.ptt = ptt_type;
if (dcd_type != RIG_DCD_NONE)
my_rig->state.dcdport.type.dcd = dcd_type;
if (ptt_file)
strncpy(my_rig->state.pttport.pathname, ptt_file, FILPATHLEN - 1);
if (dcd_file)
strncpy(my_rig->state.dcdport.pathname, dcd_file, FILPATHLEN - 1);
/* FIXME: bound checking and port type == serial */
if (serial_rate != 0)
my_rig->state.rigport.parm.serial.rate = serial_rate;
if (civaddr)
rig_set_conf(my_rig, rig_token_lookup(my_rig, "civaddr"), civaddr);
rig_set_conf(my_rig, rig_token_lookup(my_rig, "civaddr"), civaddr);
/*
* print out conf parameters
@ -375,7 +414,7 @@ int main (int argc, char *argv[])
retcode = rig_open(my_rig);
if (retcode != RIG_OK) {
fprintf(stderr,"rig_open: error = %s \n", rigerror(retcode));
fprintf(stderr, "rig_open: error = %s \n", rigerror(retcode));
exit(2);
}
@ -398,8 +437,9 @@ int main (int argc, char *argv[])
# endif
WSADATA wsadata;
if (WSAStartup(MAKEWORD(1,1), &wsadata) == SOCKET_ERROR) {
fprintf(stderr,"WSAStartup socket error\n");
if (WSAStartup(MAKEWORD(1, 1), &wsadata) == SOCKET_ERROR) {
fprintf(stderr, "WSAStartup socket error\n");
exit(1);
}
@ -417,51 +457,57 @@ int main (int argc, char *argv[])
hints.ai_protocol = 0; /* Any protocol */
retcode = getaddrinfo(src_addr, portno, &hints, &result);
if (retcode != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(retcode));
exit(2);
}
saved_result = result;
do {
sock_listen = socket(result->ai_family, result->ai_socktype,
result->ai_protocol);
if (sock_listen < 0) {
handle_error (RIG_DEBUG_ERR, "socket");
handle_error(RIG_DEBUG_ERR, "socket");
freeaddrinfo(saved_result); /* No longer needed */
exit(2);
}
if (setsockopt(sock_listen, SOL_SOCKET, SO_REUSEADDR,
(char *)&reuseaddr, sizeof(reuseaddr)) < 0) {
handle_error (RIG_DEBUG_ERR, "setsockopt");
handle_error(RIG_DEBUG_ERR, "setsockopt");
freeaddrinfo(saved_result); /* No longer needed */
exit (1);
exit(1);
}
#ifdef IPV6_V6ONLY
if (AF_INET6 == result->ai_family) {
/* allow IPv4 mapped to IPv6 clients Windows and BSD default
this to 1 (i.e. disallowed) and we prefer it off */
sockopt = 0;
if (setsockopt(sock_listen, IPPROTO_IPV6, IPV6_V6ONLY,
(char *)&sockopt, sizeof(sockopt)) < 0) {
handle_error (RIG_DEBUG_ERR, "setsockopt");
handle_error(RIG_DEBUG_ERR, "setsockopt");
freeaddrinfo(saved_result); /* No longer needed */
exit (1);
exit(1);
}
}
#endif
if (0 == bind(sock_listen, result->ai_addr, result->ai_addrlen)) {
break;
}
handle_error (RIG_DEBUG_WARN, "binding failed (trying next interface)");
handle_error(RIG_DEBUG_WARN, "binding failed (trying next interface)");
#ifdef __MINGW32__
closesocket (sock_listen);
closesocket(sock_listen);
#else
close (sock_listen);
close(sock_listen);
#endif
} while ((result = result->ai_next) != NULL);
@ -469,12 +515,12 @@ int main (int argc, char *argv[])
if (NULL == result) {
rig_debug(RIG_DEBUG_ERR, "bind error - no available interface\n");
exit (1);
exit(1);
}
if (listen(sock_listen, 4) < 0) {
handle_error (RIG_DEBUG_ERR, "listening");
exit (1);
handle_error(RIG_DEBUG_ERR, "listening");
exit(1);
}
/*
@ -491,21 +537,21 @@ int main (int argc, char *argv[])
if (!arg) {
rig_debug(RIG_DEBUG_ERR, "malloc: %s\n", strerror(errno));
exit (1);
exit(1);
}
arg->rig = my_rig;
arg->clilen = sizeof (arg->cli_addr);
arg->clilen = sizeof(arg->cli_addr);
arg->sock = accept(sock_listen, (struct sockaddr *)&arg->cli_addr, &arg->clilen);
if (arg->sock < 0) {
handle_error (RIG_DEBUG_ERR, "accept");
handle_error(RIG_DEBUG_ERR, "accept");
break;
}
if ((retcode = getnameinfo ((struct sockaddr const *)&arg->cli_addr, arg->clilen, host,
sizeof (host), serv, sizeof (serv), NI_NOFQDN)) < 0) {
rig_debug (RIG_DEBUG_WARN, "Peer lookup error: %s", gai_strerror (retcode));
if ((retcode = getnameinfo((struct sockaddr const *)&arg->cli_addr, arg->clilen, host,
sizeof(host), serv, sizeof(serv), NI_NOFQDN)) < 0) {
rig_debug(RIG_DEBUG_WARN, "Peer lookup error: %s", gai_strerror(retcode));
}
rig_debug(RIG_DEBUG_VERBOSE, "Connection opened from %s:%s\n", host, serv);
@ -520,6 +566,7 @@ int main (int argc, char *argv[])
rig_debug(RIG_DEBUG_ERR, "pthread_create: %s\n", strerror(retcode));
break;
}
#else
handle_socket(arg);
#endif
@ -539,7 +586,7 @@ int main (int argc, char *argv[])
/*
* This is the function run by the threads
*/
void * handle_socket(void *arg)
void *handle_socket(void *arg)
{
struct handle_data *handle_data_arg = (struct handle_data *)arg;
FILE *fsockin;
@ -560,6 +607,7 @@ void * handle_socket(void *arg)
#else
fsockin = fdopen(handle_data_arg->sock, "rb");
#endif
if (!fsockin) {
rig_debug(RIG_DEBUG_ERR, "fdopen in: %s\n", strerror(errno));
goto handle_exit;
@ -570,6 +618,7 @@ void * handle_socket(void *arg)
#else
fsockout = fdopen(handle_data_arg->sock, "wb");
#endif
if (!fsockout) {
rig_debug(RIG_DEBUG_ERR, "fdopen out: %s\n", strerror(errno));
fclose(fsockin);
@ -579,14 +628,15 @@ void * handle_socket(void *arg)
do {
retcode = rigctl_parse(handle_data_arg->rig, fsockin, fsockout, NULL, 0);
if (ferror(fsockin) || ferror(fsockout))
retcode = 1;
} while (retcode == 0 || retcode == 2);
if ((retcode = getnameinfo ((struct sockaddr const *)&handle_data_arg->cli_addr,
handle_data_arg->clilen, host, sizeof (host),
serv, sizeof (serv), NI_NOFQDN)) < 0) {
rig_debug (RIG_DEBUG_WARN, "Peer lookup error: %s", gai_strerror (retcode));
if ((retcode = getnameinfo((struct sockaddr const *)&handle_data_arg->cli_addr,
handle_data_arg->clilen, host, sizeof(host),
serv, sizeof(serv), NI_NOFQDN)) < 0) {
rig_debug(RIG_DEBUG_WARN, "Peer lookup error: %s", gai_strerror(retcode));
}
rig_debug(RIG_DEBUG_VERBOSE, "Connection closed from %s:%s\n",
@ -636,7 +686,7 @@ void usage(void)
" -v, --verbose set verbose mode, cumulative\n"
" -h, --help display this help and exit\n"
" -V, --version output version information and exit\n\n",
portno );
portno);
usage_rig(stdout);

Wyświetl plik

@ -72,7 +72,7 @@ struct handle_data {
socklen_t clilen;
};
void * handle_socket(void * arg);
void *handle_socket(void *arg);
void usage();
@ -83,11 +83,10 @@ void usage();
* TODO: add an option to read from a file
*/
#define SHORT_OPTIONS "m:r:s:C:t:T:LuvhVl"
static struct option long_options[] =
{
static struct option long_options[] = {
{"model", 1, 0, 'm'},
{"rot-file", 1, 0, 'r'},
{"serial-speed",1, 0, 's'},
{"serial-speed", 1, 0, 's'},
{"port", 1, 0, 't'},
{"listen-addr", 1, 0, 'T'},
{"list", 0, 0, 'l'},
@ -101,7 +100,7 @@ static struct option long_options[] =
};
int interactive = 1; /* no cmd because of daemon */
int prompt= 0 ; /* Daemon mode for rigparse return string */
int prompt = 0 ; /* Daemon mode for rigparse return string */
const char *portno = "4533";
const char *src_addr = NULL; /* INADDR_ANY */
@ -111,7 +110,7 @@ char send_cmd_term = '\r'; /* send_cmd termination char */
#define MAXCONFLEN 128
static void handle_error (enum rig_debug_level_e lvl, const char *msg)
static void handle_error(enum rig_debug_level_e lvl, const char *msg)
{
int e;
#ifdef __MINGW32__
@ -128,18 +127,19 @@ static void handle_error (enum rig_debug_level_e lvl, const char *msg)
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
// Default language
(LPTSTR)&lpMsgBuf, 0, NULL)) {
rig_debug (lvl, "%s: Network error %d: %s\n", msg, e, lpMsgBuf);
rig_debug(lvl, "%s: Network error %d: %s\n", msg, e, lpMsgBuf);
LocalFree(lpMsgBuf);
} else {
rig_debug (lvl, "%s: Network error %d\n", msg, e);
rig_debug(lvl, "%s: Network error %d\n", msg, e);
}
#else
e = errno;
rig_debug (lvl, "%s: Network error %d: %s\n", msg, e, strerror (e));
rig_debug(lvl, "%s: Network error %d: %s\n", msg, e, strerror(e));
#endif
}
int main (int argc, char *argv[])
int main(int argc, char *argv[])
{
ROT *my_rot; /* handle to rot (instance) */
rot_model_t my_model = ROT_MODEL_DUMMY;
@ -149,7 +149,7 @@ int main (int argc, char *argv[])
int verbose = 0;
int show_conf = 0;
int dump_caps_opt = 0;
const char *rot_file=NULL;
const char *rot_file = NULL;
int serial_rate = 0;
char conf_parms[MAXCONFLEN] = "";
@ -160,78 +160,98 @@ int main (int argc, char *argv[])
char host[NI_MAXHOST];
char serv[NI_MAXSERV];
while(1) {
while (1) {
int c;
int option_index = 0;
c = getopt_long(argc, argv, SHORT_OPTIONS,
long_options, &option_index);
long_options, &option_index);
if (c == -1)
break;
switch(c) {
switch (c) {
case 'h':
usage();
exit(0);
case 'V':
version();
exit(0);
case 'm':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
my_model = atoi(optarg);
break;
case 'r':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
rot_file = optarg;
break;
case 's':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
serial_rate = atoi(optarg);
break;
case 'C':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
if (*conf_parms != '\0')
strcat(conf_parms, ",");
strncat(conf_parms, optarg, MAXCONFLEN-strlen(conf_parms));
strncat(conf_parms, optarg, MAXCONFLEN - strlen(conf_parms));
break;
case 't':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
portno = optarg;
break;
case 'T':
if (!optarg) {
usage(); /* wrong arg count */
exit(1);
}
src_addr = optarg;
break;
case 'v':
verbose++;
break;
case 'L':
show_conf++;
break;
case 'l':
list_models();
exit(0);
case 'u':
dump_caps_opt++;
break;
default:
usage(); /* unknown option? */
exit(1);
@ -287,7 +307,7 @@ int main (int argc, char *argv[])
retcode = rot_open(my_rot);
if (retcode != RIG_OK) {
fprintf(stderr,"rot_open: error = %s \n", rigerror(retcode));
fprintf(stderr, "rot_open: error = %s \n", rigerror(retcode));
exit(2);
}
@ -311,8 +331,8 @@ int main (int argc, char *argv[])
WSADATA wsadata;
if (WSAStartup(MAKEWORD(1,1), &wsadata) == SOCKET_ERROR) {
fprintf(stderr,"WSAStartup socket error\n");
if (WSAStartup(MAKEWORD(1, 1), &wsadata) == SOCKET_ERROR) {
fprintf(stderr, "WSAStartup socket error\n");
exit(1);
}
@ -330,6 +350,7 @@ int main (int argc, char *argv[])
hints.ai_protocol = 0; /* Any protocol */
retcode = getaddrinfo(src_addr, portno, &hints, &result);
if (retcode != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(retcode));
exit(2);
@ -342,19 +363,20 @@ int main (int argc, char *argv[])
result->ai_protocol);
if (sock_listen < 0) {
handle_error (RIG_DEBUG_ERR, "socket");
handle_error(RIG_DEBUG_ERR, "socket");
freeaddrinfo(result); /* No longer needed */
exit(1);
}
if (setsockopt(sock_listen, SOL_SOCKET, SO_REUSEADDR,
(char *)&reuseaddr,sizeof(reuseaddr)) < 0) {
handle_error (RIG_DEBUG_ERR, "setsockopt");
(char *)&reuseaddr, sizeof(reuseaddr)) < 0) {
handle_error(RIG_DEBUG_ERR, "setsockopt");
freeaddrinfo(result); /* No longer needed */
exit (1);
exit(1);
}
#ifdef IPV6_V6ONLY
if (AF_INET6 == result->ai_family) {
/* allow IPv4 mapped to IPv6 clients, MS & BSD default this
to 1 i.e. disallowed */
@ -362,21 +384,23 @@ int main (int argc, char *argv[])
if (setsockopt(sock_listen, IPPROTO_IPV6, IPV6_V6ONLY,
(char *)&sockopt, sizeof(sockopt)) < 0) {
handle_error (RIG_DEBUG_ERR, "setsockopt");
handle_error(RIG_DEBUG_ERR, "setsockopt");
freeaddrinfo(saved_result); /* No longer needed */
exit (1);
exit(1);
}
}
#endif
if (0 == bind(sock_listen, result->ai_addr, result->ai_addrlen)) {
break;
}
handle_error (RIG_DEBUG_WARN, "binding failed (trying next interface)");
handle_error(RIG_DEBUG_WARN, "binding failed (trying next interface)");
#ifdef __MINGW32__
closesocket (sock_listen);
closesocket(sock_listen);
#else
close (sock_listen);
close(sock_listen);
#endif
} while ((result = result->ai_next) != NULL);
@ -384,12 +408,12 @@ int main (int argc, char *argv[])
if (NULL == result) {
rig_debug(RIG_DEBUG_ERR, "bind error - no available interface\n");
exit (1);
exit(1);
}
if (listen(sock_listen, 4) < 0) {
handle_error (RIG_DEBUG_ERR, "listening");
exit (1);
handle_error(RIG_DEBUG_ERR, "listening");
exit(1);
}
/*
@ -406,7 +430,7 @@ int main (int argc, char *argv[])
if (!arg) {
rig_debug(RIG_DEBUG_ERR, "malloc: %s\n", strerror(errno));
exit (1);
exit(1);
}
arg->rot = my_rot;
@ -415,14 +439,14 @@ int main (int argc, char *argv[])
&arg->clilen);
if (arg->sock < 0) {
handle_error (RIG_DEBUG_ERR, "accept");
handle_error(RIG_DEBUG_ERR, "accept");
break;
}
if ((retcode = getnameinfo ((struct sockaddr const *)&arg->cli_addr, arg->clilen,
host, sizeof (host), serv, sizeof (serv),
NI_NOFQDN)) < 0) {
rig_debug (RIG_DEBUG_WARN, "Peer lookup error: %s", gai_strerror (retcode));
if ((retcode = getnameinfo((struct sockaddr const *)&arg->cli_addr, arg->clilen,
host, sizeof(host), serv, sizeof(serv),
NI_NOFQDN)) < 0) {
rig_debug(RIG_DEBUG_WARN, "Peer lookup error: %s", gai_strerror(retcode));
}
rig_debug(RIG_DEBUG_VERBOSE, "Connection opened from %s:%s\n",
@ -438,6 +462,7 @@ int main (int argc, char *argv[])
rig_debug(RIG_DEBUG_ERR, "pthread_create: %s\n", strerror(retcode));
break;
}
#else
handle_socket(arg);
#endif
@ -457,7 +482,7 @@ int main (int argc, char *argv[])
/*
* This is the function run by the threads
*/
void * handle_socket(void *arg)
void *handle_socket(void *arg)
{
struct handle_data *handle_data_arg = (struct handle_data *)arg;
FILE *fsockin;
@ -478,6 +503,7 @@ void * handle_socket(void *arg)
#else
fsockin = fdopen(handle_data_arg->sock, "rb");
#endif
if (!fsockin) {
rig_debug(RIG_DEBUG_ERR, "fdopen in: %s\n", strerror(errno));
goto handle_exit;
@ -488,6 +514,7 @@ void * handle_socket(void *arg)
#else
fsockout = fdopen(handle_data_arg->sock, "wb");
#endif
if (!fsockout) {
rig_debug(RIG_DEBUG_ERR, "fdopen out: %s\n", strerror(errno));
fclose(fsockin);
@ -496,14 +523,15 @@ void * handle_socket(void *arg)
do {
retcode = rotctl_parse(handle_data_arg->rot, fsockin, fsockout, NULL, 0);
if (ferror(fsockin) || ferror(fsockout))
retcode = 1;
} while (retcode == 0 || retcode == 2);
if ((retcode = getnameinfo ((struct sockaddr const *)&handle_data_arg->cli_addr,
handle_data_arg->clilen, host, sizeof (host),
serv, sizeof (serv), NI_NOFQDN)) < 0) {
rig_debug (RIG_DEBUG_WARN, "Peer lookup error: %s", gai_strerror (retcode));
if ((retcode = getnameinfo((struct sockaddr const *)&handle_data_arg->cli_addr,
handle_data_arg->clilen, host, sizeof(host),
serv, sizeof(serv), NI_NOFQDN)) < 0) {
rig_debug(RIG_DEBUG_WARN, "Peer lookup error: %s", gai_strerror(retcode));
}
rig_debug(RIG_DEBUG_VERBOSE, "Connection closed from %s:%s\n",