X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fguile%2Fdolcon-guile.c;h=900345ab4de5a440b9c012eedc53c0b55f0af9b7;hb=e4b88cc0edd9e56806aa68b6c47a7b4782f97dc1;hp=9e0575366eea8200634c35c041588b270a887324;hpb=d3372da97568d5e1f35fa19787c8ec8af93a0435;p=doldaconnect.git diff --git a/lib/guile/dolcon-guile.c b/lib/guile/dolcon-guile.c index 9e05753..900345a 100644 --- a/lib/guile/dolcon-guile.c +++ b/lib/guile/dolcon-guile.c @@ -22,23 +22,22 @@ struct scmcb }; static int fd = -1; -static scm_bits_t resptype; +static scm_t_bits resptype; -static SCM scm_dc_connect(SCM host, SCM port) +static SCM scm_dc_connect(SCM host) { - int cport; + char *chost; - SCM_ASSERT(SCM_STRINGP(host), host, SCM_ARG1, "dc-connect"); - if(port == SCM_UNDEFINED) + if(fd >= 0) + dc_disconnect(); + if((host == SCM_UNDEFINED) || (host == SCM_BOOL_F)) { - cport = -1; + chost = NULL; } else { - SCM_ASSERT(SCM_INUMP(port), port, SCM_ARG2, "dc-connect"); - cport = SCM_INUM(port); + SCM_ASSERT(SCM_STRINGP(host), host, SCM_ARG1, "dc-connect"); + chost = SCM_STRING_CHARS(host); } - if(fd >= 0) - dc_disconnect(); - if((fd = dc_connect(SCM_STRING_CHARS(host), cport)) < 0) + if((fd = dc_connect(chost)) < 0) scm_syserror("dc-connect"); return(SCM_MAKINUM(fd)); } @@ -222,11 +221,11 @@ static SCM scm_dc_qcmd(SCM argv, SCM callback) addtobuf(toks, NULL); if(callback == SCM_UNDEFINED) { - tag = dc_queuecmd(NULL, NULL, cmd, L"%%a", toks, NULL); + tag = dc_queuecmd(NULL, NULL, cmd, L"%a", toks, NULL); } else { scmcb = scm_must_malloc(sizeof(*scmcb), "scmcb"); scm_gc_protect_object(scmcb->subr = callback); - tag = dc_queuecmd(qcmd_scmcb, scmcb, cmd, L"%%a", toks, NULL); + tag = dc_queuecmd(qcmd_scmcb, scmcb, cmd, L"%a", toks, NULL); } dc_freewcsarr(toks); if(cmd != NULL) @@ -295,6 +294,24 @@ static SCM scm_dc_lexsexpr(SCM sexpr) return(scm_reverse(ret)); } +static SCM scm_dc_checkproto(SCM resp, SCM version) +{ + int ver; + + SCM_ASSERT(SCM_SMOB_PREDICATE(resptype, resp), resp, SCM_ARG1, "dc-checkproto"); + if(version == SCM_UNDEFINED) + { + ver = DC_LATEST; + } else { + SCM_ASSERT(SCM_INUMP(version), version, SCM_ARG2, "dc-checkproto"); + ver = SCM_INUM(version); + } + if(dc_checkprotocol(((struct respsmob *)SCM_SMOB_DATA(resp))->resp, ver)) + return(SCM_BOOL_F); + else + return(SCM_BOOL_T); +} + static size_t resp_free(SCM respsmob) { struct respsmob *data; @@ -322,7 +339,7 @@ static int resp_print(SCM respsmob, SCM port, scm_print_state *pstate) void init_guiledc(void) { - scm_c_define_gsubr("dc-connect", 1, 1, 0, scm_dc_connect); + scm_c_define_gsubr("dc-connect", 0, 1, 0, scm_dc_connect); scm_c_define_gsubr("dc-disconnect", 0, 0, 0, scm_dc_disconnect); scm_c_define_gsubr("dc-connected", 0, 0, 0, scm_dc_connected); scm_c_define_gsubr("dc-select", 0, 1, 0, scm_dc_select); @@ -332,6 +349,8 @@ void init_guiledc(void) scm_c_define_gsubr("dc-qcmd", 1, 1, 0, scm_dc_qcmd); scm_c_define_gsubr("dc-loginasync", 2, 1, 0, scm_dc_loginasync); scm_c_define_gsubr("dc-lexsexpr", 1, 0, 0, scm_dc_lexsexpr); + scm_c_define_gsubr("dc-checkproto", 1, 1, 0, scm_dc_checkproto); + scm_c_define("dc-latest", SCM_MAKINUM(DC_LATEST)); resptype = scm_make_smob_type("dc-resp", sizeof(struct respsmob)); scm_set_smob_free(resptype, resp_free); scm_set_smob_print(resptype, resp_print);