X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fguile%2Fdolcon-guile.c;h=900345ab4de5a440b9c012eedc53c0b55f0af9b7;hb=e4b88cc0edd9e56806aa68b6c47a7b4782f97dc1;hp=7a0f3e21b423fddd5b2f0c752020575f2b0b7335;hpb=12383d48e624213114482f29af819ff77aef70fa;p=doldaconnect.git diff --git a/lib/guile/dolcon-guile.c b/lib/guile/dolcon-guile.c index 7a0f3e2..900345a 100644 --- a/lib/guile/dolcon-guile.c +++ b/lib/guile/dolcon-guile.c @@ -22,7 +22,7 @@ struct scmcb }; static int fd = -1; -static scm_bits_t resptype; +static scm_t_bits resptype; static SCM scm_dc_connect(SCM host) { @@ -30,7 +30,7 @@ static SCM scm_dc_connect(SCM host) if(fd >= 0) dc_disconnect(); - if(host == SCM_UNDEFINED) + if((host == SCM_UNDEFINED) || (host == SCM_BOOL_F)) { chost = NULL; } else { @@ -221,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) @@ -294,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; @@ -331,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);