Added hup command to library.
[doldaconnect.git] / lib / uimisc.c
index 249f8f8..73684d3 100644 (file)
@@ -79,6 +79,29 @@ struct fnetcbdata
 struct dc_fnetnode *dc_fnetnodes = NULL;
 struct dc_transfer *dc_transfers = NULL;
 
+static void message(char *format, ...)
+{
+    static int on = -1;
+    char *v;
+    va_list args;
+    
+    if(on == -1)
+    {
+       on = 0;
+       if((v = getenv("LIBDCUI_MSG")) != NULL)
+       {
+           if(strtol(v, NULL, 0) & 1)
+               on = 1;
+       }
+    }
+    if(on == 1)
+    {
+       va_start(args, format);
+       vfprintf(stderr, format, args);
+       va_end(args);
+    }
+}
+
 static void freelogindata(struct logindata *data)
 {
     if((data->mech != NULL) && (data->mech->release != NULL))
@@ -167,7 +190,7 @@ static void process_pam(struct dc_response *resp, struct logindata *data)
                data->callback(DC_LOGIN_ERR_CONV, NULL, data->data);
                freelogindata(data);
            } else {
-               dc_queuecmd(logincallback, data, L"pass", L"%%s", buf, NULL);
+               dc_queuecmd(logincallback, data, L"pass", L"%s", buf, NULL);
            }
            if(buf != NULL)
            {
@@ -226,7 +249,7 @@ static void process_krb5(struct dc_response *resp, struct logindata *data)
        {
        case 0:
            buf = hexencode(krb->reqbuf.data, krb->reqbuf.length);
-           dc_queuecmd(logincallback, data, L"pass", L"%%s", buf, NULL);
+           dc_queuecmd(logincallback, data, L"pass", L"%s", buf, NULL);
            free(buf);
            krb->state = 1;
            break;
@@ -253,7 +276,7 @@ static void process_krb5(struct dc_response *resp, struct logindata *data)
                    krb->reqbuf.data = NULL;
                    if((ret = krb5_fwd_tgt_creds(krb->context, krb->authcon, NULL, krb->servcreds->client, krb->servcreds->server, 0, 1, &krb->reqbuf)) != 0)
                    {
-                       fprintf(stderr, "krb5_fwd_tgt_creds reported an error: %s\n", error_message(ret));
+                       message("krb5_fwd_tgt_creds reported an error: %s\n", error_message(ret));
                        dc_queuecmd(logincallback, data, L"pass", L"31", NULL);
                        krb->fwd = 0;
                        krb->state = 2;
@@ -298,6 +321,11 @@ static int init_krb5(struct logindata *data)
     krb5_data cksum;
     krb5_creds creds;
     
+    if(dc_gethostname() == NULL)
+    {
+       message("cannot use krb5 without a host name");
+       return(1);
+    }
     krb = smalloc(sizeof(*krb));
     memset(krb, 0, sizeof(*krb));
     krb->fwd = 1;
@@ -305,28 +333,28 @@ static int init_krb5(struct logindata *data)
     data->mechdata = krb;
     if((ret = krb5_init_context(&krb->context)) != 0)
     {
-       fprintf(stderr, "krb5_init_context reported an error: %s\n", error_message(ret));
+       message("krb5_init_context reported an error: %s\n", error_message(ret));
        return(1);
     }
     if((ret = krb5_auth_con_init(krb->context, &krb->authcon)) != 0)
     {
-       fprintf(stderr, "krb5_auth_con_init reported an error: %s\n", error_message(ret));
+       message("krb5_auth_con_init reported an error: %s\n", error_message(ret));
        return(1);
     }
     krb5_auth_con_setflags(krb->context, krb->authcon, KRB5_AUTH_CONTEXT_DO_SEQUENCE);
     if((ret = krb5_sname_to_principal(krb->context, dc_gethostname(), "doldacond", KRB5_NT_SRV_HST, &krb->sprinc)) != 0)
     {
-       fprintf(stderr, "krb5_sname_to_principal reported an error: %s\n", error_message(ret));
+       message("krb5_sname_to_principal reported an error: %s\n", error_message(ret));
        return(1);
     }
     if((ret = krb5_cc_default(krb->context, &krb->ccache)) != 0)
     {
-       fprintf(stderr, "krb5_cc_default reported an error: %s\n", error_message(ret));
+       message("krb5_cc_default reported an error: %s\n", error_message(ret));
        return(1);
     }
     if((ret = krb5_cc_get_principal(krb->context, krb->ccache, &krb->myprinc)) != 0)
     {
-       fprintf(stderr, "krb5_cc_default reported an error: %s\n", error_message(ret));
+       message("krb5_cc_default reported an error: %s\n", error_message(ret));
        return(1);
     }
     memset(&creds, 0, sizeof(creds));
@@ -334,7 +362,7 @@ static int init_krb5(struct logindata *data)
     creds.server = krb->sprinc;
     if((ret = krb5_get_credentials(krb->context, 0, krb->ccache, &creds, &krb->servcreds)) != 0)
     {
-       fprintf(stderr, "krb5_get_credentials reported an error: %s\n", error_message(ret));
+       message("krb5_get_credentials reported an error: %s\n", error_message(ret));
        return(1);
     }
     /* WTF is this checksum stuff?! The Krb docs don't say a word about it! */
@@ -342,7 +370,7 @@ static int init_krb5(struct logindata *data)
     cksum.length = strlen(cksum.data);
     if((ret = krb5_mk_req_extended(krb->context, &krb->authcon, AP_OPTS_MUTUAL_REQUIRED, &cksum, krb->servcreds, &krb->reqbuf)) != 0)
     {
-       fprintf(stderr, "krb5_mk_req_extended reported an error: %s\n", error_message(ret));
+       message("krb5_mk_req_extended reported an error: %s\n", error_message(ret));
        return(1);
     }
     free(cksum.data);
@@ -386,6 +414,12 @@ static struct authmech authmechs[] =
     },
 #endif
     {
+       .name = L"unix",
+       .process = process_authless,
+       .init = NULL,
+       .release = NULL
+    },
+    {
        .name = L"authless",
        .process = process_authless,
        .init = NULL,
@@ -456,7 +490,7 @@ static int logincallback(struct dc_response *resp)
                            if(authmechs[i].release != NULL)
                                authmechs[i].release(data);
                            data->mechdata = odata;
-                           fprintf(stderr, "authentication mechanism %ls failed, trying further...\n", authmechs[i].name);
+                           message("authentication mechanism %ls failed, trying further...\n", authmechs[i].name);
                        } else {
                            if((data->mech != NULL) && data->mech->release != NULL)
                            {
@@ -488,7 +522,7 @@ static int logincallback(struct dc_response *resp)
                    }
                    username = pwent->pw_name;
                }
-               dc_queuecmd(logincallback, data, L"login", data->mech->name, L"%%s", username, NULL);
+               dc_queuecmd(logincallback, data, L"login", data->mech->name, L"%s", username, NULL);
            }
        }
     } else if(!wcscmp(resp->cmdname, L"login") || !wcscmp(resp->cmdname, L"pass")) {
@@ -662,6 +696,7 @@ static void delpeer(struct dc_fnetpeer *peer)
            free(peer->di[i].d.str);
        putdatum(peer->fn, peer->di[i].datum);
     }
+    free(peer->di);
     free(peer);
 }
 
@@ -1037,9 +1072,9 @@ static int getpalistcallback(struct dc_response *resp)
            adddatum(fn, ires->argv[0].val.str, ires->argv[1].val.num);
            dc_freeires(ires);
        }
-       dc_queuecmd(getpeerlistcallback, data, L"lspeers", L"%%i", fn->id, NULL);
+       dc_queuecmd(getpeerlistcallback, data, L"lspeers", L"%i", fn->id, NULL);
     } else if(resp->code == 201) {
-       dc_queuecmd(getpeerlistcallback, data, L"lspeers", L"%%i", fn->id, NULL);
+       dc_queuecmd(getpeerlistcallback, data, L"lspeers", L"%i", fn->id, NULL);
     } else {
        data->callback(fn, resp->code, data->data);
        free(data);
@@ -1075,7 +1110,7 @@ void dc_getpeerlistasync(struct dc_fnetnode *fn, void (*callback)(struct dc_fnet
     data->callback = callback;
     data->fnid = fn->id;
     data->data = udata;
-    dc_queuecmd(getpalistcallback, data, L"lspa", L"%%i", fn->id, NULL);
+    dc_queuecmd(getpalistcallback, data, L"lspa", L"%i", fn->id, NULL);
 }
 
 void dc_uimisc_disconnected(void)