1 /**************************************************
2  * SQLGetInstalledDrivers
3  *
4  **************************************************
5  * This code was created by Peter Harvey @ CodeByDesign.
6  * Released under LGPL 28.JAN.99
7  *
8  * Contributions from...
9  * -----------------------------------------------
10  * Peter Harvey		- pharvey@codebydesign.com
11  **************************************************/
12 #include <config.h>
13 #include <odbcinstext.h>
14 
SQLGetInstalledDrivers(LPSTR pszBuf,WORD nBufMax,WORD * pnBufOut)15 BOOL SQLGetInstalledDrivers(	LPSTR	pszBuf,
16 								WORD	nBufMax,
17 								WORD	*pnBufOut )
18 {
19 	HINI	hIni;
20 	WORD	nBufPos		= 0;
21 	WORD	nToCopySize	= 0;
22 	char	szObjectName[INI_MAX_OBJECT_NAME+1];
23     char    szIniName[ ODBC_FILENAME_MAX * 2 + 1 ];
24 	char 	b1[ ODBC_FILENAME_MAX + 1 ], b2[ ODBC_FILENAME_MAX + 1 ];
25 
26     inst_logClear();
27 
28 #ifdef VMS
29     sprintf( szIniName, "%s:%s", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ) );
30 #else
31     sprintf( szIniName, "%s/%s", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ) );
32 #endif
33 
34 #ifdef __OS2__
35 	if ( iniOpen( &hIni, szIniName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS )
36 #else
37 	if ( iniOpen( &hIni, szIniName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS )
38 #endif
39 	{
40         inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_COMPONENT_NOT_FOUND, "" );
41 		return FALSE;
42 	}
43 
44 	memset( pszBuf, '\0', nBufMax );
45 
46 	iniObjectFirst( hIni );
47 	while ( iniObjectEOL( hIni ) == FALSE )
48 	{
49 		iniObject( hIni, szObjectName );
50 		if ( strcmp( szObjectName, "ODBC" ) == 0 )
51 		{
52 		    iniObjectNext( hIni );
53 		    continue;
54 		}
55 
56 		if ( (strlen( szObjectName )+1) > (nBufMax - nBufPos) )
57 		{
58 			nToCopySize = nBufMax - nBufPos;
59 			strncpy( &(pszBuf[nBufPos]), szObjectName, nToCopySize );
60 			nBufPos = nBufMax;
61 			break;
62 		}
63 		else
64 		{
65 			strcpy( &(pszBuf[nBufPos]), szObjectName );
66 			nBufPos += strlen( szObjectName )+1;
67 		}
68 		iniObjectNext( hIni );
69 	}
70 	iniClose( hIni );
71 
72 	if ( pnBufOut )
73 		*pnBufOut = nBufPos;
74 
75 	return TRUE;
76 }
77 
78 
SQLGetInstalledDriversW(LPWSTR lpszBuf,WORD cbBufMax,WORD * pcbBufOut)79 BOOL INSTAPI SQLGetInstalledDriversW  (LPWSTR      lpszBuf,
80                                       WORD       cbBufMax,
81                                       WORD      * pcbBufOut)
82 {
83 	char *path;
84 	BOOL ret;
85 
86     inst_logClear();
87 
88 	path = calloc( cbBufMax, 1 );
89 
90 	ret = SQLGetInstalledDrivers( path, cbBufMax, pcbBufOut );
91 
92 	if ( ret )
93 	{
94 		_multi_string_copy_to_wide( lpszBuf, path, cbBufMax );
95 	}
96 
97 	free( path );
98 
99 	return ret;
100 }
101