static kvarray_t * getpwnam_ext_real( const char *name ) { static int32_t procno = -1; static int32_t initProc = -1; static bool setupList = FALSE; kvarray_t *response = NULL; kern_return_t status; if ( name == NULL ) { /* reset cached state */ procno = -1; initProc = -1; setupList = FALSE; return NULL; } if ( procno == -1 ) { status = get_procno( "getpwnam_ext", &procno ); if ( status != KERN_SUCCESS ) return NULL; } if ( initProc == -1 ) { status = get_procno( "getpwnam_initext", &initProc ); if ( status != KERN_SUCCESS ) return NULL; } if (!setupList) { kvbuf_t *reqTypes = kvbuf_new(); /* The following are already included by default: * kDSNAttrRecordName - pw_name * kDS1AttrPassword - pw_pass * kDS1AttrUniqueID - pw_uid * kDS1AttrPrimaryGroupID - pw_gid * kDS1AttrNFSHomeDirectory - pw_dir * kDS1AttrUserShell - pw_shell * kDS1AttrDistinguishedName- pw_gecos * kDS1AttrGeneratedUID - pw_uuid * * kDSNAttrKeywords - not included, please file radar against DirectoryService * kDSNAttrMetaNodeLocation - as-is */ kvbuf_add_dict( reqTypes ); kvbuf_add_key( reqTypes, "additionalAttrs" ); kvbuf_add_val( reqTypes, kDS1AttrMailAttribute ); kvbuf_add_val( reqTypes, kDS1AttrFirstName ); kvbuf_add_val( reqTypes, kDS1AttrLastName ); status = ds_lookup( initProc, reqTypes, NULL ); kvbuf_free(reqTypes); if ( status != KERN_SUCCESS ) return NULL; setupList = TRUE; } kvbuf_t *request = kvbuf_query_key_val( "login", name ); if ( request != NULL ) { ds_lookup( procno, request, &response ); kvbuf_free( request ); } return response; }
/* Add, edit, or remove a Data Source Name (DSN). This function is called by "Data Source Administrator" on Windows, or similar application on Unix. */ BOOL INSTAPI ConfigDSNW(HWND hWnd, WORD nRequest, LPCWSTR pszDriver, LPCWSTR pszAttributes) { DataSource *ds= ds_new(); BOOL rc= TRUE; Driver *driver= NULL; SQLWCHAR *origdsn= NULL; if (pszAttributes && *pszAttributes) { SQLWCHAR delim= ';'; #ifdef _WIN32 /* if there's no ;, then it's most likely null-delimited NOTE: the double null-terminated strings are not working * with UnixODBC-GUI-Qt (posted a bug ) */ if (!sqlwcharchr(pszAttributes, delim)) delim= 0; #endif if (ds_from_kvpair(ds, pszAttributes, delim)) { SQLPostInstallerError(ODBC_ERROR_INVALID_KEYWORD_VALUE, W_INVALID_ATTR_STR); rc= FALSE; goto exitConfigDSN; } if (ds_lookup(ds) && nRequest != ODBC_ADD_DSN) { /* ds_lookup() will already set SQLInstallerError */ rc= FALSE; goto exitConfigDSN; } origdsn= sqlwchardup(ds->name, SQL_NTS); } switch (nRequest) { case ODBC_ADD_DSN: driver= driver_new(); memcpy(driver->name, pszDriver, (sqlwcharlen(pszDriver) + 1) * sizeof(SQLWCHAR)); if (driver_lookup(driver)) { rc= FALSE; break; } if (hWnd) { /* hWnd means we will at least try to prompt, at which point the driver lib will be replaced by the name */ ds_set_strattr(&ds->driver, driver->lib); } else { /* no hWnd is a likely a call from an app w/no prompting so we put the driver name immediately */ ds_set_strattr(&ds->driver, driver->name); } case ODBC_CONFIG_DSN: #ifdef _WIN32 /* for windows, if hWnd is NULL, we try to add the dsn with what information was given */ if (!hWnd || ShowOdbcParamsDialog(ds, hWnd, FALSE) == 1) #else if (ShowOdbcParamsDialog(ds, hWnd, FALSE) == 1) #endif { /* save datasource */ if (ds_add(ds)) rc= FALSE; /* if the name is changed, remove the old dsn */ if (origdsn && memcmp(origdsn, ds->name, (sqlwcharlen(origdsn) + 1) * sizeof(SQLWCHAR))) SQLRemoveDSNFromIni(origdsn); } break; case ODBC_REMOVE_DSN: if (SQLRemoveDSNFromIni(ds->name) != TRUE) rc= FALSE; break; } exitConfigDSN: x_free(origdsn); ds_delete(ds); if (driver) driver_delete(driver); return rc; }