* Sebastian Hammer, Adam Dickmeiss
*
* $Log: ir-tcl.c,v $
- * Revision 1.73 1996-01-29 11:35:19 adam
+ * Revision 1.75 1996-02-19 15:41:53 adam
+ * Better log messages.
+ * Minor improvement of connect method.
+ *
+ * Revision 1.74 1996/02/05 17:58:03 adam
+ * Ported ir-tcl to use the beta releases of tcl7.5/tk4.1.
+ *
+ * Revision 1.73 1996/01/29 11:35:19 adam
* Bug fix: cs_type member renamed to comstackType to avoid conflict with
* cs_type macro defined by YAZ.
*
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
-#ifdef WINDOWS
#include <time.h>
-#else
-#include <sys/time.h>
-#endif
#include <assert.h>
#define CS_BLOCK 0
interp->result = "already connected";
return TCL_ERROR;
}
- if (ir_tcl_strdup (interp, &p->hostname, argv[2]) == TCL_ERROR)
- return TCL_ERROR;
if (!strcmp (p->comstackType, "tcpip"))
{
p->cs_link = cs_create (tcpip_type, CS_BLOCK, p->protocol_type);
p->comstackType, NULL);
return TCL_ERROR;
}
+ if (ir_tcl_strdup (interp, &p->hostname, argv[2]) == TCL_ERROR)
+ return TCL_ERROR;
+#if IRTCL_GENERIC_FILES
+#ifdef WINDOWS
+ p->csFile = Tcl_GetFile (cs_fileno(p->cs_link), TCL_WIN_SOCKET);
+#else
+ p->csFile = Tcl_GetFile (cs_fileno(p->cs_link), TCL_UNIX_FD);
+#endif
+#endif
if ((r=cs_connect (p->cs_link, addr)) < 0)
{
interp->result = "connect fail";
do_disconnect (p, NULL, 2, NULL);
return TCL_ERROR;
}
- logf(LOG_DEBUG, "cs_connect() returned %d", r);
+ logf(LOG_DEBUG, "cs_connect() returned %d fd=%d", r,
+ cs_fileno(p->cs_link));
p->eventType = "connect";
+#if IRTCL_GENERIC_FILES
+ ir_select_add (p->csFile, p);
+#else
ir_select_add (cs_fileno (p->cs_link), p);
+#endif
if (r == 1)
{
+#if IRTCL_GENERIC_FILES
+ ir_select_add_write (p->csFile, p);
+#else
ir_select_add_write (cs_fileno (p->cs_link), p);
+#endif
p->state = IR_TCL_R_Connecting;
}
else
p->eventType = NULL;
p->hostname = NULL;
p->cs_link = NULL;
+#if IRTCL_GENERIC_FILES
+ p->csFile = 0;
+#endif
return TCL_OK;
}
if (p->hostname)
{
+ logf(LOG_DEBUG, "Closing connection to %s", p->hostname);
free (p->hostname);
p->hostname = NULL;
+#if IRTCL_GENERIC_FILES
+ ir_select_remove_write (p->csFile, p);
+ ir_select_remove (p->csFile, p);
+#else
ir_select_remove_write (cs_fileno (p->cs_link), p);
ir_select_remove (cs_fileno (p->cs_link), p);
+#endif
odr_reset (p->odr_in);
assert (p->cs_link);
- logf(LOG_DEBUG, "Closing connection");
cs_close (p->cs_link);
p->cs_link = NULL;
+#if IRTCL_GENERIC_FILES
+ Tcl_FreeFile (p->csFile);
+ p->csFile = NULL;
+#endif
ODR_MASK_ZERO (&p->options);
ODR_MASK_SET (&p->options, 0);
}
#endif
- logf (LOG_DEBUG, "ir object create");
+ logf (LOG_DEBUG, "ir object create %s", argv[1]);
obj->odr_in = odr_createmem (ODR_DECODE);
obj->odr_out = odr_createmem (ODR_ENCODE);
obj->odr_pr = odr_createmem (ODR_PRINT);
Tcl_CmdInfo cmd_info;
const char *apdu_call;
- logf(LOG_DEBUG, "Read handler");
+ logf(LOG_DEBUG, "Read handler fd=%d", cs_fileno(p->cs_link));
if (p->state == IR_TCL_R_Connecting)
{
logf(LOG_DEBUG, "Connect handler");
return;
}
p->state = IR_TCL_R_Idle;
+#if IRTCL_GENERIC_FILES
+ ir_select_remove_write (p->csFile, p);
+#else
ir_select_remove_write (cs_fileno (p->cs_link), p);
+#endif
if (r < 0)
{
logf (LOG_DEBUG, "cs_rcvconnect error");
if ((r=cs_get (p->cs_link, &p->buf_in, &p->len_in)) <= 0)
{
logf (LOG_DEBUG, "cs_get failed, code %d", r);
+#if IRTCL_GENERIC_FILES
+ ir_select_remove (p->csFile, p);
+#else
ir_select_remove (cs_fileno (p->cs_link), p);
+#endif
do_disconnect (p, NULL, 2, NULL);
if (p->failback)
{
int r;
IrTcl_Request *rq;
- logf (LOG_DEBUG, "Write handler");
+ logf (LOG_DEBUG, "Write handler fd=%d", cs_fileno(p->cs_link));
if (p->state == IR_TCL_R_Connecting)
{
logf(LOG_DEBUG, "Connect handler");
if (r < 0)
{
logf (LOG_DEBUG, "cs_rcvconnect error");
+#if IRTCL_GENERIC_FILES
+ ir_select_remove_write (p->csFile, p);
+#else
ir_select_remove_write (cs_fileno (p->cs_link), p);
+#endif
if (p->failback)
{
p->failInfo = IR_TCL_FAIL_CONNECT;
do_disconnect (p, NULL, 2, NULL);
return;
}
+#if IRTCL_GENERIC_FILES
+ ir_select_remove_write (p->csFile, p);
+#else
ir_select_remove_write (cs_fileno (p->cs_link), p);
+#endif
if (p->callback)
IrTcl_eval (p->interp, p->callback);
return;
{
logf(LOG_DEBUG, "Write completed");
p->state = IR_TCL_R_Waiting;
+#if IRTCL_GENERIC_FILES
+ ir_select_remove_write (p->csFile, p);
+#else
ir_select_remove_write (cs_fileno (p->cs_link), p);
+#endif
free (rq->buf_out);
rq->buf_out = NULL;
}