X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ffnet-adc.c;h=c874b6e81177bdc80382070854d375ea406306ae;hb=caa88daef3184efc09e60e9b902d1ae6c98db9fb;hp=2e920e653dea1288a5febfa1bbf3cc2ce6119c1d;hpb=ffa81d5f0167a81cc81e9eec69062f0aeaf7754a;p=doldaconnect.git diff --git a/daemon/fnet-adc.c b/daemon/fnet-adc.c index 2e920e6..c874b6e 100644 --- a/daemon/fnet-adc.c +++ b/daemon/fnet-adc.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,11 @@ struct qcmd { wchar_t **args; }; +struct qcmdqueue { + struct qcmd *f, *l; + int size; +}; + struct adchub { struct socket *sk; char *inbuf; @@ -69,7 +75,7 @@ struct adchub { iconv_t ich; int state; struct wcspair *hubinf; - struct qcmd *queue; + struct qcmdqueue queue; }; static wchar_t *eoc; @@ -163,26 +169,31 @@ static void sendadc(struct socket *sk, int sep, ...) va_end(args); } -static struct qcmd *newqcmd(struct qcmd **queue, wchar_t **args) +static struct qcmd *newqcmd(struct qcmdqueue *queue, wchar_t **args) { struct qcmd *new; - while(*queue != NULL) - queue = &((*queue)->next); new = smalloc(sizeof(*new)); new->next = NULL; new->args = args; - *queue = new; + if(queue->l == NULL) + queue->f = new; + else + queue->l->next = new; + queue->l = new; + queue->size++; return(new); } -static struct qcmd *ulqcmd(struct qcmd **queue) +static struct qcmd *ulqcmd(struct qcmdqueue *queue) { struct qcmd *ret; - if((ret = *queue) == NULL) + if((ret = queue->f) == NULL) return(NULL); - *queue = ret->next; + if((queue->f = ret->next) == NULL) + queue->l = NULL; + queue->size--; return(ret); } @@ -287,7 +298,7 @@ static void dispatch(struct qcmd *qcmd, struct fnetnode *fn) if(!wcscmp(cmd->name, qcmd->args[0] + 1)) { if(argc < cmd->minargs) return; - cmd->func(fn, cmdnm, sender, argc, qcmd->args); + cmd->func(fn, cmdnm, sender, argc, argv); return; } } @@ -356,20 +367,20 @@ static void hubconnect(struct fnetnode *fn, struct socket *sk) { struct adchub *hub; - getsock(hub->sk = sk); sk->readcb = (void (*)(struct socket *, void *))hubread; sk->errcb = (void (*)(struct socket *, int, void *))huberr; sk->data = fn; hub = smalloc(sizeof(*hub)); memset(hub, 0, sizeof(*hub)); + getsock(hub->sk = sk); if((hub->ich = iconv_open("wchar_t", "utf-8")) == (iconv_t)-1) { flog(LOG_CRIT, "iconv cannot handle UTF-8: %s", strerror(errno)); killfnetnode(fn); return; } fn->data = hub; - sendadc(sk, 0, L"HSUP", L"ADBASE", eoc, NULL); + sendadc(sk, 0, L"HSUP", L"ADBASE", L"ADTIGR", eoc, NULL); } static void hubdestroy(struct fnetnode *fn) @@ -446,9 +457,31 @@ static void preinit(int hup) regfnet(adcnet); } -static int init(int hup) +static void makepid(char *idbuf) { int i; + int fd, ret; + + i = 0; + if((fd = open("/dev/urandom", O_RDONLY)) >= 0) { + for(i = 0; i < 24; i += ret) { + if((ret = read(fd, idbuf + i, 24 - i)) <= 0) { + flog(LOG_WARNING, "could not read random data from /dev/urandom for ADC PID: %s", (errno == 0)?"EOF":strerror(errno)); + break; + } + } + close(fd); + } else { + flog(LOG_WARNING, "could not open /dev/urandom: %s", strerror(errno)); + } + if(i != 24) { + for(i = 0; i < sizeof(idbuf); i++) + idbuf[i] = rand() % 256; + } +} + +static int init(int hup) +{ char idbuf[24], *id32; struct tigerhash th; @@ -456,8 +489,7 @@ static int init(int hup) eoc = swcsdup(L""); if((privid = fetchvar("adc.pid", NULL)) == NULL) { - for(i = 0; i < sizeof(idbuf); i++) - idbuf[i] = rand() % 256; + makepid(idbuf); id32 = base32encode(idbuf, sizeof(idbuf)); id32[39] = 0; privid = icmbstowcs(id32, "us-ascii");