AC_INIT(daemon/main.c)
-AM_INIT_AUTOMAKE([doldaconnect], [1.0])
+AM_INIT_AUTOMAKE([doldaconnect], [1.1])
AM_CONFIG_HEADER(config.h)
DOLDA_AC_GROUP([Checking build chain])
void killfnetnode(struct fnetnode *fn)
{
fnetsetstate(fn, FNN_DEAD);
- if(fn->sk != NULL)
- {
- fn->sk->close = 1;
- if(fn->sk->data == fn)
- {
- fn->sk->data = NULL;
- putfnetnode(fn);
- }
- putsock(fn->sk);
- fn->sk = NULL;
- }
+ if(fn->connected)
+ fn->fnet->kill(fn);
}
void getfnetnode(struct fnetnode *fn)
CBCHAINFREE(fn, fnetpeer_new);
CBCHAINFREE(fn, fnetpeer_del);
CBCHAINFREE(fn, fnetpeer_chdi);
- if(fn->fnet->destroy != NULL)
+ if((fn->fnet->destroy != NULL) && fn->connected)
fn->fnet->destroy(fn);
while(fn->args != NULL)
freewcspair(fn->args, &fn->args);
free(fn->pubid);
if(fn->name != NULL)
free(fn->name);
- if(fn->sk != NULL)
- putsock(fn->sk);
if(fn->owner != NULL)
free(fn->owner);
free(fn);
putfnetnode(data);
return;
}
- data->sk = sk;
fnetsetstate(data, FNN_HS);
socksettos(sk, confgetint("fnet", "fntos"));
- data->fnet->connect(data);
+ data->fnet->connect(data, sk);
+ data->connected = 1;
putfnetnode(data);
+ putsock(sk);
}
static void resolvecb(struct sockaddr *addr, int addrlen, struct fnetnode *data)
{
int ret;
- if(fn->fnet->setnick != NULL)
+ if((fn->fnet->setnick != NULL) && fn->connected)
ret = fn->fnet->setnick(fn, newnick);
else
ret = 0;
int fnetsendchat(struct fnetnode *fn, int public, wchar_t *to, wchar_t *string)
{
- if(fn->fnet->sendchat == NULL)
+ if((fn->fnet->sendchat == NULL) || !fn->connected)
{
errno = ENOTSUP;
return(-1);
{
struct fnet *next;
wchar_t *name;
- void (*connect)(struct fnetnode *fn);
+ void (*connect)(struct fnetnode *fn, struct socket *sk);
void (*destroy)(struct fnetnode *fn);
+ void (*kill)(struct fnetnode *fn);
int (*setnick)(struct fnetnode *fn, wchar_t *newnick);
int (*reqconn)(struct fnetpeer *peer);
int (*sendchat)(struct fnetnode *fn, int public, wchar_t *to, wchar_t *string);
int state;
int linked;
int regstatus;
+ int connected;
time_t srchwait, lastsrch;
wchar_t *name, *pubid;
wchar_t *mynick;
wchar_t *owner;
struct fnet *fnet;
- struct socket *sk;
struct fnetpeerdatum *peerdata;
struct fnetpeer *peers;
struct wcspair *args;
};
struct adchub {
+ struct socket *sk;
char *inbuf;
size_t inbufdata, inbufsize;
wchar_t *sid;
#define UNUSED
#endif
#define ADC_CMDCOM \
- struct socket *sk UNUSED = fn->sk; \
- struct adchub *hub UNUSED = fn->data;
+ struct adchub *hub UNUSED = fn->data; \
+ struct socket *sk UNUSED = hub->sk;
ADC_CMDFN(cmd_sup)
{
killfnetnode(fn);
}
-static void hubconnect(struct fnetnode *fn)
+static void hubconnect(struct fnetnode *fn, struct socket *sk)
{
struct adchub *hub;
- fn->sk->readcb = (void (*)(struct socket *, void *))hubread;
- fn->sk->errcb = (void (*)(struct socket *, int, void *))huberr;
- fn->sk->data = fn;
- getfnetnode(fn);
+ 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));
return;
}
fn->data = hub;
- sendadc(fn->sk, 0, L"HSUP", L"ADBASE", eoc, NULL);
+ sendadc(sk, 0, L"HSUP", L"ADBASE", eoc, NULL);
}
static void hubdestroy(struct fnetnode *fn)
{
struct adchub *hub;
- if((hub = fn->data) == NULL)
- return;
+ hub = fn->data;
iconv_close(hub->ich);
if(hub->inbuf != NULL)
free(hub->inbuf);
free(hub);
}
+static void hubkill(struct fnetnode *fn)
+{
+ struct adchub *hub;
+
+ hub = fn->data;
+ hub->sk->close = 1;
+}
+
static int hubsetnick(struct fnetnode *fn, wchar_t *newnick)
{
return(0);
static struct fnet adcnet_store = {
.connect = hubconnect,
.destroy = hubdestroy,
+ .kill = hubkill,
.setnick = hubsetnick,
.reqconn = hubreqconn,
.name = L"adc"
if((hub = fn->data) == NULL)
continue;
if((qcmd = ulqcmd(&hub->queue)) != NULL) {
- if((fn->sk != NULL) && (fn->sk->state == SOCK_EST))
+ if((hub->sk != NULL) && (hub->sk->state == SOCK_EST))
dispatch(qcmd, fn);
freeqcmd(qcmd);
ret = 1;
struct dchub
{
+ struct socket *sk;
char *inbuf;
size_t inbufdata, inbufsize;
struct qcommand *queue;
goto out;
prefix = sprintf2("$SR %s ", hub->nativenick);
infix = sprintf2(" %i/%i\005", slotsleft(), confgetint("transfer", "slots"));
- postfix = sprintf2(" (%s)\005%s|", formataddress(fn->sk->remote, fn->sk->remotelen), args + 4);
+ postfix = sprintf2(" (%s)\005%s|", formataddress(hub->sk->remote, hub->sk->remotelen), args + 4);
dsk = sk;
getsock(dsk);
} else {
addr.sin_port = htons(atoi(p2));
prefix = sprintf2("$SR %s ", hub->nativenick);
infix = sprintf2(" %i/%i\005", slotsleft(), confgetint("transfer", "slots"));
- postfix = sprintf2(" (%s)|", formataddress(fn->sk->remote, fn->sk->remotelen));
+ postfix = sprintf2(" (%s)|", formataddress(hub->sk->remote, hub->sk->remotelen));
netdgramconn(dsk = netdupsock(udpsock), (struct sockaddr *)&addr, sizeof(addr));
}
return;
*p2 = 0;
p2 += 2;
- hubrecvchat(fn->sk, fn, p, p2);
+ hubrecvchat(hub->sk, fn, p, p2);
hubhandleaction(sk, fn, cmd, args);
}
return(1); /* Shouldn't happen, of course, but who knows... */
if(tcpsock != NULL)
{
- sendctm(peer->fn->sk, mbsnick);
+ sendctm(hub->sk, mbsnick);
expectpeer(mbsnick, peer->fn);
} else {
- qstrf(peer->fn->sk, "$RevConnectToMe %s %s|", hub->nativenick, mbsnick);
+ qstrf(hub->sk, "$RevConnectToMe %s %s|", hub->nativenick, mbsnick);
}
free(mbsnick);
return(0);
{
if(*to == L'\0')
{
- qstrf(fn->sk, "<%s> %s|", hub->nativenick, mbsstring);
+ qstrf(hub->sk, "<%s> %s|", hub->nativenick, mbsstring);
} else {
- qstrf(fn->sk, "$To: %s From: %s $<%s> %s|", mbsto, hub->nativenick, hub->nativenick, mbsstring);
+ qstrf(hub->sk, "$To: %s From: %s $<%s> %s|", mbsto, hub->nativenick, hub->nativenick, mbsstring);
}
} else {
- qstrf(fn->sk, "$To: %s From: %s $<%s> %s|", mbsto, hub->nativenick, hub->nativenick, mbsstring);
+ qstrf(hub->sk, "$To: %s From: %s $<%s> %s|", mbsto, hub->nativenick, hub->nativenick, mbsstring);
}
free(mbsto);
free(mbsstring);
struct hash *hash;
hub = fn->data;
- if((fn->state != FNN_EST) || (fn->sk == NULL) || (fn->sk->state != SOCK_EST))
+ if((fn->state != FNN_EST) || (hub->sk == NULL) || (hub->sk->state != SOCK_EST))
return(1);
list = findsexprstrs(srch->sexpr);
findsizelimit(srch->sexpr, &minsize, &maxsize);
addtobuf(sstr, 0);
if(tcpsock != NULL)
{
- if(sockgetremotename2(udpsock, fn->sk, &name, &namelen) < 0)
+ if(sockgetremotename2(udpsock, hub->sk, &name, &namelen) < 0)
{
flog(LOG_WARNING, "cannot get address of UDP socket");
} else {
- qstrf(fn->sk, "$Search %s %s|", formataddress(name, namelen), sstr);
+ qstrf(hub->sk, "$Search %s %s|", formataddress(name, namelen), sstr);
free(name);
}
} else {
- qstrf(fn->sk, "$Search Hub:%s %s|", hub->nativenick, sstr);
+ qstrf(hub->sk, "$Search Hub:%s %s|", hub->nativenick, sstr);
}
free(sstr);
freesl(&list);
{
for(fn = fnetnodes; fn != NULL; fn = fn->next)
{
- if((fn->fnet == &dcnet) && (fn->sk != NULL) && addreq(fn->sk->remote, (struct sockaddr *)&hubaddr))
+ if((fn->fnet == &dcnet) && ((hub = fn->data) != NULL))
{
- myfn = fn;
- break;
+ if((hub->sk != NULL) && addreq(hub->sk->remote, (struct sockaddr *)&hubaddr))
+ {
+ myfn = fn;
+ break;
+ }
}
}
}
numdcpeers--;
}
-static void hubconnect(struct fnetnode *fn)
+static void hubconnect(struct fnetnode *fn, struct socket *sk)
{
- fn->sk->readcb = (void (*)(struct socket *, void *))hubread;
- fn->sk->errcb = (void (*)(struct socket *, int, void *))huberr;
- getfnetnode(fn);
- fn->data = newdchub(fn);
- fn->sk->data = fn;
+ struct dchub *hub;
+
+ sk->readcb = (void (*)(struct socket *, void *))hubread;
+ sk->errcb = (void (*)(struct socket *, int, void *))huberr;
+ fn->data = hub = newdchub(fn);
+ sk->data = fn;
+ getsock(hub->sk = sk);
return;
}
struct qcommand *qcmd;
hub = (struct dchub *)fn->data;
- if((fn->sk != NULL) && (fn->sk->data == fn))
- {
- fn->sk->data = NULL;
- fn->sk->readcb = NULL;
- fn->sk->errcb = NULL;
- putfnetnode(fn);
- }
- if(hub == NULL)
- return;
+ putsock(hub->sk);
while((qcmd = ulqcmd(&hub->queue)) != NULL)
freeqcmd(qcmd);
if(hub->supports != NULL)
free(hub);
}
+static void hubkill(struct fnetnode *fn)
+{
+ struct dchub *hub;
+
+ hub = (struct dchub *)fn->data;
+ hub->sk->close = 1;
+}
+
static wchar_t *dcbasename(wchar_t *filename)
{
wchar_t *ret;
.name = L"dc",
.connect = hubconnect,
.destroy = hubdestroy,
+ .kill = hubkill,
.setnick = hubsetnick,
.reqconn = hubreqconn,
.sendchat = hubsendchat,
{
if(*qcmd->string == '$')
{
- if((fn->sk != NULL) && (fn->sk->state == SOCK_EST))
- dispatchcommand(qcmd, hubcmds, fn->sk, fn);
+ if((hub->sk != NULL) && (hub->sk->state == SOCK_EST))
+ dispatchcommand(qcmd, hubcmds, hub->sk, fn);
} else if(*qcmd->string != 0) {
- hubrecvchat(fn->sk, fn, NULL, qcmd->string);
+ hubrecvchat(hub->sk, fn, NULL, qcmd->string);
}
freeqcmd(qcmd);
ret = 1;
SUBDIRS=dolcon
-EXTRA_DIST=autodl chatlog hubmgr dcruncmd
+dist_bin_SCRIPTS=autodl chatlog hubmgr dcruncmd
lib_LTLIBRARIES=libdolcon-guile.la
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(use-modules (dolcon ui))
-(use-modules (ice-9 pretty-print))
+(use-modules (ice-9 pretty-print) (ice-9 rdelim))
(define sr '())
(define lastsearch 0)
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(use-modules (dolcon ui))
-(use-modules (ice-9 pretty-print))
+(use-modules (ice-9 pretty-print) (ice-9 rdelim))
(define fnetnodes '())
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(use-modules (dolcon ui) (dolcon util))
-(use-modules (ice-9 format))
+(use-modules (ice-9 format) (ice-9 rdelim))
(define max-hubs 6)
(define hub-list '())
msgstr ""
"Project-Id-Version: doldaconnect 0.1.1\n"
"Report-Msgid-Bugs-To: fredrik@dolda2000.com\n"
-"POT-Creation-Date: 2007-10-15 02:19+0200\n"
+"POT-Creation-Date: 2007-10-22 00:12+0200\n"
"PO-Revision-Date: 2007-08-31 03:37+0200\n"
"Last-Translator: Fredrik Tolf <fredrik@dolda2000.com>\n"
"Language-Team: Swedish <sv@li.org>\n"
msgid "%s (reported at %s)"
msgstr "%s (rapporterades kl. %s)"
-#: clients/gtk2/dolcon.c:624 clients/gtk2/dolcon.c:2312
+#: clients/gtk2/dolcon.c:624 clients/gtk2/dolcon.c:2315
msgid "Disconnected"
msgstr "Frånkopplad"
msgid "Discrete sizes"
msgstr "Enskilda storlekar"
-#: clients/gtk2/dolcon.c:1027 clients/gui-shell/dsh.c:351
+#: clients/gtk2/dolcon.c:1028 clients/gui-shell/dsh.c:351
msgid "The server refused the connection"
msgstr "Servern vägrade förbindelsen"
-#: clients/gtk2/dolcon.c:1031 clients/gui-shell/dsh.c:354
+#: clients/gtk2/dolcon.c:1032 clients/gui-shell/dsh.c:354
msgid "Server protocol revision mismatch"
msgstr "Fel protokoll-revision hos servern"
-#: clients/gtk2/dolcon.c:1037
+#: clients/gtk2/dolcon.c:1038
msgid "Connected"
msgstr "Ansluten"
-#: clients/gtk2/dolcon.c:1265
+#: clients/gtk2/dolcon.c:1266
msgid "The server has closed the connection"
msgstr "Servern har stängt förbindelsen"
-#: clients/gtk2/dolcon.c:1267
+#: clients/gtk2/dolcon.c:1268
#, c-format
msgid ""
"The connection to the server failed:\n"
"\n"
"%s"
-#: clients/gtk2/dolcon.c:1287
+#: clients/gtk2/dolcon.c:1288
msgid "Preferences"
msgstr "Inställningar"
-#: clients/gtk2/dolcon.c:1326
+#: clients/gtk2/dolcon.c:1328
#, c-format
msgid ""
"Could not connect:\n"
"\n"
"%s"
-#: clients/gtk2/dolcon.c:1333 clients/gtk2/hublist.c:206
+#: clients/gtk2/dolcon.c:1335 clients/gtk2/hublist.c:206
#: clients/gnome-trans-applet/dolcon-trans-applet.c:113
msgid "Connecting..."
msgstr "Ansluter..."
-#: clients/gtk2/dolcon.c:1342
+#: clients/gtk2/dolcon.c:1344
msgid "Connect"
msgstr "Anslut"
-#: clients/gtk2/dolcon.c:1342
+#: clients/gtk2/dolcon.c:1344
msgid "Server address:"
msgstr "Serverns adress:"
-#: clients/gtk2/dolcon.c:1355 clients/gtk2/dolcon.c:1376
-#: clients/gtk2/dolcon.c:1474 clients/gtk2/dolcon.c:1516
-#: clients/gtk2/dolcon.c:1580 clients/gtk2/dolcon.c:1668
-#: clients/gtk2/dolcon.c:1765
+#: clients/gtk2/dolcon.c:1357 clients/gtk2/dolcon.c:1378
+#: clients/gtk2/dolcon.c:1476 clients/gtk2/dolcon.c:1518
+#: clients/gtk2/dolcon.c:1582 clients/gtk2/dolcon.c:1670
+#: clients/gtk2/dolcon.c:1767
msgid "Not connected to DC server"
msgstr "Ej ansluten till DC-servern"
-#: clients/gtk2/dolcon.c:1362 clients/gtk2/dolcon.c:1395
-#: clients/gtk2/dolcon.c:1487 clients/gtk2/dolcon.c:1534
-#: clients/gtk2/dolcon.c:1593 clients/gtk2/dolcon.c:1686
-#: clients/gtk2/dolcon.c:1741 clients/gtk2/dolcon.c:1812
-#: clients/gtk2/dolcon.c:1937 clients/gtk2/dolcon.c:1964
+#: clients/gtk2/dolcon.c:1364 clients/gtk2/dolcon.c:1397
+#: clients/gtk2/dolcon.c:1489 clients/gtk2/dolcon.c:1536
+#: clients/gtk2/dolcon.c:1595 clients/gtk2/dolcon.c:1688
+#: clients/gtk2/dolcon.c:1743 clients/gtk2/dolcon.c:1814
+#: clients/gtk2/dolcon.c:1939 clients/gtk2/dolcon.c:1966
msgid "You do not have permission to do that"
msgstr "Du har inte tillstånd att göra det"
-#: clients/gtk2/dolcon.c:1382
+#: clients/gtk2/dolcon.c:1384
msgid "Illegal address entered"
msgstr "Ogiltig adress"
-#: clients/gtk2/dolcon.c:1397 clients/gtk2/dolcon.c:1536
+#: clients/gtk2/dolcon.c:1399 clients/gtk2/dolcon.c:1538
msgid "The server could not parse that address"
msgstr "Servern kunde inte tolka den adressen"
-#: clients/gtk2/dolcon.c:1399 clients/gtk2/dolcon.c:1538
+#: clients/gtk2/dolcon.c:1401 clients/gtk2/dolcon.c:1540
msgid "There are too many hubs connected"
msgstr "För många hubbar är anslutna"
-#: clients/gtk2/dolcon.c:1479 clients/gtk2/dolcon.c:1585
+#: clients/gtk2/dolcon.c:1481 clients/gtk2/dolcon.c:1587
msgid "No hub selected"
msgstr "Ingen hub vald"
-#: clients/gtk2/dolcon.c:1595
+#: clients/gtk2/dolcon.c:1597
msgid ""
"This hub could not support all the types of characters in your chat message"
msgstr "Den här hubben klarar inte av alla sorters bokstäver i ditt meddelande"
-#: clients/gtk2/dolcon.c:1597
+#: clients/gtk2/dolcon.c:1599
msgid "This hub does not support chatting"
msgstr "Den här hubben klarar inte av att chatta"
-#: clients/gtk2/dolcon.c:1599
+#: clients/gtk2/dolcon.c:1601
#, c-format
msgid "An error occurred while trying to chat (%i)"
msgstr "Ett fel uppstod under försöket att chatta (%i)"
-#: clients/gtk2/dolcon.c:1676
+#: clients/gtk2/dolcon.c:1678
msgid "Please enter a search expression before searching"
msgstr "Skriv in ett sökuttryck först"
-#: clients/gtk2/dolcon.c:1684
+#: clients/gtk2/dolcon.c:1686
msgid "Could not find any hubs to search on"
msgstr "Kunde inte hitta någon hub att söka på"
-#: clients/gtk2/dolcon.c:1688
+#: clients/gtk2/dolcon.c:1690
msgid "The server could not parse your search expression"
msgstr "Servern kunde inte tolka ditt sökuttryck"
-#: clients/gtk2/dolcon.c:1690
+#: clients/gtk2/dolcon.c:1692
#, c-format
msgid "An error occurred while trying to search (%i)"
msgstr "Ett fel uppstod under försöket att söka (%i)"
-#: clients/gtk2/dolcon.c:1743 clients/gtk2/dolcon.c:1966
+#: clients/gtk2/dolcon.c:1745 clients/gtk2/dolcon.c:1968
#, c-format
msgid "An error occurred while trying to cancel (%i)"
msgstr "Ett fel uppstod under försöket att avbryta (%i)"
-#: clients/gtk2/dolcon.c:1814
+#: clients/gtk2/dolcon.c:1816
#, c-format
msgid "An error occurred while trying to queue the download (%i)"
msgstr "Ett fel uppstod under försöket att lägga till nerladdningen (%i)"
-#: clients/gtk2/dolcon.c:1939
+#: clients/gtk2/dolcon.c:1941
#, c-format
msgid "An error occurred while trying to reset (%i)"
msgstr "Ett fel uppstod under försöket att återställa (%i)"
-#: clients/gtk2/dolcon.c:2074
+#: clients/gtk2/dolcon.c:2077
#, c-format
msgid "An error occurred (%ls)"
msgstr "Ett fel uppstod (%ls)"
-#: clients/gtk2/dolcon.c:2192 clients/gtk2/mainwnd.gtk:470
+#: clients/gtk2/dolcon.c:2195 clients/gtk2/mainwnd.gtk:470
#, c-format
msgid "Ready to search"
msgstr "Redo att söka"
-#: clients/gtk2/dolcon.c:2194
+#: clients/gtk2/dolcon.c:2197
#, c-format
msgid "Search scheduled and will be submitted in %i seconds"
msgstr "Sökningen är schemalagd och kommer genomföras om %i sekunder"