X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fuilib.c;h=356e41e682f8cde0716b6d0f155f17c2fd7354a1;hb=e4b88cc0edd9e56806aa68b6c47a7b4782f97dc1;hp=031fc16c788e4ea58347274d28e1c894c1e0cd01;hpb=ccad23d3a684f97998ed781939af462227efb347;p=doldaconnect.git diff --git a/lib/uilib.c b/lib/uilib.c index 031fc16..356e41e 100644 --- a/lib/uilib.c +++ b/lib/uilib.c @@ -102,6 +102,7 @@ struct { int family; int sentcreds; } servinfo; +char *dc_srv_local; static struct dc_response *makeresp(void) { @@ -258,6 +259,7 @@ int dc_init(void) { if((ichandle = iconv_open("wchar_t", "utf-8")) == (iconv_t)-1) return(-1); + dc_srv_local = sstrdup(""); initcmds(); return(0); } @@ -1096,30 +1098,39 @@ static struct addrinfo *resolvhost(char *host) return(NULL); } -static struct addrinfo *defaulthost(void) +static struct addrinfo *getlocalai(void) { struct addrinfo *ret; struct passwd *pwd; char *tmp; - char dn[1024]; - - if(((tmp = getenv("DCSERVER")) != NULL) && *tmp) - return(resolvhost(tmp)); + ret = NULL; if((getuid() != 0) && ((pwd = getpwuid(getuid())) != NULL)) { tmp = sprintf2("/tmp/doldacond-%s", pwd->pw_name); - ret = gaicat(ret, unixgai(SOCK_STREAM, tmp)); + ret = unixgai(SOCK_STREAM, tmp); free(tmp); } ret = gaicat(ret, unixgai(SOCK_STREAM, "/var/run/doldacond.sock")); + return(ret); +} + +static struct addrinfo *defaulthost(void) +{ + struct addrinfo *ret; + char *tmp; + char dn[1024]; + + if(((tmp = getenv("DCSERVER")) != NULL) && *tmp) + return(resolvhost(tmp)); + ret = getlocalai(); ret = gaicat(ret, resolvtcp("localhost", 1500)); if(!getdomainname(dn, sizeof(dn)) && *dn && strcmp(dn, "(none)")) ret = gaicat(ret, resolvsrv(dn)); return(ret); } -int dc_connect(char *host) +static int dc_connectai(struct addrinfo *hosts, struct qcmd **cnctcmd) { struct qcmd *qcmd; int errnobak; @@ -1129,17 +1140,14 @@ int dc_connect(char *host) state = -1; if(hostlist != NULL) freeaddrinfo(hostlist); - if(!host || !*host) - hostlist = defaulthost(); - else - hostlist = resolvhost(host); - if(hostlist == NULL) - return(-1); + hostlist = hosts; for(curhost = hostlist; curhost != NULL; curhost = curhost->ai_next) { if((fd = socket(curhost->ai_family, curhost->ai_socktype, curhost->ai_protocol)) < 0) { errnobak = errno; + freeaddrinfo(hostlist); + hostlist = NULL; errno = errnobak; return(-1); } @@ -1161,11 +1169,81 @@ int dc_connect(char *host) break; } } - qcmd = makeqcmd(NULL); - resetreader = 1; + if(state != -1) + { + qcmd = makeqcmd(NULL); + if(cnctcmd != NULL) + *cnctcmd = qcmd; + resetreader = 1; + } else { + free(hostlist); + hostlist = NULL; + } return(fd); } +static int dc_connect2(char *host, struct qcmd **cnctcmd) +{ + struct addrinfo *ai; + struct qcmd *qcmd; + int ret; + + if(host == dc_srv_local) + ai = getlocalai(); + else if(!host || !*host) + ai = defaulthost(); + else + ai = resolvhost(host); + if(ai == NULL) + return(-1); + ret = dc_connectai(ai, &qcmd); + if((ret >= 0) && (cnctcmd != NULL)) + *cnctcmd = qcmd; + return(ret); +} + +int dc_connect(char *host) +{ + return(dc_connect2(host, NULL)); +} + +int dc_connectsync(char *host, struct dc_response **respbuf) +{ + int ret; + struct qcmd *cc; + struct dc_response *resp; + + if((ret = dc_connect2(host, &cc)) < 0) + return(-1); + resp = dc_gettaggedrespsync(cc->tag); + if(resp == NULL) { + dc_disconnect(); + return(-1); + } + if(respbuf == NULL) + dc_freeresp(resp); + else + *respbuf = resp; + return(ret); +} + +int dc_connectsync2(char *host, int rev) +{ + int ret; + struct dc_response *resp; + + if((ret = dc_connectsync(host, &resp)) < 0) + return(-1); + if(dc_checkprotocol(resp, rev)) + { + dc_freeresp(resp); + dc_disconnect(); + return(-1); + } + dc_freeresp(resp); + return(ret); +} + struct dc_intresp *dc_interpret(struct dc_response *resp) { int i; @@ -1247,7 +1325,7 @@ int dc_checkprotocol(struct dc_response *resp, int revision) if((ires = dc_interpret(resp)) == NULL) return(-1); low = ires->argv[0].val.num; - high = ires->argv[0].val.num; + high = ires->argv[1].val.num; dc_freeires(ires); if((revision < low) || (revision > high)) return(-1); @@ -1258,3 +1336,8 @@ const char *dc_gethostname(void) { return(servinfo.hostname); } + +int dc_getfd(void) +{ + return(fd); +}