* main.c: Simplified.
authorWerner Koch <wk@gnupg.org>
Wed, 22 Dec 2004 14:32:45 +0000 (14:32 +0000)
committerWerner Koch <wk@gnupg.org>
Wed, 22 Dec 2004 14:32:45 +0000 (14:32 +0000)
* w32/dialog.h, w32/dialog.c, w32/controller.h, w32/controller.c:
Removed

* w32/resource.h, w32/pinentry-w32.rc, w32/main.c, w32/dialog.h
* w32/dialog.c, w32/controller.h, w32/controller.c
* w32/Makefile.am: New.  Based on Timo's work.

ChangeLog
w32/Makefile.am
w32/controller.c [deleted file]
w32/controller.h [deleted file]
w32/dialog.c [deleted file]
w32/dialog.h [deleted file]
w32/main.c

index f6d3fa9..3ec0ab1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2004-12-22  Werner Koch  <wk@g10code.com>
 
+       * main.c: Simplified.
+       * w32/dialog.h, w32/dialog.c, w32/controller.h, w32/controller.c:
+       Removed
+       
        * w32/resource.h, w32/pinentry-w32.rc, w32/main.c, w32/dialog.h
        * w32/dialog.c, w32/controller.h, w32/controller.c
        * w32/Makefile.am: New.  Based on Timo's work.
index 2d0adbd..6f4312b 100644 (file)
@@ -28,8 +28,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/assuan -I$(top_srcdir)/secmem \
 
 
 
-pinentry_w32_SOURCES = main.c pinentry-w32.tc resource.h \
-       controller.c controller.h  dialog.c dialog.h                   
+pinentry_w32_SOURCES = main.c pinentry-w32.rc resource.h
 
 pinentry_w32_LDFLAGS = -mwindows -mconsole
 pinentry_w32_LDADD = pinentry-w32.o \
diff --git a/w32/controller.c b/w32/controller.c
deleted file mode 100755 (executable)
index 5348a13..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-/* controller.c - A W32 dialog for PIN entry.
-   Copyright (C) 2004 g10 Code GmbH
-   
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA  */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <windows.h>
-
-#include "controller.h"
-#include "dialog.h"
-
-
-#define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
-                     *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
-#define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
-
-static void
-strcpy_escaped (char *d, const char *s)
-{
-  while (*s)
-    {
-      if (*s == '%' && s[1] && s[2])
-       {
-         s++;
-         *d++ = xtoi_2 (s);
-         s += 2;
-       }
-      else
-       *d++ = *s++;
-    }
-  *d = 0;
-}
-
-
-int
-pinentry_controller_new (struct pinentry_controller_s **ctx)
-{
-  struct pinentry_controller_s *c;
-  int rc;
-  int fds[2];
-
-  c = calloc (1, sizeof *c);
-  if (!c)
-    exit (1);
-  fds[0] = 0;
-  fds[1] = 1;
-
-  assuan_set_malloc_hooks (malloc, realloc, free);
-  rc = assuan_init_pipe_server (&c->_ctx, fds);
-  if (rc)
-    exit (-1);
-  rc = pinentry_ctl_registcmds (c);
-  assuan_set_pointer (c->_ctx, c);
-  *ctx = c;
-  return 0;
-}
-
-
-
-void
-pinentry_controller_free (struct pinentry_controller_s *c)
-{
-  if (c->_desc)
-    free (c->_desc);
-  if (c->_error)
-    free (c->_error);
-  if (c->_desc)
-    free (c->_desc);
-  if (c->_prompt)
-    free (c->_prompt);
-  if (c->_ok)
-    free (c->_ok);
-  if (c->_cancel)
-    free (c->_cancel);
-  assuan_deinit_server (c->_ctx);
-}
-
-
-void
-pinentry_ctrl_exec (struct pinentry_controller_s *c)
-{
-  while (1)
-    {
-      assuan_error_t rc = assuan_accept (c->_ctx);
-      if (rc == -1)
-       {
-         fprintf (stderr, "Assuan terminated");
-         break;
-       }
-      else if (rc)
-       {
-         fprintf (stderr, "Assuan accept problem: %s", assuan_strerror (rc));
-         break;
-       }
-      rc = assuan_process (c->_ctx);
-      if (rc)
-       {
-         fprintf (stderr, "Assuan processing failed: %s",
-                  assuan_strerror (rc));
-         continue;
-       }
-    }
-}
-
-
-int
-pinentry_ctl_desc (ASSUAN_CONTEXT ctx, char *line)
-{
-  struct pinentry_controller_s *c;
-  char *newl;
-
-  c = (struct pinentry_controller_s *) assuan_get_pointer (ctx);
-  fprintf (stderr, "ctl_desc %s\n", line);
-
-  newl = malloc (strlen (line) + 1);
-  strcpy_escaped (newl, line);
-
-  c->_desc = strdup (newl);    /*UTF8 */
-  c->_error = NULL;
-
-  free (newl);
-  return 0;
-}
-
-
-int
-pinentry_ctl_prompt (ASSUAN_CONTEXT ctx, char *line)
-{
-  struct pinentry_controller_s *c;
-  char *newl;
-
-  c = (struct pinentry_controller_s *) assuan_get_pointer (ctx);
-
-  fprintf (stderr, "ctl_prompt %s\n", line);
-
-  newl = malloc (strlen (line) + 1);
-  strcpy_escaped (newl, line);
-
-  c->_prompt = strdup (newl);  /*UTF8 */
-  c->_error = NULL;
-
-  free (newl);
-  return 0;
-}
-
-
-int
-pinentry_ctl_error (ASSUAN_CONTEXT ctx, char *line)
-{
-  struct pinentry_controller_s *c;
-  char *newl;
-
-  c = (struct pinentry_controller_s *) assuan_get_pointer (ctx);
-
-  fprintf (stderr, "error %s", line);
-
-  newl = malloc (strlen (line) + 1);
-  strcpy_escaped (newl, line);
-
-  c->_error = strdup (newl);   /* UTF8 */
-
-  free (newl);
-  return 0;
-}
-
-int
-pinentry_ctl_ok (ASSUAN_CONTEXT ctx, char *line)
-{
-  struct pinentry_controller_s *c;
-  char *newl;
-
-  c = (struct pinentry_controller_s *) assuan_get_pointer (ctx);
-
-  fprintf (stderr, "OK %s\n", line);
-
-  newl = malloc (strlen (line) + 1);
-  strcpy_escaped (newl, line);
-
-  c->_ok = strdup (line);
-
-  free (newl);
-  return 0;
-}
-
-int
-pinentry_ctl_cancel (ASSUAN_CONTEXT ctx, char *line)
-{
-  struct pinentry_controller_s *c;
-  char *newl;
-
-  c = (struct pinentry_controller_s *) assuan_get_pointer (ctx);
-
-  fprintf (stderr, "cancel %s\n", line);
-
-  newl = malloc (strlen (line) + 1);
-  strcpy_escaped (newl, line);
-
-  c->_cancel = strdup (line);
-
-  free (newl);
-  return 0;
-}
-
-
-int
-_pinentry_ctl_getpin (struct pinentry_controller_s *c, char *line)
-{
-  int ret;
-  FILE *fp;
-
-  if (c->_pinentry == NULL)
-    c->_pinentry = pinentry_new (NULL);
-
-  pinentry_set_prompt (c->_pinentry, c->_prompt);
-  pinentry_set_description (c->_pinentry, c->_desc);
-  pinentry_set_text (c->_pinentry, NULL);
-  if (c->_ok)
-    pinentry_set_ok_text (c->_pinentry, c->_ok);
-  if (c->_cancel)
-    pinentry_set_cancel_text (c->_pinentry, c->_cancel);
-  if (c->_error)
-    pinentry_set_error (c->_pinentry, c->_error);
-
-  ret = pinentry_exec (c->_pinentry);
-  fp = NULL; /* We can't use that: assuan_get_data_fp (c->_ctx); */
-  if (ret)
-    {
-      char *p;
-      p = (char *) pinentry_text (c->_pinentry);
-      fputs (p /*UTF8 */ , fp);
-      return 0;
-    }
-  else
-    {
-      assuan_set_error (c->_ctx, ASSUAN_Canceled, "Dialog cancelled by user");
-      return ASSUAN_Canceled;
-    }
-}
-
-
-int
-pinentry_ctl_getpin (ASSUAN_CONTEXT ctx, char *line)
-{
-  struct pinentry_controller_s *c;
-
-  c = (struct pinentry_controller_s *) assuan_get_pointer (ctx);
-
-  fprintf (stderr, "getpin %s\n", line);
-  return _pinentry_ctl_getpin (c, line);
-}
-
-
-int
-_pinentry_ctl_confirm (struct pinentry_controller_s *c, char *line)
-{
-  int ret;
-  FILE *fp;
-
-  if (c->_error)
-    ret = MessageBox (NULL, c->_error, "Error", MB_YESNO | MB_ICONERROR);
-  else
-    ret =
-      MessageBox (NULL, c->_desc, "Information",
-                 MB_YESNO | MB_ICONINFORMATION);
-  fp = NULL; /* We can't use that: assuan_get_data_fp (c->_ctx); */
-  if (ret == IDYES)
-    {
-      //fputs( "YES", fp );    
-      return ASSUAN_No_Error;
-    }
-  else
-    {
-      //fputs( "NO", fp );
-      return ASSUAN_Not_Confirmed;
-    }
-}
-
-
-int
-pinentry_ctl_confirm (ASSUAN_CONTEXT ctx, char *line)
-{
-  struct pinentry_controller_s *c;
-
-  c = (struct pinentry_controller_s *) assuan_get_pointer (ctx);
-
-  fprintf (stderr, "confirm %s\n", line);
-
-  return _pinentry_ctl_confirm (c, line);
-}
-
-
-
-int
-pinentry_ctl_opthandler (ASSUAN_CONTEXT ctx, const char *key,
-                        const char *value)
-{
-  struct pinentry_controller_s *c;
-
-  c = (struct pinentry_controller_s *) assuan_get_pointer (ctx);
-
-  /* FIXME: For now we simply ignore all options.  This module should
-     be converted to make use of the pinentry framework. */
-  return 0;
-}
-
-int
-pinentry_ctl_registcmds (struct pinentry_controller_s *c)
-{
-  static struct
-  {
-    const char *name;
-    int (*handler) (ASSUAN_CONTEXT, char *line);
-  } table[] =
-  {
-    {
-    "SETDESC", pinentry_ctl_desc},
-    {
-    "SETPROMPT", pinentry_ctl_prompt},
-    {
-    "SETERROR", pinentry_ctl_error},
-    {
-    "SETOK", pinentry_ctl_ok},
-    {"SETCANCEL", pinentry_ctl_cancel},
-    {
-    "GETPIN", pinentry_ctl_getpin},
-    {
-    "CONFIRM", pinentry_ctl_confirm},
-    {
-    0, 0}
-  };
-  int i, rc;
-
-  for (i = 0; table[i].name; i++)
-    {
-      rc = assuan_register_command (c->_ctx, 0, table[i].name, table[i].handler);
-      if (rc)
-       return rc;
-    }
-  assuan_register_option_handler (c->_ctx, pinentry_ctl_opthandler);
-  return 0;
-}
diff --git a/w32/controller.h b/w32/controller.h
deleted file mode 100755 (executable)
index 40394be..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* controller.h - A W32 dialog for PIN entry.
-   Copyright (C) 2004 g10 Code GmbH
-   
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA  */
-
-#ifndef W32_CONTROLLER_H
-#define W32_CONTROLLER_H
-
-#include "assuan.h"
-
-
-struct pinentry_controller_s
-{
-  ASSUAN_CONTEXT _ctx;
-  char *_desc;
-  char *_error;
-  char *_prompt;
-  char *_ok;
-  char *_cancel;
-  struct w32_pinentry_s *_pinentry;
-};
-
-
-int pinentry_ctl_registcmds (struct pinentry_controller_s *c);
-void pinentry_controller_free (struct pinentry_controller_s *c);
-void pinentry_ctrl_exec (struct pinentry_controller_s *c);
-
-#endif /*W32_CONTROLLER_H*/
diff --git a/w32/dialog.c b/w32/dialog.c
deleted file mode 100755 (executable)
index 28e415d..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-/* dialog.c - A W32 dialog for PIN entry.
-   Copyright (C) 2004 g10 Code GmbH
-   
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA  */
-
-#include <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <windows.h>
-
-#include "resource.h"
-#include "dialog.h"
-
-BOOL CALLBACK
-pinentry_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
-{
-  static struct w32_pinentry_s *ctx;
-
-  switch (msg)
-    {
-    case WM_INITDIALOG:
-      ctx = (struct w32_pinentry_s *) lparam;
-      ctx->dlg = dlg;
-      SetForegroundWindow (dlg);
-      break;
-
-    case WM_COMMAND:
-      switch (LOWORD (wparam))
-       {
-       case IDOK:
-         EndDialog (dlg, TRUE);
-         break;
-
-       case IDCANCEL:
-         EndDialog (dlg, FALSE);
-         break;
-       }
-      break;
-    }
-  return FALSE;
-}
-
-
-struct w32_pinentry_s *
-pinentry_new (HINSTANCE h)
-{
-  struct w32_pinentry_s *c;
-
-  c = calloc (1, sizeof *c);
-  if (!c)
-    return NULL;
-  DialogBoxParam (h, (LPCTSTR) IDD_PINENT, GetDesktopWindow (),
-                 pinentry_dlg_proc, (LONG) c);
-  return c;
-}
-
-
-int
-pinentry_exec (struct w32_pinentry_s *c)
-{
-  ShowWindow (c->dlg, TRUE);
-  return TRUE;
-}
-
-
-void
-pinentry_set_description (struct w32_pinentry_s *ctx, const char *s)
-{
-  if (!s)
-    SetDlgItemText (ctx->dlg, IDC_PINENT_DESC, "");
-  else
-    SetDlgItemText (ctx->dlg, IDC_PINENT_DESC, s);
-  SetDlgItemText (ctx->dlg, IDC_PINENT_ERR, "");
-}
-
-
-const char *
-pinentry_description (struct w32_pinentry_s *ctx)
-{
-  static char buf[256];
-  GetDlgItemText (ctx->dlg, IDC_PINENT_DESC, buf, 256);
-  return buf;
-}
-
-
-void
-pinentry_set_error (struct w32_pinentry_s *ctx, const char *s)
-{
-  if (!s)
-    SetDlgItemText (ctx->dlg, IDC_PINENT_ERR, "");
-  else
-    SetDlgItemText (ctx->dlg, IDC_PINENT_ERR, s);
-}
-
-
-const char *
-pinentry_error (struct w32_pinentry_s *ctx)
-{
-  static char buf[256];
-  GetDlgItemText (ctx->dlg, IDC_PINENT_ERR, buf, 256);
-  return buf;
-}
-
-
-void
-pinentry_set_text (struct w32_pinentry_s *ctx, const char *s)
-{
-  if (!s)
-    SetDlgItemText (ctx->dlg, IDC_PINENT_TEXT, "");
-  else
-    SetDlgItemText (ctx->dlg, IDC_PINENT_TEXT, s);
-}
-
-
-const char *
-pinentry_text (struct w32_pinentry_s *ctx)
-{
-  static char buf[256];
-  GetDlgItemText (ctx->dlg, IDC_PINENT_TEXT, buf, 256);
-  return buf;
-}
-
-
-void
-pinentry_set_prompt (struct w32_pinentry_s *ctx, const char *s)
-{
-  if (!s)
-    SetDlgItemText (ctx->dlg, IDC_PINENT_PROMPT, "");
-  else
-    SetDlgItemText (ctx->dlg, IDC_PINENT_PROMPT, s);
-}
-
-
-
-const char *
-pinentry_prompt (struct w32_pinentry_s *ctx)
-{
-  static char buf[256];
-  GetDlgItemText (ctx->dlg, IDC_PINENT_PROMPT, buf, 256);
-  return buf;
-}
-
-
-void
-pinentry_set_ok_text (struct w32_pinentry_s *ctx, const char *s)
-{
-  if (!s)
-    SetDlgItemText (ctx->dlg, IDOK, "OK");
-  else
-    SetDlgItemText (ctx->dlg, IDOK, s);
-}
-
-void
-pinentry_set_cancel_text (struct w32_pinentry_s *ctx, const char *s)
-{
-  if (!s)
-    SetDlgItemText (ctx->dlg, IDCANCEL, "Cancel");
-  else
-    SetDlgItemText (ctx->dlg, IDCANCEL, s);
-}
diff --git a/w32/dialog.h b/w32/dialog.h
deleted file mode 100755 (executable)
index b53f718..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/* dialog.h - A W32 dialog for PIN entry.
-   Copyright (C) 2004 g10 Code GmbH
-   
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA  */
-
-#ifndef W32_DIALOG_H
-#define W32_DIALOG_H
-
-struct w32_pinentry_s
-{
-  HWND dlg;
-};
-
-
-BOOL CALLBACK pinentry_dlg_proc (HWND dlg, UINT msg, WPARAM wparam,
-                                LPARAM lparam);
-struct w32_pinentry_s *pinentry_new (HINSTANCE h);
-int pinentry_exec (struct w32_pinentry_s *c);
-void pinentry_set_description (struct w32_pinentry_s *ctx, const char *s);
-const char *pinentry_description (struct w32_pinentry_s *ctx);
-void pinentry_set_error (struct w32_pinentry_s *ctx, const char *s);
-const char *pinentry_error (struct w32_pinentry_s *ctx);
-void pinentry_set_text (struct w32_pinentry_s *ctx, const char *s);
-const char *pinentry_text (struct w32_pinentry_s *ctx);
-void pinentry_set_prompt (struct w32_pinentry_s *ctx, const char *s);
-const char *pinentry_prompt (struct w32_pinentry_s *ctx);
-void pinentry_set_ok_text (struct w32_pinentry_s *ctx, const char *s);
-void pinentry_set_cancel_text (struct w32_pinentry_s *ctx, const char *s);
-
-#endif /*W32_DIALOG_H*/
index 6540c51..2309eeb 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
+#include <config.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <windows.h>
 
-#include "dialog.h"
-#include "controller.h"
+#include "pinentry.h"
+#include "memory.h"
+
+#include "resource.h"
+
+
+#define PGMNAME "pinentry-w32"
+
+
+static int w32_cmd_handler (pinentry_t pe);
+
+
+/* We use gloabl variables for the state, becuase there should never
+   ever be a second instance.  */
+static HWND dialog_handle;
+static int passphrase_ok = 0;
+
+
+/* Connect this module to the pinnetry framework.  */
+pinentry_cmd_handler_t pinentry_cmd_handler = w32_cmd_handler;
+
+
+
+/* Dialog processing loop.  */
+static BOOL CALLBACK
+dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+  switch (msg)
+    {
+    case WM_INITDIALOG:
+      dialog_handle = dlg;
+      SetForegroundWindow (dlg);
+      break;
+
+    case WM_COMMAND:
+      switch (LOWORD (wparam))
+       {
+       case IDOK:
+         EndDialog (dlg, TRUE);
+         break;
+
+       case IDCANCEL:
+         EndDialog (dlg, FALSE);
+         break;
+       }
+      break;
+    }
+  return FALSE;
+}
+
+
+/* The okay button has been clicked or the enter enter key in the text
+   field.  */
+static void
+ok_button_clicked (pinentry_t pe)
+{
+  char *s_utf8;
+  char *s_buffer;
+  size_t s_buffer_size = 256;
+  
+  pe->locale_err = 1;
+  s_buffer = secmem_malloc (s_buffer_size + 1);
+  if (!s_buffer)
+    return;
+
+  GetDlgItemText (dialog_handle, IDC_PINENT_TEXT, s_buffer, s_buffer_size);
+/*   s_utf8 = pinentry_local_to_utf8 (pe->lc_ctype, s_buffer, 1); */
+/*   secmem_free (s_buffer); */
+  s_utf8 = s_buffer;   /* FIXME */
+  if (s_utf8)
+    {
+      passphrase_ok = 1;
+      pinentry_setbufferlen (pe, strlen (s_utf8) + 1);
+      if (pe->pin)
+        strcpy (pe->pin, s_utf8);
+/*       secmem_free (s_utf8); */
+      pe->locale_err = 0;
+    }
+}
+
+
+static void
+set_prompt (const char *s)
+{
+  if (!s)
+    s = "";
+  SetDlgItemText (dialog_handle, IDC_PINENT_PROMPT, s);
+}
+
+static void
+set_description (const char *s)
+{
+  if (!s)
+    s = "";
+  SetDlgItemText (dialog_handle, IDC_PINENT_DESC, s);
+}
+
+static void
+set_text (const char *s)
+{
+  if (!s)
+    s = "";
+  SetDlgItemText (dialog_handle, IDC_PINENT_TEXT, s);
+}
+
+static void
+set_ok_text (const char *s)
+{
+  if (!s)
+    s = "OK";
+  SetDlgItemText (dialog_handle, IDOK, s);
+}
+
+static void
+set_cancel_text (const char *s)
+{
+  if (!s)
+    s = "Cancel";
+  SetDlgItemText (dialog_handle, IDCANCEL, s);
+}
+
+static void
+set_error (const char *s)
+{
+  if (!s)
+    s = "";
+  SetDlgItemText (dialog_handle, IDC_PINENT_ERR, s);
+}
+
+
+static int
+w32_cmd_handler (pinentry_t pe)
+{
+  int want_pass = !!pe->pin;
+
+  passphrase_ok = 0;
+
+  if (want_pass)
+    {
+      DialogBoxParam (NULL, (LPCTSTR) IDD_PINENT,
+                      GetDesktopWindow (), dlg_proc, 0);
+      set_prompt (pe->prompt);
+      set_description (pe->description);
+      set_text (NULL);
+      if (pe->ok)
+        set_ok_text (pe->ok);
+      if (pe->cancel)
+        set_cancel_text (pe->cancel);
+      if (pe->error)
+        set_error (pe->error);
+
+      ShowWindow (dialog_handle, TRUE);
+      ok_button_clicked (pe);
+      if (passphrase_ok && pe->pin)
+       return strlen (pe->pin);
+      else
+       return -1;
+    }
+  else /* Confirmation mode.  */
+    {
+      int ret;
+
+      if (pe->error)
+        ret = MessageBox (NULL, pe->error, "Error", MB_YESNO | MB_ICONERROR);
+      else
+        ret = MessageBox (NULL, pe->description?pe->description:"",
+                          "Information", MB_YESNO | MB_ICONINFORMATION);
+      if (ret == IDYES)
+        return 1;
+      else
+        return 0;
+    }
+
+}
 
 
-/* int WINAPI */
-/* WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd) */
 int
-main ()
+main (int argc, char **argv)
 {
-  struct pinentry_controller_s ctl;
+  pinentry_init (PGMNAME);
+
+  /* Consumes all arguments.  */
+  if (pinentry_parse_opts (argc, argv))
+    {
+      printf ("pinentry-w32 (pinentry) " VERSION "\n");
+      exit (EXIT_SUCCESS);
+    }
+
+  if (pinentry_loop ())
+    return 1;
 
-  fprintf (stderr, "enter main\n");
-  pinentry_ctrl_exec (&ctl);
-  fprintf (stderr, "debug 1\n");
-  pinentry_controller_free (&ctl);
-  fprintf (stderr, "leave main\n");
   return 0;
 }