1 /*
2  *  dsnchooser.c
3  *
4  *  $Id$
5  *
6  *  The iODBC driver manager.
7  *
8  *  Copyright (C) 1996-2021 OpenLink Software <iodbc@openlinksw.com>
9  *  All Rights Reserved.
10  *
11  *  This software is released under the terms of either of the following
12  *  licenses:
13  *
14  *      - GNU Library General Public License (see LICENSE.LGPL)
15  *      - The BSD License (see LICENSE.BSD).
16  *
17  *  Note that the only valid version of the LGPL license as far as this
18  *  project is concerned is the original GNU Library General Public License
19  *  Version 2, dated June 1991.
20  *
21  *  While not mandated by the BSD license, any patches you make to the
22  *  iODBC source code may be contributed back into the iODBC project
23  *  at your discretion. Contributions will benefit the Open Source and
24  *  Data Access community as a whole. Submissions may be made at:
25  *
26  *      http://www.iodbc.org
27  *
28  *
29  *  GNU Library Generic Public License Version 2
30  *  ============================================
31  *  This library is free software; you can redistribute it and/or
32  *  modify it under the terms of the GNU Library General Public
33  *  License as published by the Free Software Foundation; only
34  *  Version 2 of the License dated June 1991.
35  *
36  *  This library is distributed in the hope that it will be useful,
37  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
38  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
39  *  Library General Public License for more details.
40  *
41  *  You should have received a copy of the GNU Library General Public
42  *  License along with this library; if not, write to the Free
43  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
44  *
45  *
46  *  The BSD License
47  *  ===============
48  *  Redistribution and use in source and binary forms, with or without
49  *  modification, are permitted provided that the following conditions
50  *  are met:
51  *
52  *  1. Redistributions of source code must retain the above copyright
53  *     notice, this list of conditions and the following disclaimer.
54  *  2. Redistributions in binary form must reproduce the above copyright
55  *     notice, this list of conditions and the following disclaimer in
56  *     the documentation and/or other materials provided with the
57  *     distribution.
58  *  3. Neither the name of OpenLink Software Inc. nor the names of its
59  *     contributors may be used to endorse or promote products derived
60  *     from this software without specific prior written permission.
61  *
62  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
63  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
64  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
65  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OPENLINK OR
66  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
67  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
68  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
69  *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
70  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
71  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
72  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
73  */
74 
75 #include <iodbc.h>
76 #include <iodbcext.h>
77 
78 #include <stdio.h>
79 #include <sys/types.h>
80 #include <sys/stat.h>
81 #include <sys/param.h>
82 #include <dirent.h>
83 #include <errno.h>
84 
85 #include <sqltypes.h>
86 #include <dlproc.h>
87 
88 #include "../gui.h"
89 #include "odbc4.xpm"
90 
91 
92 #ifndef MAXPATHLEN
93 #define MAXPATHLEN	1024
94 #endif
95 
96 /*
97  *  Linux glibc has the function, but does not have the prototype
98  *  with the default header files.
99  */
100 #if defined(HAVE_ASPRINTF) && defined(__GLIBC__)
101 extern int asprintf (char **ret, const char *format, ...);
102 #endif
103 
104 
105 char *szDSNColumnNames[] = {
106   "Name",
mbc_case_fold(OnigCaseFoldType flag,const UChar ** pp,const UChar * end ARG_UNUSED,UChar * lower)107   "Description",
108   "Driver"
109 };
110 
111 char *szTabNames[] = {
112   "User DSN",
113   "System DSN",
114   "File DSN",
115   "ODBC Drivers",
116   "Connection Pooling",
117   "Tracing",
118   "About"
119 };
120 
121 char *szDSNButtons[] = {
122   "_Add",
123   "_Remove",
124   "Confi_gure",
is_code_ctype(OnigCodePoint code,unsigned int ctype)125   "_Test",
126   "_Set Dir",
127 };
128 
129 
130 void
131 addlistofdir_to_optionmenu (GtkWidget *widget, LPCSTR path,
132     TDSNCHOOSER *choose_t)
133 {
134   GtkWidget *menu, *menu_item;
135   char *curr_dir, *prov, *dir;
136   void **array;
137 
138   if (!path || !GTK_IS_OPTION_MENU (widget) || !(prov = strdup (path)))
139     return;
140 
141   if (prov[STRLEN (prov) - 1] == '/' && STRLEN (prov) > 1)
142     prov[STRLEN (prov) - 1] = 0;
143 
144   /* Add the root directory */
145   menu = gtk_menu_new ();
146   menu_item = gtk_menu_item_new_with_label ("/");
147   gtk_widget_show (menu_item);
148   gtk_menu_prepend (GTK_MENU (menu), menu_item);
149   if (!(array = (void **) malloc (sizeof (void *) * 2)))
150     return;
151   array[0] = g_strdup ("/");
152   array[1] = choose_t;
153   gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
154       GTK_SIGNAL_FUNC (filedsn_lookin_clicked), array);
155 
156   for (curr_dir = prov, dir = NULL; curr_dir;
157       curr_dir = strchr (curr_dir + 1, '/'))
158     {
159       if (strchr (curr_dir + 1, '/'))
160 	{
161 	  dir = strchr (curr_dir + 1, '/');
162 	  *dir = 0;
163 	}
164 
165       menu_item = gtk_menu_item_new_with_label (prov);
166       gtk_widget_show (menu_item);
167       gtk_menu_prepend (GTK_MENU (menu), menu_item);
apply_all_case_fold(OnigCaseFoldType flag,OnigApplyAllCaseFoldFunc f,void * arg)168       if (!(array = (void **) malloc (sizeof (void *) * 2)))
169 	return;
170       array[0] = g_strdup (prov);
171       array[1] = choose_t;
172       gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
173 	  GTK_SIGNAL_FUNC (filedsn_lookin_clicked), array);
174       if (dir)
175 	*dir = '/';
176     }
get_case_fold_codes_by_str(OnigCaseFoldType flag,const OnigUChar * p,const OnigUChar * end,OnigCaseFoldCodeItem items[])177 
178   gtk_option_menu_remove_menu (GTK_OPTION_MENU (widget));
179   gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu);
180 
181   free (prov);
182 }
183 
184 
185 void
186 adddirectories_to_list (HWND hwnd, GtkWidget *widget, LPCSTR path)
187 {
188   DIR *dir;
189 #if defined (HAVE_ASPRINTF)
190   char *path_buf;
191 #else
192   char path_buf[MAXPATHLEN];
193 #endif
194   struct dirent *dir_entry;
195   struct stat fstat;
196   char *data[1];
197 
198   if (!path || !GTK_IS_CLIST (widget))
199     return;
200 
201   if ((dir = opendir (path)))
202     {
203       /* Remove all the entries */
204       gtk_clist_clear (GTK_CLIST (widget));
205 
206       while ((dir_entry = readdir (dir)))
207 	{
208 #if defined (HAVE_ASPRINTF)
209 	  asprintf (&path_buf, "%s/%s", path, dir_entry->d_name);
210 #elif defined (HAVE_SNPRINTF)
211 	  snprintf (path_buf, sizeof (path_buf), "%s/%s",
212 	      path, dir_entry->d_name);
213 #else
214 	  STRCPY (path_buf, path);
215 	  if (path[STRLEN (path) - 1] != '/')
216 	    STRCAT (path_buf, "/");
217 	  STRCAT (path_buf, dir_entry->d_name);
218 #endif
219 
220 	  if (stat ((LPCSTR) path_buf, &fstat) >= 0
221 	      && S_ISDIR (fstat.st_mode))
222 	    if (strcmp (path, "/") || strcmp (dir_entry->d_name, ".."))
223 	      {
224 		data[0] = dir_entry->d_name;
225 		gtk_clist_append (GTK_CLIST (widget), data);
226 	      }
227 
228 #if defined (HAVE_ASPRINTF)
229 	  free (path_buf);
230 #endif
231 	}
232 
233       /* Close the directory entry */
234       closedir (dir);
235 
236       if (GTK_CLIST (widget)->rows > 0)
237 	gtk_clist_sort (GTK_CLIST (widget));
238     }
239   else
240     create_error (hwnd, NULL, "Error during accessing directory information:",
241 	strerror (errno));
242 }
243 
244 
245 void
246 addfiles_to_list (HWND hwnd, GtkWidget *widget, LPCSTR path)
247 {
248   DIR *dir;
249 #if defined (HAVE_ASPRINTF)
250   char *path_buf;
251 #else
252   char path_buf[MAXPATHLEN];
253 #endif
254   struct dirent *dir_entry;
255   struct stat fstat;
256   char *data[1];
257 
258   if (!path || !GTK_IS_CLIST (widget))
259     return;
260 
261   if ((dir = opendir (path)))
262     {
263       /* Remove all the entries */
264       gtk_clist_clear (GTK_CLIST (widget));
265 
266       while ((dir_entry = readdir (dir)))
267 	{
268 #if defined (HAVE_ASPRINTF)
269 	  asprintf (&path_buf, "%s/%s", path, dir_entry->d_name);
270 #elif defined (HAVE_SNPRINTF)
271 	  snprintf (path_buf, sizeof (path_buf), "%s/%s",
272 	      path, dir_entry->d_name);
273 #else
274 	  STRCPY (path_buf, path);
275 	  if (path[STRLEN (path) - 1] != '/')
276 	    STRCAT (path_buf, "/");
277 	  STRCAT (path_buf, dir_entry->d_name);
278 #endif
279 
280 	  if (stat ((LPCSTR) path_buf, &fstat) >= 0
281 	      && !S_ISDIR (fstat.st_mode)
282 	      && strstr (dir_entry->d_name, ".dsn"))
283 	    {
284 	      data[0] = dir_entry->d_name;
285 	      gtk_clist_append (GTK_CLIST (widget), data);
286 	    }
287 
288 #if defined (HAVE_ASPRINTF)
289 	  free (path_buf);
290 #endif
291 	}
292 
293       /* Close the directory entry */
294       closedir (dir);
295 
296       if (GTK_CLIST (widget)->rows > 0)
297 	gtk_clist_sort (GTK_CLIST (widget));
298     }
299 }
300 
301 
302 void
303 adddsns_to_list (GtkWidget *widget, BOOL systemDSN)
304 {
305   char *curr, *buffer = (char *) malloc (sizeof (char) * 65536);
306   char diz[1024], driver[1024];
307   char *data[3];
308   int len, _case = 0;
309 
310   if (!buffer || !GTK_IS_CLIST (widget))
311     return;
312   gtk_clist_clear (GTK_CLIST (widget));
313 
314   /* Get the list of DSN in the user context */
315   SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN);
316   len =
317       SQLGetPrivateProfileString ("ODBC Data Sources", NULL, "", buffer,
318       65536, NULL);
319   if (len)
320     goto process;
321 
322   _case = 1;
323   SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN);
324   len =
325       SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", NULL, "",
326       buffer, 65536, NULL);
327   if (len)
328     goto process;
329 
330   goto end;
331 
332 process:
333   for (curr = buffer; *curr; curr += (STRLEN (curr) + 1))
334     {
335       SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN);
336       SQLGetPrivateProfileString (curr, "Description", "", diz, sizeof (diz),
337 	  NULL);
338       SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN);
339       switch (_case)
340 	{
341 	case 0:
342 	  SQLGetPrivateProfileString ("ODBC Data Sources", curr, "", driver,
343 	      sizeof (driver), NULL);
344 	  break;
345 	case 1:
346 	  SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", curr, "",
347 	      driver, sizeof (driver), NULL);
348 	  break;
349 	};
350 
351       if (STRLEN (curr) && STRLEN (driver))
352 	{
353 	  data[0] = curr;
354 	  data[1] = diz;
355 	  data[2] = driver;
356 	  gtk_clist_append (GTK_CLIST (widget), data);
357 	}
358     }
359 
360 end:
361   SQLSetConfigMode (ODBC_BOTH_DSN);
362 
363   if (GTK_CLIST (widget)->rows > 0)
364     {
365       gtk_clist_columns_autosize (GTK_CLIST (widget));
366       gtk_clist_sort (GTK_CLIST (widget));
367     }
368 
369   /* Make the clean up */
370   free (buffer);
371 }
372 
373 
374 static void
375 dsnchooser_switch_page (GtkNotebook *notebook, GtkNotebookPage *page,
376     gint page_num, TDSNCHOOSER *choose_t)
377 {
378   switch (page_num)
379     {
380     case 0:
381       if (choose_t)
382 	{
383 	  choose_t->type_dsn = USER_DSN;
384 	  adddsns_to_list (choose_t->udsnlist, FALSE);
385 	}
386       break;
387 
388     case 1:
389       if (choose_t)
390 	{
391 	  choose_t->type_dsn = SYSTEM_DSN;
392 	  adddsns_to_list (choose_t->sdsnlist, TRUE);
393 	}
394       break;
395 
396     case 2:
397       if (choose_t)
398 	{
399 	  choose_t->type_dsn = FILE_DSN;
400           addlistofdir_to_optionmenu(choose_t->dir_combo,
401 	      choose_t->curr_dir, choose_t);
402           adddirectories_to_list(choose_t->mainwnd,
403 	      choose_t->dir_list, choose_t->curr_dir);
404           addfiles_to_list(choose_t->mainwnd,
405 	      choose_t->file_list, choose_t->curr_dir);
406 	}
407       break;
408     };
409 
410   if (choose_t)
411     {
412       if (choose_t->uremove)
413 	gtk_widget_set_sensitive (choose_t->uremove, FALSE);
414       if (choose_t->uconfigure)
415 	gtk_widget_set_sensitive (choose_t->uconfigure, FALSE);
416       if (choose_t->utest)
417 	gtk_widget_set_sensitive (choose_t->utest, FALSE);
418       if (choose_t->sremove)
419 	gtk_widget_set_sensitive (choose_t->sremove, FALSE);
420       if (choose_t->sconfigure)
421 	gtk_widget_set_sensitive (choose_t->sconfigure, FALSE);
422       if (choose_t->stest)
423 	gtk_widget_set_sensitive (choose_t->stest, FALSE);
424       if (choose_t->fremove)
425         gtk_widget_set_sensitive(choose_t->fremove, FALSE);
426       if (choose_t->fconfigure)
427         gtk_widget_set_sensitive(choose_t->fconfigure, FALSE);
428       if (choose_t->ftest)
429         gtk_widget_set_sensitive(choose_t->ftest, FALSE);
430     }
431 }
432 
433 
434 static BOOL
435 test_driver_connect (TDSNCHOOSER *choose_t, char *connstr)
436 {
437   HENV henv;
438   HDBC hdbc;
439 
440 #if (ODBCVER < 0x300)
441   if (SQLAllocEnv (&henv) != SQL_SUCCESS)
442 #else
443   if (SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv) != SQL_SUCCESS)
444 #endif
445     {
446       _iodbcdm_nativeerrorbox (choose_t->mainwnd,
447 	  henv, SQL_NULL_HDBC, SQL_NULL_HSTMT);
448       return FALSE;
449     }
450 
451   SQLSetEnvAttr (henv, SQL_ATTR_APP_UNICODE_TYPE,
452       (SQLPOINTER) SQL_DM_CP_DEF, SQL_IS_UINTEGER);
453 
454 #if (ODBCVER < 0x300)
455   if (SQLAllocConnect (henv, &hdbc) != SQL_SUCCESS)
456 #else
457   SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION,
458       (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER);
459   if (SQLAllocHandle (SQL_HANDLE_DBC, henv, &hdbc) != SQL_SUCCESS)
460 #endif
461     {
462       _iodbcdm_nativeerrorbox (choose_t->mainwnd, henv, hdbc, SQL_NULL_HSTMT);
463       SQLFreeEnv (henv);
464       return FALSE;
465     }
466 
467   switch (choose_t->type_dsn)
468     {
469     case USER_DSN:
470       SQLSetConfigMode (ODBC_USER_DSN);
471       break;
472     case SYSTEM_DSN:
473       SQLSetConfigMode (ODBC_SYSTEM_DSN);
474       break;
475     case FILE_DSN:
476       SQLSetConfigMode (ODBC_BOTH_DSN);
477       break;
478     }
479   if (SQLDriverConnect (hdbc, choose_t->mainwnd, connstr, SQL_NTS,
480           NULL, 0, NULL, SQL_DRIVER_PROMPT) != SQL_SUCCESS)
481     {
482       _iodbcdm_nativeerrorbox (choose_t->mainwnd, henv, hdbc, SQL_NULL_HSTMT);
483       SQLFreeEnv (henv);
484       return FALSE;
485     }
486   else
487     SQLDisconnect (hdbc);
488 
489 #if (ODBCVER < 0x300)
490   SQLFreeConnect (hdbc);
491   SQLFreeEnv (henv);
492 #else
493   SQLFreeHandle (SQL_HANDLE_DBC, hdbc);
494   SQLFreeHandle (SQL_HANDLE_ENV, henv);
495 #endif
496 
497   return TRUE;
498 }
499 
500 
501 void
502 userdsn_add_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
503 {
504   char connstr[4096] = { "" };
505   char drv[1024] = { ""};
506   int sqlstat;
507   DWORD error;
508 
509   if (choose_t)
510     {
511       /* Try first to get the driver name */
512       SQLSetConfigMode (ODBC_USER_DSN);
513       if (_iodbcdm_drvchoose_dialbox (choose_t->mainwnd, drv,
514       	sizeof (drv), &sqlstat) == SQL_SUCCESS)
515 	{
516 	  SQLSetConfigMode (ODBC_USER_DSN);
517 	  if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_ADD_DSN,
518 		  drv + STRLEN ("DRIVER="), connstr))
519 	    {
520 	      if (SQLInstallerError (1, &error, connstr,
521 	         sizeof (connstr), NULL) != SQL_NO_DATA)
522 		_iodbcdm_errorbox (choose_t->mainwnd, NULL,
523 		    "An error occurred when trying to add the DSN : ");
524 	      goto done;
525 	    }
526 
527 	  adddsns_to_list (choose_t->udsnlist, FALSE);
528 	}
529 
530     done:
531       if (GTK_CLIST (choose_t->udsnlist)->selection == NULL)
532 	{
533 	  if (choose_t->uremove)
534 	    gtk_widget_set_sensitive (choose_t->uremove, FALSE);
535 	  if (choose_t->uconfigure)
536 	    gtk_widget_set_sensitive (choose_t->uconfigure, FALSE);
537 	  if (choose_t->utest)
538 	    gtk_widget_set_sensitive (choose_t->utest, FALSE);
539 	}
540     }
541 
542   return;
543 }
544 
545 
546 void
547 userdsn_remove_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
548 {
549   char dsn[1024] = { "\0" };
550   char *szDSN = NULL, *szDriver = NULL;
551 
552   if (choose_t)
553     {
554       /* Retrieve the DSN name */
555       if (GTK_CLIST (choose_t->udsnlist)->selection != NULL)
556 	{
557 	  gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist),
558 	      GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->
559 		  data), 0, &szDSN);
560 	  gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist),
561 	      GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->
562 		  data), 2, &szDriver);
563 	}
564 
565       /* Call the right function */
566       if (szDSN
567 	  && create_confirm (choose_t->mainwnd, szDSN,
568 	      "Are you sure you want to remove this DSN ?"))
569 	{
570 	  sprintf (dsn, "DSN=%s", szDSN);
571 	  if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_REMOVE_DSN,
572 		  szDriver, dsn))
573 	    _iodbcdm_errorbox (choose_t->mainwnd, szDSN,
574 		"An error occurred when trying to remove the DSN : ");
575 	  adddsns_to_list (choose_t->udsnlist, FALSE);
576 	}
577 
578       if (GTK_CLIST (choose_t->udsnlist)->selection == NULL)
579 	{
580 	  if (choose_t->uremove)
581 	    gtk_widget_set_sensitive (choose_t->uremove, FALSE);
582 	  if (choose_t->uconfigure)
583 	    gtk_widget_set_sensitive (choose_t->uconfigure, FALSE);
584 	  if (choose_t->utest)
585 	    gtk_widget_set_sensitive (choose_t->utest, FALSE);
586 	}
587     }
588 }
589 
590 
591 void
592 userdsn_configure_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
593 {
594   char connstr[4096] = { 0 };
595   char tokenstr[4096] = { 0 };
596   char *szDSN = NULL, *szDriver = NULL, *curr, *cour;
597   int size = sizeof (connstr);
598   DWORD error;
599 
600   if (choose_t)
601     {
602       /* Retrieve the DSN name */
603       if (GTK_CLIST (choose_t->udsnlist)->selection != NULL)
604 	{
605 	  gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist),
606 	      GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->
607 		  data), 0, &szDSN);
608 	  gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist),
609 	      GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->
610 		  data), 2, &szDriver);
611 	}
612 
613       /* Call the right function */
614       if (szDSN)
615 	{
616 	  sprintf (connstr, "DSN=%s", szDSN);
617 	  size -= (STRLEN (connstr) + 1);
618 
619 	  SQLSetConfigMode (ODBC_USER_DSN);
620 	  if (!SQLGetPrivateProfileString (szDSN, NULL, "", tokenstr,
621 		  sizeof (tokenstr), NULL))
622 	    {
623 	      _iodbcdm_errorbox (choose_t->mainwnd, szDSN,
624 		  "An error occurred when trying to configure the DSN : ");
625 	      goto done;
626 	    }
627 
628 	  for (curr = tokenstr, cour = connstr + STRLEN (connstr) + 1; *curr;
629 	      curr += (STRLEN (curr) + 1), cour += (STRLEN (cour) + 1))
630 	    {
631 	      STRCPY (cour, curr);
632 	      cour[STRLEN (curr)] = '=';
633 	      SQLSetConfigMode (ODBC_USER_DSN);
634 	      SQLGetPrivateProfileString (szDSN, curr, "",
635 		  cour + STRLEN (curr) + 1, size - STRLEN (curr) - 1, NULL);
636 	      size -= (STRLEN (cour) + 1);
637 	    }
638 
639 	  *cour = 0;
640 
641 	  SQLSetConfigMode (ODBC_USER_DSN);
642 	  if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_CONFIG_DSN,
643 		  szDriver, connstr))
644 	    {
645 	      if (SQLInstallerError (1, &error, connstr, sizeof (connstr),
646 		      NULL) != SQL_NO_DATA
647 		  && error != ODBC_ERROR_REQUEST_FAILED)
648 		_iodbcdm_errorbox (choose_t->mainwnd, szDSN,
649 		    "An error occurred when trying to configure the DSN : ");
650 	      goto done;
651 	    }
652 
653 	  adddsns_to_list (choose_t->udsnlist, FALSE);
654 	}
655 
656     done:
657       if (GTK_CLIST (choose_t->udsnlist)->selection == NULL)
658 	{
659 	  if (choose_t->uremove)
660 	    gtk_widget_set_sensitive (choose_t->uremove, FALSE);
661 	  if (choose_t->uconfigure)
662 	    gtk_widget_set_sensitive (choose_t->uconfigure, FALSE);
663 	  if (choose_t->utest)
664 	    gtk_widget_set_sensitive (choose_t->utest, FALSE);
665 	}
666     }
667 
668   return;
669 }
670 
671 
672 void
673 userdsn_test_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
674 {
675   HENV henv;
676   HDBC hdbc;
677   SWORD buflen;
678   char connstr[4096] = { 0 };
679   char outconnstr[4096] = { 0 };
680   char *szDSN;
681 
682   if (choose_t)
683     {
684       /* Retrieve the DSN name */
685       if (GTK_CLIST (choose_t->udsnlist)->selection != NULL)
686 	gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist),
687 	    GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->data),
688 	    0, &szDSN);
689 
690       if (szDSN && STRLEN (szDSN))
691 	{
692 	  snprintf (connstr, sizeof (connstr), "DSN=%s", szDSN);
693 	  if (test_driver_connect (choose_t, connstr))
694 	    {
695 	      _iodbcdm_messagebox (choose_t->mainwnd, szDSN,
696 		  "The connection DSN was tested successfully, and can be used at this time.");
697 	    }
698 	}
699 
700       if (GTK_CLIST (choose_t->udsnlist)->selection == NULL)
701 	{
702 	  if (choose_t->uremove)
703 	    gtk_widget_set_sensitive (choose_t->uremove, FALSE);
704 	  if (choose_t->uconfigure)
705 	    gtk_widget_set_sensitive (choose_t->uconfigure, FALSE);
706 	  if (choose_t->utest)
707 	    gtk_widget_set_sensitive (choose_t->utest, FALSE);
708 	}
709     }
710 }
711 
712 
713 void
714 systemdsn_add_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
715 {
716   char connstr[4096] = { 0 };
717   char drv[1024] = { 0 };
718   int sqlstat;
719   DWORD error;
720 
721   if (choose_t)
722     {
723       /* Try first to get the driver name */
724       SQLSetConfigMode (ODBC_SYSTEM_DSN);
725       if (_iodbcdm_drvchoose_dialbox (choose_t->mainwnd, drv, sizeof (drv),
726 	      &sqlstat) == SQL_SUCCESS)
727 	{
728 	  if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_ADD_SYS_DSN,
729 		  drv + STRLEN ("DRIVER="), connstr))
730 	    {
731 	      if (SQLInstallerError (1, &error, connstr, sizeof (connstr),
732 		      NULL) != SQL_NO_DATA)
733 		_iodbcdm_errorbox (choose_t->mainwnd, NULL,
734 		    "An error occurred when trying to add the DSN : ");
735 	      goto done;
736 	    }
737 
738 	  adddsns_to_list (choose_t->sdsnlist, TRUE);
739 	}
740 
741     done:
742       if (GTK_CLIST (choose_t->sdsnlist)->selection == NULL)
743 	{
744 	  if (choose_t->sremove)
745 	    gtk_widget_set_sensitive (choose_t->sremove, FALSE);
746 	  if (choose_t->sconfigure)
747 	    gtk_widget_set_sensitive (choose_t->sconfigure, FALSE);
748 	  if (choose_t->stest)
749 	    gtk_widget_set_sensitive (choose_t->stest, FALSE);
750 	}
751     }
752 
753   return;
754 }
755 
756 
757 void
758 systemdsn_remove_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
759 {
760   char dsn[1024] = { 0 };
761   char *szDSN = NULL, *szDriver = NULL;
762 
763   if (choose_t)
764     {
765       /* Retrieve the DSN name */
766       if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL)
767 	{
768 	  gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist),
769 	      GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->
770 		  data), 0, &szDSN);
771 	  gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist),
772 	      GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->
773 		  data), 2, &szDriver);
774 	}
775 
776       /* Call the right function */
777       if (szDSN
778 	  && create_confirm (choose_t->mainwnd, szDSN,
779 	      "Are you sure you want to remove this DSN ?"))
780 	{
781 	  sprintf (dsn, "DSN=%s", szDSN);
782 	  if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_REMOVE_SYS_DSN,
783 		  szDriver, dsn))
784 	    _iodbcdm_errorbox (choose_t->mainwnd, szDSN,
785 		"An error occurred when trying to remove the DSN : ");
786 	  adddsns_to_list (choose_t->sdsnlist, TRUE);
787 	}
788 
789       if (GTK_CLIST (choose_t->sdsnlist)->selection == NULL)
790 	{
791 	  if (choose_t->sremove)
792 	    gtk_widget_set_sensitive (choose_t->sremove, FALSE);
793 	  if (choose_t->sconfigure)
794 	    gtk_widget_set_sensitive (choose_t->sconfigure, FALSE);
795 	  if (choose_t->stest)
796 	    gtk_widget_set_sensitive (choose_t->stest, FALSE);
797 	}
798     }
799 }
800 
801 
802 void
803 systemdsn_configure_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
804 {
805   char connstr[4096] = { 0 };
806   char tokenstr[4096] = { 0 };
807   char *szDSN = NULL, *szDriver = NULL, *curr, *cour;
808   int size = sizeof (connstr);
809   DWORD error;
810 
811   if (choose_t)
812     {
813       /* Retrieve the DSN name */
814       if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL)
815 	{
816 	  gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist),
817 	      GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->
818 		  data), 0, &szDSN);
819 	  gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist),
820 	      GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->
821 		  data), 2, &szDriver);
822 	}
823 
824       /* Call the right function */
825       if (szDSN)
826 	{
827 	  sprintf (connstr, "DSN=%s", szDSN);
828 	  size -= (STRLEN (connstr) + 1);
829 
830 	  SQLSetConfigMode (ODBC_SYSTEM_DSN);
831 	  if (!SQLGetPrivateProfileString (szDSN, NULL, "", tokenstr,
832 		  sizeof (tokenstr), NULL))
833 	    {
834 	      _iodbcdm_errorbox (choose_t->mainwnd, szDSN,
835 		  "An error occurred when trying to configure the DSN : ");
836 	      goto done;
837 	    }
838 
839 	  for (curr = tokenstr, cour = connstr + STRLEN (connstr) + 1; *curr;
840 	      curr += (STRLEN (curr) + 1), cour += (STRLEN (cour) + 1))
841 	    {
842 	      STRCPY (cour, curr);
843 	      cour[STRLEN (curr)] = '=';
844 	      SQLSetConfigMode (ODBC_SYSTEM_DSN);
845 	      SQLGetPrivateProfileString (szDSN, curr, "",
846 		  cour + STRLEN (curr) + 1, size - STRLEN (curr) - 1, NULL);
847 	      size -= (STRLEN (cour) + 1);
848 	    }
849 
850 	  *cour = 0;
851 
852 	  if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_CONFIG_SYS_DSN,
853 		  szDriver, connstr))
854 	    {
855 	      if (SQLInstallerError (1, &error, connstr, sizeof (connstr),
856 		      NULL) != SQL_NO_DATA
857 		  && error != ODBC_ERROR_REQUEST_FAILED)
858 		_iodbcdm_errorbox (choose_t->mainwnd, szDSN,
859 		    "An error occurred when trying to configure the DSN : ");
860 	      goto done;
861 	    }
862 
863 	  adddsns_to_list (choose_t->sdsnlist, TRUE);
864 	}
865 
866     done:
867       if (GTK_CLIST (choose_t->sdsnlist)->selection == NULL)
868 	{
869 	  if (choose_t->sremove)
870 	    gtk_widget_set_sensitive (choose_t->sremove, FALSE);
871 	  if (choose_t->sconfigure)
872 	    gtk_widget_set_sensitive (choose_t->sconfigure, FALSE);
873 	  if (choose_t->stest)
874 	    gtk_widget_set_sensitive (choose_t->stest, FALSE);
875 	}
876     }
877 
878   return;
879 }
880 
881 
882 void
883 systemdsn_test_clicked (GtkWidget * widget, TDSNCHOOSER * choose_t)
884 {
885   HENV henv;
886   HDBC hdbc;
887   SWORD buflen;
888   SQLCHAR connstr[4096] = { 0 };
889   SQLCHAR outconnstr[4096] = { 0 };
890   char *szDSN = NULL;
891 
892   if (choose_t)
893     {
894       /* Retrieve the DSN name */
895       if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL)
896 	gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist),
897 	    GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->data),
898 	    0, &szDSN);
899 
900       if (szDSN && STRLEN (szDSN))
901 	{
902 	  snprintf (connstr, sizeof (connstr), "DSN=%s", szDSN);
903 	  if (test_driver_connect (choose_t, connstr))
904 	    {
905 	      _iodbcdm_messagebox (choose_t->mainwnd, szDSN,
906 		  "The connection DSN was tested successfully, and can be used at this time.");
907 	    }
908         }
909 
910       if (GTK_CLIST (choose_t->sdsnlist)->selection == NULL)
911 	{
912 	  if (choose_t->sremove)
913 	    gtk_widget_set_sensitive (choose_t->sremove, FALSE);
914 	  if (choose_t->sconfigure)
915 	    gtk_widget_set_sensitive (choose_t->sconfigure, FALSE);
916 	  if (choose_t->stest)
917 	    gtk_widget_set_sensitive (choose_t->stest, FALSE);
918 	}
919 
920     }
921 }
922 
923 
924 static void
925 filedsn_get_dsn (char *filename, char *dsn, size_t dsn_sz)
926 {
927   char *p;
928 
929   /* Cut everything up to the last slash */
930   p = strrchr (filename, '/');
931   if (p != NULL)
932     p++;
933   else
934     p = filename;
935   snprintf (dsn, dsn_sz, "%s", p);
936 
937   /* Cut .dsn extension */
938   p = strrchr (dsn, '.');
939   if (p != NULL && !strcasecmp (p, ".dsn"))
940     *p = '\0';
941 }
942 
943 
944 static BOOL _CheckDriverLoginDlg (char *drv);
945 
946 static void
947 filedsn_configure (TDSNCHOOSER *choose_t, char *drv, char *dsn, char *in_attrs,
948 	BOOL b_add, BOOL verify_conn)
949 {
950   char *connstr = NULL;
951   size_t len;			/* current connstr len    */
952   size_t add_len;		/* len of appended string */
953   LPSTR attrs = NULL, curr, tmp, attr_lst = NULL;
954   BOOL b_Save = TRUE;
955 
956   attrs = in_attrs;
957 
958   if (!b_add && !_CheckDriverLoginDlg(drv + STRLEN("DRIVER=")))
959     {
960       /*  Get DSN name and additional attributes  */
961       attr_lst = create_fgensetup (choose_t->mainwnd, dsn, in_attrs,
962          b_add, &verify_conn);
963       attrs = attr_lst;
964     }
965 
966   if (!attrs)
967     {
968       create_error (choose_t->mainwnd, NULL, "Error adding File DSN:",
969           strerror (ENOMEM));
970       return;
971     }
972   if (attrs == (LPSTR) - 1L)
973     return;
974 
975   /* Build the connection string */
976   connstr = strdup (drv);
977   len = strlen (connstr);
978   for (curr = attrs; *curr; curr += (STRLEN (curr) + 1))
979     {
980       if (!strncasecmp (curr, "DSN=", STRLEN ("DSN=")))
981         {
982           if (dsn == NULL)
983             {
984 	      /* got dsn name */
985               dsn = curr + STRLEN ("DSN=");
986             }
987 	  continue;
988 	}
989 
990       /* append attr */
991       add_len = 1 + strlen (curr);			/* +1 for ';' */
992       tmp = realloc (connstr, len + add_len + 1);	/* +1 for NUL */
993       if (tmp == NULL)
994         {
995           create_error (choose_t->mainwnd, NULL, "Error adding File DSN:",
996 	      strerror (errno));
997 	  goto done;
998 	}
999       connstr = tmp;
1000       snprintf (connstr + len, add_len + 1, ";%s", curr);
1001       len += add_len;
1002     }
1003 
1004   /* Nothing to do if no DSN */
1005   if (!dsn || STRLEN (dsn) == 0)
1006     goto done;
1007 
1008   if (verify_conn)
1009     {
1010       BOOL ret;
1011 
1012       /* Append SAVEFILE */
1013       add_len = strlen (";SAVEFILE=") + strlen (dsn);
1014       tmp = realloc (connstr, len + add_len + 1);		/* +1 for NUL */
1015       if (tmp == NULL)
1016         {
1017           create_error (choose_t->mainwnd, NULL, "Error adding file DSN:",
1018 	      strerror (errno));
1019           goto done;
1020         }
1021       connstr = tmp;
1022       snprintf (connstr + len, add_len + 1, ";SAVEFILE=%s", dsn);
1023       len += add_len;
1024 
1025       /* Connect to data source */
1026       ret = test_driver_connect (choose_t, connstr);
1027       if (!ret && b_add)
1028         {
1029 	  if (create_confirm (choose_t->mainwnd, dsn,
1030 	      "Can't check the connection. Do you want to store the FileDSN without verification ?"))
1031             b_Save = TRUE;
1032           else
1033             b_Save = FALSE;
1034         }
1035       else
1036         b_Save = FALSE;
1037     }
1038 
1039   if (b_Save)
1040     {
1041       char key[512];
1042       char *p;
1043       size_t sz;
1044 
1045       if (drv)
1046         {
1047 	  p = strchr(drv, '=');
1048           if (!SQLWriteFileDSN (dsn, "ODBC", "DRIVER", p + 1))
1049             {
1050               create_error (choose_t->mainwnd, NULL, "Error writing File DSN:",
1051 	          strerror (errno));
1052 	      goto done;
1053 	    }
1054         }
1055 
1056       for (curr = attrs; *curr; curr += (STRLEN (curr) + 1))
1057         {
1058           if (!strncasecmp (curr, "DSN=", STRLEN ("DSN=")))
1059 	    continue;
1060 	  else if (!strncasecmp (curr, "PWD=", STRLEN ("PWD=")))
1061 	    continue;
1062 	  else if (!strncasecmp (curr, "SAVEFILE=", STRLEN ("SAVEFILE=")))
1063 	    continue;
1064 	  else if (!strncasecmp (curr, "FILEDSN=", STRLEN ("FILEDSN=")))
1065 	    continue;
1066 
1067 	  p = strchr(curr, '=');
1068 	  sz = p - curr < sizeof(key) ? p - curr : sizeof(key);
1069 	  memset(key, 0, sizeof(key));
1070 	  strncpy(key, curr, sz);
1071 
1072           if (!SQLWriteFileDSN (dsn, "ODBC", key, p + 1))
1073             {
1074               create_error (choose_t->mainwnd, NULL, "Error writing File DSN:",
1075 	          strerror (errno));
1076 	      goto done;
1077 	    }
1078         }
1079     }
1080 
1081 
1082 done:
1083   if (attr_lst != NULL)
1084     free (attr_lst);
1085   if (connstr != NULL)
1086     free (connstr);
1087 }
1088 
1089 
1090 static void
1091 filedsn_update_file_list (TDSNCHOOSER *choose_t)
1092 {
1093   /* Reset current file */
1094   gtk_entry_set_text (GTK_ENTRY (choose_t->file_entry), "");
1095   if (choose_t->fremove)
1096     gtk_widget_set_sensitive(choose_t->fremove, FALSE);
1097   if (choose_t->fconfigure)
1098     gtk_widget_set_sensitive(choose_t->fconfigure, FALSE);
1099   if (choose_t->ftest)
1100     gtk_widget_set_sensitive(choose_t->ftest, FALSE);
1101 
1102   /* Update file list */
1103   addfiles_to_list (choose_t->mainwnd, choose_t->file_list,
1104     choose_t->curr_dir);
1105 }
1106 
1107 
1108 void
1109 filedsn_add_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
1110 {
1111   SQLCHAR drv[1024] = { 0 };
1112   int sqlstat;
1113   LPSTR s, attrs;
1114   TFDRIVERCHOOSER drvchoose_t;
1115 
1116   if (!choose_t)
1117     return;
1118 
1119   /* Try first to get the driver name */
1120   SQLSetConfigMode (ODBC_USER_DSN);
1121 
1122   drvchoose_t.attrs = NULL;
1123   drvchoose_t.dsn = NULL;
1124   drvchoose_t.driver = NULL;
1125   drvchoose_t.curr_dir = choose_t->curr_dir;
1126 
1127   create_fdriverchooser (choose_t->mainwnd, &drvchoose_t);
1128 
1129   /* Check output parameters */
1130   if (drvchoose_t.ok)
1131     {
1132       if (sizeof(drv) > WCSLEN(drvchoose_t.driver) + strlen("DRIVER="))
1133 	{
1134           s = strcpy(drv, "DRIVER=");
1135           s += strlen("DRIVER=");
1136           dm_strcpy_W2A(s, drvchoose_t.driver);
1137           attrs = drvchoose_t.attrs;
1138 
1139           filedsn_configure(choose_t, drv, drvchoose_t.dsn,
1140           	attrs ? attrs :"\0\0", TRUE, drvchoose_t.verify_conn);
1141           filedsn_update_file_list(choose_t);
1142 	}
1143     }
1144 
1145   if (drvchoose_t.driver)
1146     free (drvchoose_t.driver);
1147   if (drvchoose_t.attrs)
1148     free (drvchoose_t.attrs);
1149   if (drvchoose_t.dsn)
1150     free (drvchoose_t.dsn);
1151 
1152 
1153 }
1154 
1155 
1156 void
1157 filedsn_remove_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
1158 {
1159   char msg[4096];
1160   char *filedsn;
1161 
1162   if (!choose_t)
1163     return;
1164 
1165   /* Retrieve filedsn file name */
1166   filedsn = (char*)gtk_entry_get_text (GTK_ENTRY (choose_t->file_entry));
1167 
1168   /* Confirm removing a file dsn */
1169   snprintf (msg, sizeof (msg),
1170       "Are you sure you want to remove the '%s' data source?",
1171       filedsn);
1172   if (!create_confirm (choose_t->mainwnd, NULL, msg))
1173     return;
1174 
1175   /* Remove file */
1176   if (unlink (filedsn) < 0)
1177     {
1178       create_error (choose_t->mainwnd, NULL, "Error removing file DSN:",
1179 	  strerror (errno));
1180       return;
1181     }
1182 
1183   /* Update file list */
1184   filedsn_update_file_list(choose_t);
1185 }
1186 
1187 
1188 void
1189 filedsn_configure_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
1190 {
1191   char dsn[1024];
1192   char *filedsn;
1193   char *drv = NULL;
1194   char *attrs = NULL;
1195   char *_attrs = NULL;	/* attr list */
1196   size_t len = 0;	/* current attr list length (w/o list-terminating NUL) */
1197   char *p, *p_next;
1198   WORD read_len;
1199   char entries[1024];
1200 
1201   if (!choose_t)
1202     return;
1203 
1204   /* Retrieve filedsn file name */
1205   filedsn = (char*)gtk_entry_get_text (GTK_ENTRY (choose_t->file_entry));
1206   filedsn_get_dsn (filedsn, dsn, sizeof (dsn));
1207 
1208   /* Get list of entries in .dsn file */
1209   if (!SQLReadFileDSN (filedsn, "ODBC", NULL,
1210 		       entries, sizeof (entries), &read_len))
1211     {
1212       create_error (choose_t->mainwnd, NULL, "SQLReadFileDSN failed", NULL);
1213       goto done;
1214     }
1215 
1216   /* add params from the .dsn file */
1217   for (p = entries; *p != '\0'; p = p_next)
1218     {
1219       char *tmp;
1220       size_t add_len;		/* length of added attribute */
1221       char value[1024];
1222 
1223       /* get next entry */
1224       p_next = strchr (p, ';');
1225       if (p_next)
1226         *p_next++ = '\0';
1227 
1228       if (!SQLReadFileDSN (filedsn, "ODBC", p, value, sizeof(value), &read_len))
1229         {
1230           create_error (choose_t->mainwnd, NULL, "SQLReadFileDSN failed", NULL);
1231           goto done;
1232 	}
1233 
1234       if (!strcasecmp (p, "DRIVER"))
1235         {
1236           /* got driver keyword */
1237           add_len = strlen ("DRIVER=") + strlen (value) + 1;
1238           drv = malloc (add_len);
1239 	  snprintf (drv, add_len, "DRIVER=%s", value);
1240 	  continue;
1241 	}
1242 
1243       /* +1 for '=', +1 for NUL */
1244       add_len = strlen (p) + 1 + strlen (value) + 1;
1245       /* +1 for list-terminating NUL */;
1246       tmp = realloc (attrs, len + add_len + 1);
1247       if (tmp == NULL)
1248         {
1249           create_error (choose_t->mainwnd, NULL, "Error adding file DSN:",
1250               strerror (errno));
1251           goto done;
1252         }
1253       attrs = tmp;
1254       snprintf (attrs + len, add_len, "%s=%s", p, value);
1255       len += add_len;
1256     }
1257 
1258   if (drv == NULL)
1259     {
1260       /* no driver found, probably unshareable file data source */
1261       create_error (choose_t->mainwnd, NULL,
1262 	  "Can't configure file DSN without DRIVER keyword (probably unshareable data source?)", NULL);
1263       goto done;
1264     }
1265 
1266   if (attrs == NULL)
1267     attrs = "\0\0";
1268   else
1269     {
1270       /* NUL-terminate the list */
1271       attrs[len] = '\0';
1272       _attrs = attrs;
1273     }
1274 
1275   /* Configure file DSN */
1276   filedsn_configure (choose_t, drv, dsn, attrs, FALSE, TRUE);
1277 
1278 done:
1279   if (drv != NULL)
1280     free (drv);
1281   if (_attrs != NULL)
1282     free (_attrs);
1283 }
1284 
1285 
1286 void
1287 filedsn_test_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
1288 {
1289   char dsn[1024];
1290   char connstr[4096] = { 0 };
1291   char *filedsn;
1292 
1293   if (!choose_t)
1294     return;
1295 
1296   /* Retrieve filedsn file name */
1297   filedsn = (char*)gtk_entry_get_text (GTK_ENTRY (choose_t->file_entry));
1298   filedsn_get_dsn (filedsn, dsn, sizeof (dsn));
1299 
1300   /* Create connection string and connect to data source */
1301   snprintf (connstr, sizeof (connstr), "FILEDSN=%s", filedsn);
1302   if (test_driver_connect(choose_t, connstr))
1303     {
1304       _iodbcdm_messagebox (choose_t->mainwnd, filedsn,
1305         "The connection DSN was tested successfully, and can be used at this time.");
1306     }
1307 }
1308 
1309 
1310 void
1311 filedsn_setdir_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
1312 {
1313   char msg[4096];
1314 
1315   if (!choose_t)
1316     return;
1317 
1318   /* confirm setting a directory */
1319   snprintf (msg, sizeof (msg),
1320       "Are you sure that you want to make '%s' the default file DSN directory?",
1321       choose_t->curr_dir);
1322   if (!create_confirm (choose_t->mainwnd, NULL, msg))
1323     return;
1324 
1325   /* write FileDSNPath value */
1326   if (!SQLWritePrivateProfileString ("ODBC", "FileDSNPath",
1327 	   choose_t->curr_dir, "odbcinst.ini"))
1328     {
1329       create_error (choose_t->mainwnd, NULL,
1330 	  "Error setting default file DSN directory", NULL);
1331       return;
1332     }
1333 }
1334 
1335 
1336 void
1337 filedsn_filelist_select (GtkWidget *widget, gint row, gint column,
1338     GdkEvent *event, TDSNCHOOSER *choose_t)
1339 {
1340   LPSTR filename = NULL, temp = NULL;
1341 
1342   if (choose_t)
1343     {
1344       /* Get the file name */
1345       gtk_clist_get_text (GTK_CLIST (choose_t->file_list), row, 0, &filename);
1346 
1347       /* Update the directory and file list */
1348       temp =
1349 	  (LPSTR) malloc (STRLEN (filename) + STRLEN (choose_t->curr_dir) +
1350 	  2);
1351 
1352       if (temp)
1353 	{
1354 	  STRCPY (temp, choose_t->curr_dir);
1355 	  if (temp[STRLEN (temp) - 1] != '/')
1356 	    STRCAT (temp, "/");
1357 	  STRCAT (temp, filename);
1358 
1359 	  /* Check if it's a valid file */
1360 	  gtk_entry_set_text (GTK_ENTRY (choose_t->file_entry), temp);
1361 
1362 	  /* And activate buttons */
1363 	  if (choose_t->fremove)
1364 	    gtk_widget_set_sensitive (choose_t->fremove, TRUE);
1365 	  if (choose_t->fconfigure)
1366 	    gtk_widget_set_sensitive (choose_t->fconfigure, TRUE);
1367 	  if (choose_t->ftest)
1368 	    gtk_widget_set_sensitive (choose_t->ftest, TRUE);
1369 
1370 	  free (temp);
1371 	}
1372     }
1373 }
1374 
1375 
1376 void
1377 filedsn_filelist_unselect (GtkWidget *widget, gint row, gint column,
1378     GdkEvent *event, TDSNCHOOSER *choose_t)
1379 {
1380   if (choose_t)
1381     {
1382       /* Check if it's a valid file */
1383       gtk_entry_set_text (GTK_ENTRY (choose_t->file_entry), "");
1384 
1385       /* And des-activate buttons */
1386       if (choose_t->fremove)
1387 	gtk_widget_set_sensitive (choose_t->fremove, FALSE);
1388       if (choose_t->fconfigure)
1389 	gtk_widget_set_sensitive (choose_t->fconfigure, FALSE);
1390       if (choose_t->ftest)
1391 	gtk_widget_set_sensitive (choose_t->ftest, FALSE);
1392     }
1393 }
1394 
1395 
1396 void
1397 filedsn_dirlist_select (GtkWidget *widget, gint row, gint column,
1398     GdkEvent *event, TDSNCHOOSER *choose_t)
1399 {
1400   LPSTR filename = NULL, temp = NULL;
1401   int i;
1402 
1403   if (choose_t)
1404     {
1405       /* Get the directory name */
1406       gtk_clist_get_text (GTK_CLIST (choose_t->dir_list), row, 0, &filename);
1407 
1408       if (filename && event && event->type == GDK_2BUTTON_PRESS)
1409 	{
1410 	  /* Update the directory and file list */
1411 	  temp =
1412 	      (LPSTR) malloc (STRLEN (filename) +
1413 	      STRLEN (choose_t->curr_dir) + 2);
1414 
1415 	  if (temp)
1416 	    {
1417 	      if (!strcmp (filename, "."))
1418 		STRCPY (temp, choose_t->curr_dir);
1419 	      else if (!strcmp (filename, ".."))
1420 		{
1421 		  STRCPY (temp, choose_t->curr_dir);
1422 		  for (i = STRLEN (temp) - 1; i - 1 && temp[i] != '/'; i--);
1423 		  temp[i] = 0;
1424 		}
1425 	      else
1426 		{
1427 		  STRCPY (temp, choose_t->curr_dir);
1428 		  if (temp[STRLEN (temp) - 1] != '/')
1429 		    STRCAT (temp, "/");
1430 		  STRCAT (temp, filename);
1431 		}
1432 
1433 	      strncpy(choose_t->curr_dir, temp, sizeof(choose_t->curr_dir));
1434 	      addlistofdir_to_optionmenu (choose_t->dir_combo,
1435 		  choose_t->curr_dir, choose_t);
1436 	      adddirectories_to_list (choose_t->mainwnd, choose_t->dir_list,
1437 		  choose_t->curr_dir);
1438 	      addfiles_to_list (choose_t->mainwnd, choose_t->file_list,
1439 		  choose_t->curr_dir);
1440 	    }
1441 	}
1442     }
1443 }
1444 
1445 
1446 void
1447 filedsn_lookin_clicked (GtkWidget *widget, void **array)
1448 {
1449   if (array && array[0] && array[1] && ((TDSNCHOOSER *) array[1])->curr_dir
1450       && strcmp (((TDSNCHOOSER *) array[1])->curr_dir, array[0]))
1451     {
1452       TDSNCHOOSER *choose_t = (TDSNCHOOSER *) array[1];
1453       /* Update the directory and file list */
1454       strncpy(choose_t->curr_dir, array[0], sizeof(choose_t->curr_dir));
1455       addlistofdir_to_optionmenu (choose_t->dir_combo,
1456 	  (LPCSTR) array[0], choose_t);
1457       adddirectories_to_list (choose_t->mainwnd,
1458 	  choose_t->dir_list, (LPCSTR) array[0]);
1459       addfiles_to_list (choose_t->mainwnd, choose_t->file_list, (LPCSTR) array[0]);
1460     }
1461 }
1462 
1463 
1464 void
1465 userdsn_list_select (GtkWidget *widget, gint row, gint column,
1466     GdkEvent *event, TDSNCHOOSER *choose_t)
1467 {
1468   char *szDSN = NULL;
1469 
1470   if (choose_t)
1471     {
1472       if (GTK_CLIST (choose_t->udsnlist)->selection != NULL)
1473 	gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist),
1474 	    GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->data),
1475 	    0, &szDSN);
1476 
1477       if (szDSN && event && event->type == GDK_2BUTTON_PRESS)
1478 	gtk_signal_emit_by_name (GTK_OBJECT (choose_t->uconfigure), "clicked",
1479 	    choose_t);
1480 
1481       gtk_widget_set_sensitive (choose_t->uremove, TRUE);
1482       gtk_widget_set_sensitive (choose_t->uconfigure, TRUE);
1483       gtk_widget_set_sensitive (choose_t->utest, TRUE);
1484     }
1485 }
1486 
1487 
1488 void
1489 userdsn_list_unselect (GtkWidget *widget, gint row, gint column,
1490     GdkEvent *event, TDSNCHOOSER *choose_t)
1491 {
1492   if (choose_t)
1493     {
1494       gtk_widget_set_sensitive (choose_t->uremove, FALSE);
1495       gtk_widget_set_sensitive (choose_t->uconfigure, FALSE);
1496       gtk_widget_set_sensitive (choose_t->utest, FALSE);
1497     }
1498 }
1499 
1500 
1501 void
1502 systemdsn_list_select (GtkWidget *widget, gint row, gint column,
1503     GdkEvent *event, TDSNCHOOSER *choose_t)
1504 {
1505   char *szDSN = NULL;
1506 
1507   if (choose_t)
1508     {
1509       if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL)
1510 	gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist),
1511 	    GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->data),
1512 	    0, &szDSN);
1513 
1514       if (szDSN && event && event->type == GDK_2BUTTON_PRESS)
1515 	gtk_signal_emit_by_name (GTK_OBJECT (choose_t->sconfigure), "clicked",
1516 	    choose_t);
1517 
1518       gtk_widget_set_sensitive (choose_t->sremove, TRUE);
1519       gtk_widget_set_sensitive (choose_t->sconfigure, TRUE);
1520       gtk_widget_set_sensitive (choose_t->stest, TRUE);
1521     }
1522 }
1523 
1524 
1525 void
1526 systemdsn_list_unselect (GtkWidget *widget, gint row, gint column,
1527     GdkEvent *event, TDSNCHOOSER *choose_t)
1528 {
1529   if (choose_t)
1530     {
1531       gtk_widget_set_sensitive (choose_t->sremove, FALSE);
1532       gtk_widget_set_sensitive (choose_t->sconfigure, FALSE);
1533       gtk_widget_set_sensitive (choose_t->stest, FALSE);
1534     }
1535 }
1536 
1537 
1538 static void
1539 dsnchooser_ok_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
1540 {
1541   char *szDSN;
1542 
1543   if (choose_t)
1544     {
1545       switch (choose_t->type_dsn)
1546 	{
1547 	case USER_DSN:
1548 	  if (GTK_CLIST (choose_t->udsnlist)->selection != NULL)
1549 	    {
1550 	      gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist),
1551 		  GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection->
1552 		      data), 0, &szDSN);
1553 	      choose_t->dsn = dm_SQL_A2W(szDSN, SQL_NTS);
1554 	    }
1555 	  else
1556 	    choose_t->dsn = NULL;
1557 	  break;
1558 
1559 	case SYSTEM_DSN:
1560 	  if (GTK_CLIST (choose_t->sdsnlist)->selection != NULL)
1561 	    {
1562 	      gtk_clist_get_text (GTK_CLIST (choose_t->sdsnlist),
1563 		  GPOINTER_TO_INT (GTK_CLIST (choose_t->sdsnlist)->selection->
1564 		      data), 0, &szDSN);
1565 	      choose_t->dsn = dm_SQL_A2W (szDSN, SQL_NTS);
1566 	    }
1567 	  else
1568 	    choose_t->dsn = NULL;
1569 	  break;
1570 
1571 	default:
1572 	  choose_t->dsn = NULL;
1573 	  break;
1574 	};
1575 
1576     done:
1577       choose_t->udsnlist = choose_t->sdsnlist = NULL;
1578       choose_t->uadd = choose_t->uremove = choose_t->utest =
1579 	  choose_t->uconfigure = NULL;
1580       choose_t->sadd = choose_t->sremove = choose_t->stest =
1581 	  choose_t->sconfigure = NULL;
1582 
1583       gtk_signal_disconnect_by_func (GTK_OBJECT (choose_t->mainwnd),
1584 	  GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
1585       gtk_main_quit ();
1586       gtk_widget_destroy (choose_t->mainwnd);
1587     }
1588 }
1589 
1590 
1591 static void
1592 dsnchooser_cancel_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t)
1593 {
1594   if (choose_t)
1595     {
1596       choose_t->udsnlist = choose_t->sdsnlist = NULL;
1597       choose_t->uadd = choose_t->uremove = choose_t->utest =
1598 	  choose_t->uconfigure = NULL;
1599       choose_t->sadd = choose_t->sremove = choose_t->stest =
1600 	  choose_t->sconfigure = NULL;
1601       choose_t->type_dsn = -1;
1602       choose_t->dsn = NULL;
1603 
1604       gtk_signal_disconnect_by_func (GTK_OBJECT (choose_t->mainwnd),
1605 	  GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
1606       gtk_main_quit ();
1607       gtk_widget_destroy (choose_t->mainwnd);
1608     }
1609 }
1610 
1611 
1612 static gint
1613 delete_event (GtkWidget *widget, GdkEvent *event, TDSNCHOOSER *choose_t)
1614 {
1615   dsnchooser_cancel_clicked (widget, choose_t);
1616 
1617   return FALSE;
1618 }
1619 
1620 
1621 void
1622 create_dsnchooser (HWND hwnd, TDSNCHOOSER * choose_t)
1623 {
1624   GdkPixmap *pixmap;
1625   GdkBitmap *mask;
1626   GtkStyle *style;
1627 
1628   GtkWidget *dsnchooser;
1629   GtkWidget *vbox27;
1630   GtkWidget *notebook1;
1631   GtkWidget *vbox28;
1632   GtkWidget *frame60;
1633   GtkWidget *alignment52;
1634   GtkWidget *hbox36;
1635   GtkWidget *scrolledwindow17;
1636   GtkWidget *clist1;
1637   GtkWidget *label104;
1638   GtkWidget *label105;
1639   GtkWidget *label106;
1640   GtkWidget *vbox29;
1641   GtkWidget *b_add;
1642   GtkWidget *b_remove;
1643   GtkWidget *b_configure;
1644   GtkWidget *b_test;
1645   GtkWidget *frame61;
1646   GtkWidget *alignment53;
1647   GtkWidget *label107;
1648   GtkWidget *frame62;
1649   GtkWidget *alignment54;
1650   GtkWidget *hbox37;
1651   GtkWidget *pixmap1;
1652   GtkWidget *label108;
1653   GtkWidget *label109;
1654   GtkWidget *vbox30;
1655   GtkWidget *frame63;
1656   GtkWidget *alignment55;
1657   GtkWidget *hbox38;
1658   GtkWidget *scrolledwindow18;
1659   GtkWidget *clist2;
1660   GtkWidget *label110;
1661   GtkWidget *label111;
1662   GtkWidget *label112;
1663   GtkWidget *vbox31;
1664   GtkWidget *bs_add;
1665   GtkWidget *bs_remove;
1666   GtkWidget *bs_configure;
1667   GtkWidget *bs_test;
1668   GtkWidget *frame64;
1669   GtkWidget *alignment56;
1670   GtkWidget *label113;
1671   GtkWidget *frame65;
1672   GtkWidget *alignment57;
1673   GtkWidget *hbox39;
1674   GtkWidget *pixmap2;
1675   GtkWidget *label114;
1676   GtkWidget *label115;
1677   GtkWidget *vbox32;
1678   GtkWidget *frame66;
1679   GtkWidget *alignment58;
1680   GtkWidget *hbox40;
1681   GtkWidget *vbox33;
1682   GtkWidget *hbox41;
1683   GtkWidget *frame67;
1684   GtkWidget *alignment59;
1685   GtkWidget *hbox42;
1686   GtkWidget *label116;
1687   GtkWidget *optionmenu1;
1688   GtkWidget *menu2;
1689   GtkWidget *hbox43;
1690   GtkWidget *scrolledwindow19;
1691   GtkWidget *clist3;
1692   GtkWidget *label117;
1693   GtkWidget *scrolledwindow20;
1694   GtkWidget *clist4;
1695   GtkWidget *label118;
1696   GtkWidget *frame68;
1697   GtkWidget *alignment60;
1698   GtkWidget *hbox44;
1699   GtkWidget *label119;
1700   GtkWidget *t_fileselected;
1701   GtkWidget *vbox34;
1702   GtkWidget *bf_add;
1703   GtkWidget *bf_remove;
1704   GtkWidget *bf_configure;
1705   GtkWidget *bf_test;
1706   GtkWidget *bf_setdir;
1707   GtkWidget *frame69;
1708   GtkWidget *alignment61;
1709   GtkWidget *frame70;
1710   GtkWidget *alignment62;
1711   GtkWidget *hbox45;
1712   GtkWidget *pixmap3;
1713   GtkWidget *label120;
1714   GtkWidget *label121;
1715   GtkWidget *hbuttonbox2;
1716   GtkWidget *b_cancel;
1717   GtkWidget *b_ok;
1718   GtkAccelGroup *accel_group;
1719 
1720   if (!GTK_IS_WIDGET (hwnd))
1721     {
1722       gtk_init (0, NULL);
1723       hwnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1724     }
1725 
1726   if (hwnd == NULL || !GTK_IS_WIDGET (hwnd))
1727     return;
1728 
1729   accel_group = gtk_accel_group_new ();
1730 
1731   dsnchooser = gtk_dialog_new ();
1732   gtk_widget_set_name (dsnchooser, "dsnchooser");
1733   gtk_widget_set_size_request (dsnchooser, 570, 420);
1734   gtk_window_set_title (GTK_WINDOW (dsnchooser), _("Select Data Source"));
1735   gtk_window_set_position (GTK_WINDOW (dsnchooser), GTK_WIN_POS_CENTER);
1736   gtk_window_set_modal (GTK_WINDOW (dsnchooser), TRUE);
1737   gtk_window_set_default_size (GTK_WINDOW (dsnchooser), 600, 450);
1738   gtk_window_set_type_hint (GTK_WINDOW (dsnchooser), GDK_WINDOW_TYPE_HINT_DIALOG);
1739 
1740 #if GTK_CHECK_VERSION(2,0,0)
1741   gtk_widget_show (dsnchooser);
1742 #endif
1743 
1744   vbox27 = GTK_DIALOG (dsnchooser)->vbox;
1745   gtk_widget_set_name (vbox27, "vbox27");
1746   gtk_widget_show (vbox27);
1747 
1748   notebook1 = gtk_notebook_new ();
1749   gtk_widget_set_name (notebook1, "notebook1");
1750   gtk_widget_show (notebook1);
1751   gtk_box_pack_start (GTK_BOX (vbox27), notebook1, TRUE, TRUE, 0);
1752 
1753   vbox28 = gtk_vbox_new (FALSE, 0);
1754   gtk_widget_set_name (vbox28, "vbox28");
1755   gtk_widget_show (vbox28);
1756   gtk_container_add (GTK_CONTAINER (notebook1), vbox28);
1757 
1758   frame60 = gtk_frame_new (NULL);
1759   gtk_widget_set_name (frame60, "frame60");
1760   gtk_widget_show (frame60);
1761   gtk_box_pack_start (GTK_BOX (vbox28), frame60, TRUE, TRUE, 0);
1762   gtk_frame_set_shadow_type (GTK_FRAME (frame60), GTK_SHADOW_NONE);
1763 
1764   alignment52 = gtk_alignment_new (0.5, 0.5, 1, 1);
1765   gtk_widget_set_name (alignment52, "alignment52");
1766   gtk_widget_show (alignment52);
1767   gtk_container_add (GTK_CONTAINER (frame60), alignment52);
1768   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment52), 0, 0, 4, 0);
1769 
1770   hbox36 = gtk_hbox_new (FALSE, 0);
1771   gtk_widget_set_name (hbox36, "hbox36");
1772   gtk_widget_show (hbox36);
1773   gtk_container_add (GTK_CONTAINER (alignment52), hbox36);
1774 
1775   scrolledwindow17 = gtk_scrolled_window_new (NULL, NULL);
1776   gtk_widget_set_name (scrolledwindow17, "scrolledwindow17");
1777   gtk_widget_show (scrolledwindow17);
1778   gtk_box_pack_start (GTK_BOX (hbox36), scrolledwindow17, TRUE, TRUE, 0);
1779   gtk_widget_set_size_request (scrolledwindow17, 440, 219);
1780   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow17), GTK_SHADOW_IN);
1781 
1782   clist1 = gtk_clist_new (3);
1783   gtk_widget_set_name (clist1, "clist1");
1784   gtk_widget_show (clist1);
1785   gtk_container_add (GTK_CONTAINER (scrolledwindow17), clist1);
1786   gtk_clist_set_column_width (GTK_CLIST (clist1), 0, 100);
1787   gtk_clist_set_column_width (GTK_CLIST (clist1), 1, 162);
1788   gtk_clist_set_column_width (GTK_CLIST (clist1), 2, 80);
1789   gtk_clist_column_titles_show (GTK_CLIST (clist1));
1790 
1791   label104 = gtk_label_new (_("Name"));
1792   gtk_widget_set_name (label104, "label104");
1793   gtk_widget_show (label104);
1794   gtk_clist_set_column_widget (GTK_CLIST (clist1), 0, label104);
1795   gtk_widget_set_size_request (label104, 100, -1);
1796 
1797   label105 = gtk_label_new (_("Description"));
1798   gtk_widget_set_name (label105, "label105");
1799   gtk_widget_show (label105);
1800   gtk_clist_set_column_widget (GTK_CLIST (clist1), 1, label105);
1801   gtk_widget_set_size_request (label105, 162, -1);
1802 
1803   label106 = gtk_label_new (_("Driver"));
1804   gtk_widget_set_name (label106, "label106");
1805   gtk_widget_show (label106);
1806   gtk_clist_set_column_widget (GTK_CLIST (clist1), 2, label106);
1807   gtk_widget_set_size_request (label106, 80, -1);
1808 
1809   vbox29 = gtk_vbox_new (FALSE, 0);
1810   gtk_widget_set_name (vbox29, "vbox29");
1811   gtk_widget_show (vbox29);
1812   gtk_box_pack_start (GTK_BOX (hbox36), vbox29, FALSE, TRUE, 0);
1813 
1814   b_add = gtk_button_new_from_stock ("gtk-add");
1815   gtk_widget_set_name (b_add, "b_add");
1816   gtk_widget_show (b_add);
1817   gtk_box_pack_start (GTK_BOX (vbox29), b_add, FALSE, TRUE, 0);
1818   gtk_container_set_border_width (GTK_CONTAINER (b_add), 4);
1819   GTK_WIDGET_SET_FLAGS (b_add, GTK_CAN_DEFAULT);
1820   gtk_widget_add_accelerator (b_add, "clicked", accel_group,
1821                               GDK_A, (GdkModifierType) GDK_MOD1_MASK,
1822                               GTK_ACCEL_VISIBLE);
1823 
1824   b_remove = gtk_button_new_from_stock ("gtk-remove");
1825   gtk_widget_set_name (b_remove, "b_remove");
1826   gtk_widget_show (b_remove);
1827   gtk_box_pack_start (GTK_BOX (vbox29), b_remove, FALSE, TRUE, 0);
1828   gtk_container_set_border_width (GTK_CONTAINER (b_remove), 4);
1829   gtk_widget_set_sensitive (b_remove, FALSE);
1830   GTK_WIDGET_SET_FLAGS (b_remove, GTK_CAN_DEFAULT);
1831   gtk_widget_add_accelerator (b_remove, "clicked", accel_group,
1832                               GDK_R, (GdkModifierType) GDK_MOD1_MASK,
1833                               GTK_ACCEL_VISIBLE);
1834 
1835   b_configure = gtk_button_new_with_mnemonic (_("Confi_gure"));
1836   gtk_widget_set_name (b_configure, "b_configure");
1837   gtk_widget_show (b_configure);
1838   gtk_box_pack_start (GTK_BOX (vbox29), b_configure, FALSE, TRUE, 0);
1839   gtk_container_set_border_width (GTK_CONTAINER (b_configure), 4);
1840   gtk_widget_set_sensitive (b_configure, FALSE);
1841   GTK_WIDGET_SET_FLAGS (b_configure, GTK_CAN_DEFAULT);
1842   gtk_widget_add_accelerator (b_configure, "clicked", accel_group,
1843                               GDK_G, (GdkModifierType) GDK_MOD1_MASK,
1844                               GTK_ACCEL_VISIBLE);
1845   gtk_widget_add_accelerator (b_configure, "clicked", accel_group,
1846                               GDK_g, (GdkModifierType) GDK_MOD1_MASK,
1847                               GTK_ACCEL_VISIBLE);
1848 
1849   b_test = gtk_button_new_with_mnemonic (_("_Test"));
1850   gtk_widget_set_name (b_test, "b_test");
1851   gtk_widget_show (b_test);
1852   gtk_box_pack_start (GTK_BOX (vbox29), b_test, FALSE, TRUE, 0);
1853   gtk_container_set_border_width (GTK_CONTAINER (b_test), 4);
1854   gtk_widget_set_sensitive (b_test, FALSE);
1855   GTK_WIDGET_SET_FLAGS (b_test, GTK_CAN_DEFAULT);
1856   gtk_widget_add_accelerator (b_test, "clicked", accel_group,
1857                               GDK_T, (GdkModifierType) GDK_MOD1_MASK,
1858                               GTK_ACCEL_VISIBLE);
1859 
1860   frame61 = gtk_frame_new (NULL);
1861   gtk_widget_set_name (frame61, "frame61");
1862   gtk_widget_show (frame61);
1863   gtk_box_pack_start (GTK_BOX (vbox29), frame61, TRUE, TRUE, 0);
1864   gtk_widget_set_size_request (frame61, -1, 80);
1865   gtk_frame_set_shadow_type (GTK_FRAME (frame61), GTK_SHADOW_NONE);
1866 
1867   alignment53 = gtk_alignment_new (0.5, 0.5, 1, 1);
1868   gtk_widget_set_name (alignment53, "alignment53");
1869   gtk_widget_show (alignment53);
1870   gtk_container_add (GTK_CONTAINER (frame61), alignment53);
1871   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment53), 0, 0, 12, 0);
1872 
1873   label107 = gtk_label_new (_(" User Data Sources:"));
1874   gtk_widget_set_name (label107, "label107");
1875   gtk_widget_show (label107);
1876   gtk_frame_set_label_widget (GTK_FRAME (frame60), label107);
1877   gtk_label_set_use_markup (GTK_LABEL (label107), TRUE);
1878 
1879   frame62 = gtk_frame_new (NULL);
1880   gtk_widget_set_name (frame62, "frame62");
1881   gtk_widget_show (frame62);
1882   gtk_box_pack_start (GTK_BOX (vbox28), frame62, FALSE, TRUE, 0);
1883   gtk_container_set_border_width (GTK_CONTAINER (frame62), 3);
1884 
1885   alignment54 = gtk_alignment_new (0.5, 0.5, 1, 1);
1886   gtk_widget_set_name (alignment54, "alignment54");
1887   gtk_widget_show (alignment54);
1888   gtk_container_add (GTK_CONTAINER (frame62), alignment54);
1889 
1890   hbox37 = gtk_hbox_new (FALSE, 0);
1891   gtk_widget_set_name (hbox37, "hbox37");
1892   gtk_widget_show (hbox37);
1893   gtk_container_add (GTK_CONTAINER (alignment54), hbox37);
1894 
1895 #if GTK_CHECK_VERSION(2,0,0)
1896   style = gtk_widget_get_style (dsnchooser);
1897   pixmap =
1898       gdk_pixmap_create_from_xpm_d (dsnchooser->window, &mask,
1899       &style->bg[GTK_STATE_NORMAL], (gchar **) odbc4_xpm);
1900 #else
1901   style = gtk_widget_get_style (GTK_WIDGET (hwnd));
1902   pixmap =
1903       gdk_pixmap_create_from_xpm_d (GTK_WIDGET (hwnd)->window, &mask,
1904       &style->bg[GTK_STATE_NORMAL], (gchar **) odbc4_xpm);
1905 #endif
1906 
1907   pixmap1 = gtk_pixmap_new (pixmap, mask);
1908   gtk_widget_set_name (pixmap1, "pixmap1");
1909   gtk_widget_show (pixmap1);
1910   gtk_box_pack_start (GTK_BOX (hbox37), pixmap1, FALSE, TRUE, 10);
1911 
1912   label108 = gtk_label_new (_("An ODBC User data source stores information about to connect to\nthe indicated data provider. A User data source is only available to you,\nand can only be used on the current machine."));
1913   gtk_widget_set_name (label108, "label108");
1914   gtk_widget_show (label108);
1915   gtk_box_pack_start (GTK_BOX (hbox37), label108, FALSE, TRUE, 0);
1916   gtk_label_set_justify (GTK_LABEL (label108), GTK_JUSTIFY_FILL);
1917 
1918   label109 = gtk_label_new (_("User DSN"));
1919   gtk_widget_set_name (label109, "label109");
1920   gtk_widget_show (label109);
1921   gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), label109);
1922 
1923 
1924   choose_t->uadd = b_add;
1925   choose_t->uremove = b_remove;
1926   choose_t->utest = b_test;
1927   choose_t->uconfigure = b_configure;
1928 
1929 
1930 
1931   vbox30 = gtk_vbox_new (FALSE, 0);
1932   gtk_widget_set_name (vbox30, "vbox30");
1933   gtk_widget_show (vbox30);
1934   gtk_container_add (GTK_CONTAINER (notebook1), vbox30);
1935 
1936   frame63 = gtk_frame_new (NULL);
1937   gtk_widget_set_name (frame63, "frame63");
1938   gtk_widget_show (frame63);
1939   gtk_box_pack_start (GTK_BOX (vbox30), frame63, TRUE, TRUE, 0);
1940   gtk_frame_set_shadow_type (GTK_FRAME (frame63), GTK_SHADOW_NONE);
1941 
1942   alignment55 = gtk_alignment_new (0.5, 0.5, 1, 1);
1943   gtk_widget_set_name (alignment55, "alignment55");
1944   gtk_widget_show (alignment55);
1945   gtk_container_add (GTK_CONTAINER (frame63), alignment55);
1946   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment55), 0, 0, 4, 0);
1947 
1948   hbox38 = gtk_hbox_new (FALSE, 0);
1949   gtk_widget_set_name (hbox38, "hbox38");
1950   gtk_widget_show (hbox38);
1951   gtk_container_add (GTK_CONTAINER (alignment55), hbox38);
1952 
1953   scrolledwindow18 = gtk_scrolled_window_new (NULL, NULL);
1954   gtk_widget_set_name (scrolledwindow18, "scrolledwindow18");
1955   gtk_widget_show (scrolledwindow18);
1956   gtk_box_pack_start (GTK_BOX (hbox38), scrolledwindow18, TRUE, TRUE, 0);
1957   gtk_widget_set_size_request (scrolledwindow18, 440, 219);
1958   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow18), GTK_SHADOW_IN);
1959 
1960   clist2 = gtk_clist_new (3);
1961   gtk_widget_set_name (clist2, "clist2");
1962   gtk_widget_show (clist2);
1963   gtk_container_add (GTK_CONTAINER (scrolledwindow18), clist2);
1964   gtk_clist_set_column_width (GTK_CLIST (clist2), 0, 100);
1965   gtk_clist_set_column_width (GTK_CLIST (clist2), 1, 163);
1966   gtk_clist_set_column_width (GTK_CLIST (clist2), 2, 80);
1967   gtk_clist_column_titles_show (GTK_CLIST (clist2));
1968 
1969   label110 = gtk_label_new (_("Name"));
1970   gtk_widget_set_name (label110, "label110");
1971   gtk_widget_show (label110);
1972   gtk_clist_set_column_widget (GTK_CLIST (clist2), 0, label110);
1973   gtk_widget_set_size_request (label110, 100, -1);
1974 
1975   label111 = gtk_label_new (_("Description"));
1976   gtk_widget_set_name (label111, "label111");
1977   gtk_widget_show (label111);
1978   gtk_clist_set_column_widget (GTK_CLIST (clist2), 1, label111);
1979   gtk_widget_set_size_request (label111, 162, -1);
1980 
1981   label112 = gtk_label_new (_("Driver"));
1982   gtk_widget_set_name (label112, "label112");
1983   gtk_widget_show (label112);
1984   gtk_clist_set_column_widget (GTK_CLIST (clist2), 2, label112);
1985   gtk_widget_set_size_request (label112, 80, -1);
1986 
1987   vbox31 = gtk_vbox_new (FALSE, 0);
1988   gtk_widget_set_name (vbox31, "vbox31");
1989   gtk_widget_show (vbox31);
1990   gtk_box_pack_start (GTK_BOX (hbox38), vbox31, FALSE, TRUE, 0);
1991 
1992   bs_add = gtk_button_new_from_stock ("gtk-add");
1993   gtk_widget_set_name (bs_add, "bs_add");
1994   gtk_widget_show (bs_add);
1995   gtk_box_pack_start (GTK_BOX (vbox31), bs_add, FALSE, TRUE, 0);
1996   gtk_container_set_border_width (GTK_CONTAINER (bs_add), 4);
1997   GTK_WIDGET_SET_FLAGS (bs_add, GTK_CAN_DEFAULT);
1998   gtk_widget_add_accelerator (bs_add, "clicked", accel_group,
1999                               GDK_A, (GdkModifierType) GDK_MOD1_MASK,
2000                               GTK_ACCEL_VISIBLE);
2001 
2002   bs_remove = gtk_button_new_from_stock ("gtk-remove");
2003   gtk_widget_set_name (bs_remove, "bs_remove");
2004   gtk_widget_show (bs_remove);
2005   gtk_box_pack_start (GTK_BOX (vbox31), bs_remove, FALSE, TRUE, 0);
2006   gtk_container_set_border_width (GTK_CONTAINER (bs_remove), 4);
2007   gtk_widget_set_sensitive (bs_remove, FALSE);
2008   GTK_WIDGET_SET_FLAGS (bs_remove, GTK_CAN_DEFAULT);
2009   gtk_widget_add_accelerator (bs_remove, "clicked", accel_group,
2010                               GDK_R, (GdkModifierType) GDK_MOD1_MASK,
2011                               GTK_ACCEL_VISIBLE);
2012 
2013   bs_configure = gtk_button_new_with_mnemonic (_("Confi_gure"));
2014   gtk_widget_set_name (bs_configure, "bs_configure");
2015   gtk_widget_show (bs_configure);
2016   gtk_box_pack_start (GTK_BOX (vbox31), bs_configure, FALSE, TRUE, 0);
2017   gtk_container_set_border_width (GTK_CONTAINER (bs_configure), 4);
2018   gtk_widget_set_sensitive (bs_configure, FALSE);
2019   GTK_WIDGET_SET_FLAGS (bs_configure, GTK_CAN_DEFAULT);
2020   gtk_widget_add_accelerator (bs_configure, "clicked", accel_group,
2021                               GDK_G, (GdkModifierType) GDK_MOD1_MASK,
2022                               GTK_ACCEL_VISIBLE);
2023   gtk_widget_add_accelerator (bs_configure, "clicked", accel_group,
2024                               GDK_g, (GdkModifierType) GDK_MOD1_MASK,
2025                               GTK_ACCEL_VISIBLE);
2026 
2027   bs_test = gtk_button_new_with_mnemonic (_("_Test"));
2028   gtk_widget_set_name (bs_test, "bs_test");
2029   gtk_widget_show (bs_test);
2030   gtk_box_pack_start (GTK_BOX (vbox31), bs_test, FALSE, TRUE, 0);
2031   gtk_container_set_border_width (GTK_CONTAINER (bs_test), 4);
2032   gtk_widget_set_sensitive (bs_test, FALSE);
2033   GTK_WIDGET_SET_FLAGS (bs_test, GTK_CAN_DEFAULT);
2034   gtk_widget_add_accelerator (bs_test, "clicked", accel_group,
2035                               GDK_T, (GdkModifierType) GDK_MOD1_MASK,
2036                               GTK_ACCEL_VISIBLE);
2037 
2038   frame64 = gtk_frame_new (NULL);
2039   gtk_widget_set_name (frame64, "frame64");
2040   gtk_widget_show (frame64);
2041   gtk_box_pack_start (GTK_BOX (vbox31), frame64, TRUE, TRUE, 0);
2042   gtk_widget_set_size_request (frame64, -1, 80);
2043   gtk_frame_set_shadow_type (GTK_FRAME (frame64), GTK_SHADOW_NONE);
2044 
2045   alignment56 = gtk_alignment_new (0.5, 0.5, 1, 1);
2046   gtk_widget_set_name (alignment56, "alignment56");
2047   gtk_widget_show (alignment56);
2048   gtk_container_add (GTK_CONTAINER (frame64), alignment56);
2049   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment56), 0, 0, 12, 0);
2050 
2051   label113 = gtk_label_new (_(" System Data Sources:"));
2052   gtk_widget_set_name (label113, "label113");
2053   gtk_widget_show (label113);
2054   gtk_frame_set_label_widget (GTK_FRAME (frame63), label113);
2055   gtk_label_set_use_markup (GTK_LABEL (label113), TRUE);
2056 
2057   frame65 = gtk_frame_new (NULL);
2058   gtk_widget_set_name (frame65, "frame65");
2059   gtk_widget_show (frame65);
2060   gtk_box_pack_start (GTK_BOX (vbox30), frame65, FALSE, TRUE, 0);
2061   gtk_container_set_border_width (GTK_CONTAINER (frame65), 3);
2062 
2063   alignment57 = gtk_alignment_new (0.5, 0.5, 1, 1);
2064   gtk_widget_set_name (alignment57, "alignment57");
2065   gtk_widget_show (alignment57);
2066   gtk_container_add (GTK_CONTAINER (frame65), alignment57);
2067 
2068   hbox39 = gtk_hbox_new (FALSE, 0);
2069   gtk_widget_set_name (hbox39, "hbox39");
2070   gtk_widget_show (hbox39);
2071   gtk_container_add (GTK_CONTAINER (alignment57), hbox39);
2072   gtk_container_set_border_width (GTK_CONTAINER (hbox39), 10);
2073 
2074   pixmap2 = gtk_pixmap_new (pixmap, mask);
2075   gtk_widget_set_name (pixmap2, "pixmap2");
2076   gtk_widget_show (pixmap2);
2077   gtk_box_pack_start (GTK_BOX (hbox39), pixmap2, FALSE, TRUE, 10);
2078 
2079   label114 = gtk_label_new (_("An ODBC System data source stores information about to connect to\nthe indicated data provider. A System data source is visible to all\nusers on this machine, including daemons."));
2080   gtk_widget_set_name (label114, "label114");
2081   gtk_widget_show (label114);
2082   gtk_box_pack_start (GTK_BOX (hbox39), label114, FALSE, TRUE, 0);
2083   gtk_label_set_justify (GTK_LABEL (label114), GTK_JUSTIFY_FILL);
2084 
2085   label115 = gtk_label_new (_("System DSN"));
2086   gtk_widget_set_name (label115, "label115");
2087   gtk_widget_show (label115);
2088   gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label115);
2089 
2090 
2091 
2092   choose_t->sadd = bs_add;
2093   choose_t->sremove = bs_remove;
2094   choose_t->stest = bs_test;
2095   choose_t->sconfigure = bs_configure;
2096 
2097 
2098 
2099   vbox32 = gtk_vbox_new (FALSE, 0);
2100   gtk_widget_set_name (vbox32, "vbox32");
2101   gtk_widget_show (vbox32);
2102   gtk_container_add (GTK_CONTAINER (notebook1), vbox32);
2103 
2104   frame66 = gtk_frame_new (NULL);
2105   gtk_widget_set_name (frame66, "frame66");
2106   gtk_widget_show (frame66);
2107   gtk_box_pack_start (GTK_BOX (vbox32), frame66, TRUE, TRUE, 0);
2108   gtk_container_set_border_width (GTK_CONTAINER (frame66), 2);
2109   gtk_frame_set_shadow_type (GTK_FRAME (frame66), GTK_SHADOW_NONE);
2110 
2111   alignment58 = gtk_alignment_new (0.5, 0.5, 1, 1);
2112   gtk_widget_set_name (alignment58, "alignment58");
2113   gtk_widget_show (alignment58);
2114   gtk_container_add (GTK_CONTAINER (frame66), alignment58);
2115   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment58), 0, 0, 4, 0);
2116 
2117   hbox40 = gtk_hbox_new (FALSE, 0);
2118   gtk_widget_set_name (hbox40, "hbox40");
2119   gtk_widget_show (hbox40);
2120   gtk_container_add (GTK_CONTAINER (alignment58), hbox40);
2121 
2122   vbox33 = gtk_vbox_new (FALSE, 0);
2123   gtk_widget_set_name (vbox33, "vbox33");
2124   gtk_widget_show (vbox33);
2125   gtk_box_pack_start (GTK_BOX (hbox40), vbox33, TRUE, TRUE, 0);
2126   gtk_widget_set_size_request (vbox33, 436, 250);
2127 
2128   hbox41 = gtk_hbox_new (FALSE, 0);
2129   gtk_widget_set_name (hbox41, "hbox41");
2130   gtk_widget_show (hbox41);
2131   gtk_box_pack_start (GTK_BOX (vbox33), hbox41, FALSE, FALSE, 0);
2132 
2133   frame67 = gtk_frame_new (NULL);
2134   gtk_widget_set_name (frame67, "frame67");
2135   gtk_widget_show (frame67);
2136   gtk_box_pack_start (GTK_BOX (hbox41), frame67, TRUE, TRUE, 0);
2137   gtk_container_set_border_width (GTK_CONTAINER (frame67), 4);
2138   gtk_frame_set_shadow_type (GTK_FRAME (frame67), GTK_SHADOW_NONE);
2139 
2140   alignment59 = gtk_alignment_new (0.5, 0.5, 1, 1);
2141   gtk_widget_set_name (alignment59, "alignment59");
2142   gtk_widget_show (alignment59);
2143   gtk_container_add (GTK_CONTAINER (frame67), alignment59);
2144   gtk_container_set_border_width (GTK_CONTAINER (alignment59), 2);
2145   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment59), 0, 0, 6, 0);
2146 
2147   hbox42 = gtk_hbox_new (FALSE, 0);
2148   gtk_widget_set_name (hbox42, "hbox42");
2149   gtk_widget_show (hbox42);
2150   gtk_container_add (GTK_CONTAINER (alignment59), hbox42);
2151 
2152   label116 = gtk_label_new (_("Look in : "));
2153   gtk_widget_set_name (label116, "label116");
2154   gtk_widget_show (label116);
2155   gtk_box_pack_start (GTK_BOX (hbox42), label116, FALSE, FALSE, 0);
2156 
2157   optionmenu1 = gtk_option_menu_new ();
2158   gtk_widget_set_name (optionmenu1, "optionmenu1");
2159   gtk_widget_show (optionmenu1);
2160   gtk_box_pack_start (GTK_BOX (hbox42), optionmenu1, TRUE, TRUE, 0);
2161 
2162   menu2 = gtk_menu_new ();
2163   gtk_widget_set_name (menu2, "menu2");
2164 
2165   gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), menu2);
2166 
2167   hbox43 = gtk_hbox_new (FALSE, 0);
2168   gtk_widget_set_name (hbox43, "hbox43");
2169   gtk_widget_show (hbox43);
2170   gtk_box_pack_start (GTK_BOX (vbox33), hbox43, TRUE, TRUE, 0);
2171 
2172   scrolledwindow19 = gtk_scrolled_window_new (NULL, NULL);
2173   gtk_widget_set_name (scrolledwindow19, "scrolledwindow19");
2174   gtk_widget_show (scrolledwindow19);
2175   gtk_box_pack_start (GTK_BOX (hbox43), scrolledwindow19, TRUE, TRUE, 0);
2176   gtk_widget_set_size_request (scrolledwindow19, 96, -1);
2177   gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow19), 4);
2178 
2179   clist3 = gtk_clist_new (1);
2180   gtk_widget_set_name (clist3, "clist3");
2181   gtk_widget_show (clist3);
2182   gtk_container_add (GTK_CONTAINER (scrolledwindow19), clist3);
2183   gtk_clist_set_column_width (GTK_CLIST (clist3), 0, 80);
2184   gtk_clist_column_titles_show (GTK_CLIST (clist3));
2185 
2186   label117 = gtk_label_new (_("Directories"));
2187   gtk_widget_set_name (label117, "label117");
2188   gtk_widget_show (label117);
2189   gtk_clist_set_column_widget (GTK_CLIST (clist3), 0, label117);
2190 
2191   scrolledwindow20 = gtk_scrolled_window_new (NULL, NULL);
2192   gtk_widget_set_name (scrolledwindow20, "scrolledwindow20");
2193   gtk_widget_show (scrolledwindow20);
2194   gtk_box_pack_start (GTK_BOX (hbox43), scrolledwindow20, TRUE, TRUE, 0);
2195   gtk_widget_set_size_request (scrolledwindow20, 102, -1);
2196   gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow20), 4);
2197 
2198   clist4 = gtk_clist_new (1);
2199   gtk_widget_set_name (clist4, "clist4");
2200   gtk_widget_show (clist4);
2201   gtk_container_add (GTK_CONTAINER (scrolledwindow20), clist4);
2202   gtk_clist_set_column_width (GTK_CLIST (clist4), 0, 80);
2203   gtk_clist_column_titles_show (GTK_CLIST (clist4));
2204 
2205   label118 = gtk_label_new (_("Files"));
2206   gtk_widget_set_name (label118, "label118");
2207   gtk_widget_show (label118);
2208   gtk_clist_set_column_widget (GTK_CLIST (clist4), 0, label118);
2209 
2210   frame68 = gtk_frame_new (NULL);
2211   gtk_widget_set_name (frame68, "frame68");
2212   gtk_widget_show (frame68);
2213   gtk_box_pack_start (GTK_BOX (vbox33), frame68, FALSE, TRUE, 0);
2214   gtk_container_set_border_width (GTK_CONTAINER (frame68), 4);
2215   gtk_frame_set_shadow_type (GTK_FRAME (frame68), GTK_SHADOW_NONE);
2216 
2217   alignment60 = gtk_alignment_new (0.5, 0.5, 1, 1);
2218   gtk_widget_set_name (alignment60, "alignment60");
2219   gtk_widget_show (alignment60);
2220   gtk_container_add (GTK_CONTAINER (frame68), alignment60);
2221   gtk_container_set_border_width (GTK_CONTAINER (alignment60), 2);
2222   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment60), 0, 0, 6, 0);
2223 
2224   hbox44 = gtk_hbox_new (FALSE, 0);
2225   gtk_widget_set_name (hbox44, "hbox44");
2226   gtk_widget_show (hbox44);
2227   gtk_container_add (GTK_CONTAINER (alignment60), hbox44);
2228 
2229   label119 = gtk_label_new (_("File selected:"));
2230   gtk_widget_set_name (label119, "label119");
2231   gtk_widget_show (label119);
2232   gtk_box_pack_start (GTK_BOX (hbox44), label119, FALSE, FALSE, 0);
2233 
2234   t_fileselected = gtk_entry_new ();
2235   gtk_widget_set_name (t_fileselected, "t_fileselected");
2236   gtk_widget_show (t_fileselected);
2237   gtk_box_pack_start (GTK_BOX (hbox44), t_fileselected, TRUE, TRUE, 0);
2238 
2239   vbox34 = gtk_vbox_new (FALSE, 0);
2240   gtk_widget_set_name (vbox34, "vbox34");
2241   gtk_widget_show (vbox34);
2242   gtk_box_pack_start (GTK_BOX (hbox40), vbox34, FALSE, TRUE, 0);
2243 
2244   bf_add = gtk_button_new_from_stock ("gtk-add");
2245   gtk_widget_set_name (bf_add, "bf_add");
2246   gtk_widget_show (bf_add);
2247   gtk_box_pack_start (GTK_BOX (vbox34), bf_add, FALSE, TRUE, 0);
2248   gtk_container_set_border_width (GTK_CONTAINER (bf_add), 4);
2249   GTK_WIDGET_SET_FLAGS (bf_add, GTK_CAN_DEFAULT);
2250   gtk_widget_add_accelerator (bf_add, "clicked", accel_group,
2251                               GDK_A, (GdkModifierType) GDK_MOD1_MASK,
2252                               GTK_ACCEL_VISIBLE);
2253 
2254   bf_remove = gtk_button_new_from_stock ("gtk-remove");
2255   gtk_widget_set_name (bf_remove, "bf_remove");
2256   gtk_widget_show (bf_remove);
2257   gtk_box_pack_start (GTK_BOX (vbox34), bf_remove, FALSE, TRUE, 0);
2258   gtk_container_set_border_width (GTK_CONTAINER (bf_remove), 4);
2259   GTK_WIDGET_SET_FLAGS (bf_remove, GTK_CAN_DEFAULT);
2260   gtk_widget_add_accelerator (bf_remove, "clicked", accel_group,
2261                               GDK_R, (GdkModifierType) GDK_MOD1_MASK,
2262                               GTK_ACCEL_VISIBLE);
2263 
2264   bf_configure = gtk_button_new_with_mnemonic (_("Confi_gure"));
2265   gtk_widget_set_name (bf_configure, "bf_configure");
2266   gtk_widget_show (bf_configure);
2267   gtk_box_pack_start (GTK_BOX (vbox34), bf_configure, FALSE, TRUE, 0);
2268   gtk_container_set_border_width (GTK_CONTAINER (bf_configure), 4);
2269   GTK_WIDGET_SET_FLAGS (bf_configure, GTK_CAN_DEFAULT);
2270   gtk_widget_add_accelerator (bf_configure, "clicked", accel_group,
2271                               GDK_G, (GdkModifierType) GDK_MOD1_MASK,
2272                               GTK_ACCEL_VISIBLE);
2273   gtk_widget_add_accelerator (bf_configure, "clicked", accel_group,
2274                               GDK_g, (GdkModifierType) GDK_MOD1_MASK,
2275                               GTK_ACCEL_VISIBLE);
2276 
2277   bf_test = gtk_button_new_with_mnemonic (_("_Test"));
2278   gtk_widget_set_name (bf_test, "bf_test");
2279   gtk_widget_show (bf_test);
2280   gtk_box_pack_start (GTK_BOX (vbox34), bf_test, FALSE, TRUE, 0);
2281   gtk_container_set_border_width (GTK_CONTAINER (bf_test), 4);
2282   GTK_WIDGET_SET_FLAGS (bf_test, GTK_CAN_DEFAULT);
2283   gtk_widget_add_accelerator (bf_test, "clicked", accel_group,
2284                               GDK_T, (GdkModifierType) GDK_MOD1_MASK,
2285                               GTK_ACCEL_VISIBLE);
2286 
2287   bf_setdir = gtk_button_new_with_mnemonic (_("_Set Dir"));
2288   gtk_widget_set_name (bf_setdir, "bf_setdir");
2289   gtk_widget_show (bf_setdir);
2290   gtk_box_pack_start (GTK_BOX (vbox34), bf_setdir, FALSE, TRUE, 0);
2291   gtk_container_set_border_width (GTK_CONTAINER (bf_setdir), 4);
2292   GTK_WIDGET_SET_FLAGS (bf_setdir, GTK_CAN_DEFAULT);
2293   gtk_widget_add_accelerator (bf_setdir, "clicked", accel_group,
2294                               GDK_S, (GdkModifierType) GDK_MOD1_MASK,
2295                               GTK_ACCEL_VISIBLE);
2296 
2297   frame69 = gtk_frame_new (NULL);
2298   gtk_widget_set_name (frame69, "frame69");
2299   gtk_widget_show (frame69);
2300   gtk_box_pack_start (GTK_BOX (vbox34), frame69, TRUE, TRUE, 0);
2301   gtk_widget_set_size_request (frame69, -1, 80);
2302   gtk_frame_set_shadow_type (GTK_FRAME (frame69), GTK_SHADOW_NONE);
2303 
2304   alignment61 = gtk_alignment_new (0.5, 0.5, 1, 1);
2305   gtk_widget_set_name (alignment61, "alignment61");
2306   gtk_widget_show (alignment61);
2307   gtk_container_add (GTK_CONTAINER (frame69), alignment61);
2308   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment61), 0, 0, 12, 0);
2309 
2310   frame70 = gtk_frame_new (NULL);
2311   gtk_widget_set_name (frame70, "frame70");
2312   gtk_widget_show (frame70);
2313   gtk_box_pack_start (GTK_BOX (vbox32), frame70, FALSE, TRUE, 0);
2314   gtk_container_set_border_width (GTK_CONTAINER (frame70), 3);
2315 
2316   alignment62 = gtk_alignment_new (0.5, 0.5, 1, 1);
2317   gtk_widget_set_name (alignment62, "alignment62");
2318   gtk_widget_show (alignment62);
2319   gtk_container_add (GTK_CONTAINER (frame70), alignment62);
2320 
2321   hbox45 = gtk_hbox_new (FALSE, 0);
2322   gtk_widget_set_name (hbox45, "hbox45");
2323   gtk_widget_show (hbox45);
2324   gtk_container_add (GTK_CONTAINER (alignment62), hbox45);
2325   gtk_container_set_border_width (GTK_CONTAINER (hbox45), 10);
2326 
2327   pixmap3 = gtk_pixmap_new (pixmap, mask);
2328   gtk_widget_set_name (pixmap3, "pixmap3");
2329   gtk_widget_show (pixmap3);
2330   gtk_box_pack_start (GTK_BOX (hbox45), pixmap3, FALSE, TRUE, 10);
2331 
2332   label120 = gtk_label_new (_("Select the file data source that describes the driver that you wish to\nconnect to. You can use any file data source that refers to an ODBC\ndriver which is installed on your machine."));
2333   gtk_widget_set_name (label120, "label120");
2334   gtk_widget_show (label120);
2335   gtk_box_pack_start (GTK_BOX (hbox45), label120, FALSE, TRUE, 0);
2336   gtk_label_set_justify (GTK_LABEL (label120), GTK_JUSTIFY_FILL);
2337 
2338   label121 = gtk_label_new (_("File DSN"));
2339   gtk_widget_set_name (label121, "label121");
2340   gtk_widget_show (label121);
2341   gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label121);
2342 
2343 
2344 
2345   choose_t->fadd = bf_add;
2346   choose_t->fremove = bf_remove;
2347   choose_t->fconfigure = bf_configure;
2348   choose_t->ftest = bf_test;
2349   choose_t->dir_list = clist3;
2350   choose_t->dir_combo = optionmenu1;
2351   choose_t->file_list = clist4;
2352   choose_t->file_entry = t_fileselected;
2353   choose_t->fsetdir = bf_setdir;
2354 
2355 
2356   hbuttonbox2 = GTK_DIALOG (dsnchooser)->action_area;
2357   gtk_widget_set_name (hbuttonbox2, "hbuttonbox2");
2358   gtk_widget_show (hbuttonbox2);
2359   gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_END);
2360 
2361   b_cancel = gtk_button_new_from_stock ("gtk-cancel");
2362   gtk_widget_set_name (b_cancel, "b_cancel");
2363   gtk_widget_show (b_cancel);
2364   gtk_dialog_add_action_widget (GTK_DIALOG (dsnchooser), b_cancel, GTK_RESPONSE_CANCEL);
2365   GTK_WIDGET_SET_FLAGS (b_cancel, GTK_CAN_DEFAULT);
2366 
2367   b_ok = gtk_button_new_from_stock ("gtk-ok");
2368   gtk_widget_set_name (b_ok, "b_ok");
2369   gtk_widget_show (b_ok);
2370   gtk_dialog_add_action_widget (GTK_DIALOG (dsnchooser), b_ok, GTK_RESPONSE_OK);
2371   GTK_WIDGET_SET_FLAGS (b_ok, GTK_CAN_DEFAULT);
2372 
2373   /* Store pointers to all widgets, for use by lookup_widget(). */
2374   GLADE_HOOKUP_OBJECT_NO_REF (dsnchooser, dsnchooser, "dsnchooser");
2375   GLADE_HOOKUP_OBJECT_NO_REF (dsnchooser, vbox27, "vbox27");
2376   GLADE_HOOKUP_OBJECT (dsnchooser, notebook1, "notebook1");
2377   GLADE_HOOKUP_OBJECT (dsnchooser, vbox28, "vbox28");
2378   GLADE_HOOKUP_OBJECT (dsnchooser, frame60, "frame60");
2379   GLADE_HOOKUP_OBJECT (dsnchooser, alignment52, "alignment52");
2380   GLADE_HOOKUP_OBJECT (dsnchooser, hbox36, "hbox36");
2381   GLADE_HOOKUP_OBJECT (dsnchooser, scrolledwindow17, "scrolledwindow17");
2382   GLADE_HOOKUP_OBJECT (dsnchooser, clist1, "clist1");
2383   GLADE_HOOKUP_OBJECT (dsnchooser, label104, "label104");
2384   GLADE_HOOKUP_OBJECT (dsnchooser, label105, "label105");
2385   GLADE_HOOKUP_OBJECT (dsnchooser, label106, "label106");
2386   GLADE_HOOKUP_OBJECT (dsnchooser, vbox29, "vbox29");
2387   GLADE_HOOKUP_OBJECT (dsnchooser, b_add, "b_add");
2388   GLADE_HOOKUP_OBJECT (dsnchooser, b_remove, "b_remove");
2389   GLADE_HOOKUP_OBJECT (dsnchooser, b_configure, "b_configure");
2390   GLADE_HOOKUP_OBJECT (dsnchooser, b_test, "b_test");
2391   GLADE_HOOKUP_OBJECT (dsnchooser, frame61, "frame61");
2392   GLADE_HOOKUP_OBJECT (dsnchooser, alignment53, "alignment53");
2393   GLADE_HOOKUP_OBJECT (dsnchooser, label107, "label107");
2394   GLADE_HOOKUP_OBJECT (dsnchooser, frame62, "frame62");
2395   GLADE_HOOKUP_OBJECT (dsnchooser, alignment54, "alignment54");
2396   GLADE_HOOKUP_OBJECT (dsnchooser, hbox37, "hbox37");
2397   GLADE_HOOKUP_OBJECT (dsnchooser, pixmap1, "pixmap1");
2398   GLADE_HOOKUP_OBJECT (dsnchooser, label108, "label108");
2399   GLADE_HOOKUP_OBJECT (dsnchooser, label109, "label109");
2400   GLADE_HOOKUP_OBJECT (dsnchooser, vbox30, "vbox30");
2401   GLADE_HOOKUP_OBJECT (dsnchooser, frame63, "frame63");
2402   GLADE_HOOKUP_OBJECT (dsnchooser, alignment55, "alignment55");
2403   GLADE_HOOKUP_OBJECT (dsnchooser, hbox38, "hbox38");
2404   GLADE_HOOKUP_OBJECT (dsnchooser, scrolledwindow18, "scrolledwindow18");
2405   GLADE_HOOKUP_OBJECT (dsnchooser, clist2, "clist2");
2406   GLADE_HOOKUP_OBJECT (dsnchooser, label110, "label110");
2407   GLADE_HOOKUP_OBJECT (dsnchooser, label111, "label111");
2408   GLADE_HOOKUP_OBJECT (dsnchooser, label112, "label112");
2409   GLADE_HOOKUP_OBJECT (dsnchooser, vbox31, "vbox31");
2410   GLADE_HOOKUP_OBJECT (dsnchooser, bs_add, "bs_add");
2411   GLADE_HOOKUP_OBJECT (dsnchooser, bs_remove, "bs_remove");
2412   GLADE_HOOKUP_OBJECT (dsnchooser, bs_configure, "bs_configure");
2413   GLADE_HOOKUP_OBJECT (dsnchooser, bs_test, "bs_test");
2414   GLADE_HOOKUP_OBJECT (dsnchooser, frame64, "frame64");
2415   GLADE_HOOKUP_OBJECT (dsnchooser, alignment56, "alignment56");
2416   GLADE_HOOKUP_OBJECT (dsnchooser, label113, "label113");
2417   GLADE_HOOKUP_OBJECT (dsnchooser, frame65, "frame65");
2418   GLADE_HOOKUP_OBJECT (dsnchooser, alignment57, "alignment57");
2419   GLADE_HOOKUP_OBJECT (dsnchooser, hbox39, "hbox39");
2420   GLADE_HOOKUP_OBJECT (dsnchooser, pixmap2, "pixmap2");
2421   GLADE_HOOKUP_OBJECT (dsnchooser, label114, "label114");
2422   GLADE_HOOKUP_OBJECT (dsnchooser, label115, "label115");
2423   GLADE_HOOKUP_OBJECT (dsnchooser, vbox32, "vbox32");
2424   GLADE_HOOKUP_OBJECT (dsnchooser, frame66, "frame66");
2425   GLADE_HOOKUP_OBJECT (dsnchooser, alignment58, "alignment58");
2426   GLADE_HOOKUP_OBJECT (dsnchooser, hbox40, "hbox40");
2427   GLADE_HOOKUP_OBJECT (dsnchooser, vbox33, "vbox33");
2428   GLADE_HOOKUP_OBJECT (dsnchooser, hbox41, "hbox41");
2429   GLADE_HOOKUP_OBJECT (dsnchooser, frame67, "frame67");
2430   GLADE_HOOKUP_OBJECT (dsnchooser, alignment59, "alignment59");
2431   GLADE_HOOKUP_OBJECT (dsnchooser, hbox42, "hbox42");
2432   GLADE_HOOKUP_OBJECT (dsnchooser, label116, "label116");
2433   GLADE_HOOKUP_OBJECT (dsnchooser, optionmenu1, "optionmenu1");
2434   GLADE_HOOKUP_OBJECT (dsnchooser, menu2, "menu2");
2435   GLADE_HOOKUP_OBJECT (dsnchooser, hbox43, "hbox43");
2436   GLADE_HOOKUP_OBJECT (dsnchooser, scrolledwindow19, "scrolledwindow19");
2437   GLADE_HOOKUP_OBJECT (dsnchooser, clist3, "clist3");
2438   GLADE_HOOKUP_OBJECT (dsnchooser, label117, "label117");
2439   GLADE_HOOKUP_OBJECT (dsnchooser, scrolledwindow20, "scrolledwindow20");
2440   GLADE_HOOKUP_OBJECT (dsnchooser, clist4, "clist4");
2441   GLADE_HOOKUP_OBJECT (dsnchooser, label118, "label118");
2442   GLADE_HOOKUP_OBJECT (dsnchooser, frame68, "frame68");
2443   GLADE_HOOKUP_OBJECT (dsnchooser, alignment60, "alignment60");
2444   GLADE_HOOKUP_OBJECT (dsnchooser, hbox44, "hbox44");
2445   GLADE_HOOKUP_OBJECT (dsnchooser, label119, "label119");
2446   GLADE_HOOKUP_OBJECT (dsnchooser, t_fileselected, "t_fileselected");
2447   GLADE_HOOKUP_OBJECT (dsnchooser, vbox34, "vbox34");
2448   GLADE_HOOKUP_OBJECT (dsnchooser, bf_add, "bf_add");
2449   GLADE_HOOKUP_OBJECT (dsnchooser, bf_remove, "bf_remove");
2450   GLADE_HOOKUP_OBJECT (dsnchooser, bf_configure, "bf_configure");
2451   GLADE_HOOKUP_OBJECT (dsnchooser, bf_test, "bf_test");
2452   GLADE_HOOKUP_OBJECT (dsnchooser, bf_setdir, "bf_setdir");
2453   GLADE_HOOKUP_OBJECT (dsnchooser, frame69, "frame69");
2454   GLADE_HOOKUP_OBJECT (dsnchooser, alignment61, "alignment61");
2455   GLADE_HOOKUP_OBJECT (dsnchooser, frame70, "frame70");
2456   GLADE_HOOKUP_OBJECT (dsnchooser, alignment62, "alignment62");
2457   GLADE_HOOKUP_OBJECT (dsnchooser, hbox45, "hbox45");
2458   GLADE_HOOKUP_OBJECT (dsnchooser, pixmap3, "pixmap3");
2459   GLADE_HOOKUP_OBJECT (dsnchooser, label120, "label120");
2460   GLADE_HOOKUP_OBJECT (dsnchooser, label121, "label121");
2461   GLADE_HOOKUP_OBJECT_NO_REF (dsnchooser, hbuttonbox2, "hbuttonbox2");
2462   GLADE_HOOKUP_OBJECT (dsnchooser, b_cancel, "b_cancel");
2463   GLADE_HOOKUP_OBJECT (dsnchooser, b_ok, "b_ok");
2464 
2465   /* Notebook events */
2466   gtk_signal_connect_after (GTK_OBJECT (notebook1), "switch_page",
2467       GTK_SIGNAL_FUNC (dsnchooser_switch_page), choose_t);
2468   /* Ok button events */
2469   gtk_signal_connect (GTK_OBJECT (b_ok), "clicked",
2470       GTK_SIGNAL_FUNC (dsnchooser_ok_clicked), choose_t);
2471   /* Cancel button events */
2472   gtk_signal_connect (GTK_OBJECT (b_cancel), "clicked",
2473       GTK_SIGNAL_FUNC (dsnchooser_cancel_clicked), choose_t);
2474   /* Close window button events */
2475   gtk_signal_connect (GTK_OBJECT (dsnchooser), "delete_event",
2476       GTK_SIGNAL_FUNC (delete_event), choose_t);
2477   gtk_signal_connect (GTK_OBJECT (dsnchooser), "destroy",
2478       GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
2479   /* Add user DSN button events */
2480   gtk_signal_connect (GTK_OBJECT (choose_t->uadd), "clicked",
2481       GTK_SIGNAL_FUNC (userdsn_add_clicked), choose_t);
2482   /* Remove user DSN button events */
2483   gtk_signal_connect (GTK_OBJECT (choose_t->uremove), "clicked",
2484       GTK_SIGNAL_FUNC (userdsn_remove_clicked), choose_t);
2485   /* Test user DSN button events */
2486   gtk_signal_connect (GTK_OBJECT (choose_t->utest), "clicked",
2487       GTK_SIGNAL_FUNC (userdsn_test_clicked), choose_t);
2488   /* Configure user DSN button events */
2489   gtk_signal_connect (GTK_OBJECT (choose_t->uconfigure), "clicked",
2490       GTK_SIGNAL_FUNC (userdsn_configure_clicked), choose_t);
2491   /* Add system DSN button events */
2492   gtk_signal_connect (GTK_OBJECT (choose_t->sadd), "clicked",
2493       GTK_SIGNAL_FUNC (systemdsn_add_clicked), choose_t);
2494   /* Remove system DSN button events */
2495   gtk_signal_connect (GTK_OBJECT (choose_t->sremove), "clicked",
2496       GTK_SIGNAL_FUNC (systemdsn_remove_clicked), choose_t);
2497   /* Test system DSN button events */
2498   gtk_signal_connect (GTK_OBJECT (choose_t->stest), "clicked",
2499       GTK_SIGNAL_FUNC (systemdsn_test_clicked), choose_t);
2500   /* Configure system DSN button events */
2501   gtk_signal_connect (GTK_OBJECT (choose_t->sconfigure), "clicked",
2502       GTK_SIGNAL_FUNC (systemdsn_configure_clicked), choose_t);
2503   /* User DSN list events */
2504   gtk_signal_connect (GTK_OBJECT (clist1), "select_row",
2505       GTK_SIGNAL_FUNC (userdsn_list_select), choose_t);
2506   gtk_signal_connect (GTK_OBJECT (clist1), "unselect_row",
2507       GTK_SIGNAL_FUNC (userdsn_list_unselect), choose_t);
2508   /* System DSN list events */
2509   gtk_signal_connect (GTK_OBJECT (clist2), "select_row",
2510       GTK_SIGNAL_FUNC (systemdsn_list_select), choose_t);
2511   gtk_signal_connect (GTK_OBJECT (clist2), "unselect_row",
2512       GTK_SIGNAL_FUNC (systemdsn_list_unselect), choose_t);
2513 
2514   /* Add file DSN button events */
2515   gtk_signal_connect (GTK_OBJECT (choose_t->fadd), "clicked",
2516       GTK_SIGNAL_FUNC (filedsn_add_clicked),
2517       choose_t);
2518   /* Remove file DSN button events */
2519   gtk_signal_connect (GTK_OBJECT (choose_t->fremove), "clicked",
2520       GTK_SIGNAL_FUNC (filedsn_remove_clicked),
2521       choose_t);
2522   /* Test file DSN button events */
2523   gtk_signal_connect (GTK_OBJECT (choose_t->ftest), "clicked",
2524      GTK_SIGNAL_FUNC (filedsn_test_clicked),
2525      choose_t);
2526   /* Configure file DSN button events */
2527   gtk_signal_connect (GTK_OBJECT (choose_t->fconfigure), "clicked",
2528      GTK_SIGNAL_FUNC (filedsn_configure_clicked),
2529      choose_t);
2530   /* Configure file DSN button events */
2531   gtk_signal_connect (GTK_OBJECT (choose_t->fsetdir), "clicked",
2532      GTK_SIGNAL_FUNC (filedsn_setdir_clicked),
2533      choose_t);
2534   /* Directories file DSN list events */
2535   gtk_signal_connect (GTK_OBJECT (clist3), "select_row",
2536      GTK_SIGNAL_FUNC (filedsn_dirlist_select),
2537      choose_t);
2538   /* Files file DSN list events */
2539   gtk_signal_connect (GTK_OBJECT (clist4), "select_row",
2540      GTK_SIGNAL_FUNC (filedsn_filelist_select),
2541      choose_t);
2542   gtk_signal_connect (GTK_OBJECT (clist4), "unselect_row",
2543      GTK_SIGNAL_FUNC (filedsn_filelist_unselect),
2544      choose_t);
2545 
2546   gtk_window_add_accel_group (GTK_WINDOW (dsnchooser), accel_group);
2547 
2548   SQLSetConfigMode (ODBC_BOTH_DSN);
2549   if (!SQLGetPrivateProfileString("ODBC", "FileDSNPath", "",
2550       choose_t->curr_dir, sizeof(choose_t->curr_dir), "odbcinst.ini"))
2551     strcpy(choose_t->curr_dir, DEFAULT_FILEDSNPATH);
2552 
2553   adddsns_to_list (clist1, FALSE);
2554 
2555   choose_t->udsnlist = clist1;
2556   choose_t->sdsnlist = clist2;
2557   choose_t->type_dsn = USER_DSN;
2558   choose_t->mainwnd = dsnchooser;
2559 
2560   gtk_widget_show_all (dsnchooser);
2561   gtk_main ();
2562 }
2563 
2564 
2565 #define CHECK_DRVCONN_DIALBOX(path) \
2566   { \
2567     if ((handle = DLL_OPEN(path)) != NULL) \
2568       { \
2569         if (DLL_PROC(handle, "_iodbcdm_drvconn_dialboxw") != NULL) \
2570           { \
2571             DLL_CLOSE(handle); \
2572             retVal = TRUE; \
2573             goto quit; \
2574           } \
2575         else \
2576           { \
2577             if (DLL_PROC(handle, "_iodbcdm_drvconn_dialbox") != NULL) \
2578               { \
2579                 DLL_CLOSE(handle); \
2580                 retVal = TRUE; \
2581                 goto quit; \
2582               } \
2583           } \
2584         DLL_CLOSE(handle); \
2585       } \
2586   }
2587 
2588 
2589 
2590 static BOOL
2591 _CheckDriverLoginDlg (
2592     char *drv
2593 )
2594 {
2595   char drvbuf[4096] = { L'\0'};
2596   HDLL handle;
2597   BOOL retVal = FALSE;
2598 
2599 
2600   if (!drv)
2601     return FALSE;
2602 
2603   SQLSetConfigMode (ODBC_USER_DSN);
2604   if (!access (drv, X_OK))
2605     { CHECK_DRVCONN_DIALBOX (drv); }
2606   if (SQLGetPrivateProfileString (drv, "Driver", "", drvbuf,
2607     sizeof (drvbuf), "odbcinst.ini"))
2608     { CHECK_DRVCONN_DIALBOX (drvbuf); }
2609   if (SQLGetPrivateProfileString (drv, "Setup", "", drvbuf,
2610     sizeof (drvbuf), "odbcinst.ini"))
2611     { CHECK_DRVCONN_DIALBOX (drvbuf); }
2612 
2613   SQLSetConfigMode (ODBC_SYSTEM_DSN);
2614   if (!access (drv, X_OK))
2615     { CHECK_DRVCONN_DIALBOX (drv); }
2616   if (SQLGetPrivateProfileString (drv, "Driver", "", drvbuf,
2617     sizeof (drvbuf), "odbcinst.ini"))
2618     { CHECK_DRVCONN_DIALBOX (drvbuf); }
2619   if (SQLGetPrivateProfileString (drv, "Setup", "", drvbuf,
2620     sizeof (drvbuf), "odbcinst.ini"))
2621     { CHECK_DRVCONN_DIALBOX (drvbuf); }
2622 
2623 quit:
2624   return retVal;
2625 }
2626