int main(int argc, char **argv) { int i; qof_init(); for (i = 0; strs[i].input != NULL; i++) { char *daout; char *dain; char *wantout; if (strs[i].prefix_home == 1) { dain = g_build_filename(g_get_home_dir(), strs[i].input, (gchar *)NULL); wantout = g_build_filename(g_get_home_dir(), strs[i].output, (gchar *)NULL); } else if (strs[i].prefix_home == 2) { dain = g_strdup(strs[i].input); wantout = g_build_filename(g_get_home_dir(), strs[i].output, (gchar *)NULL); } else { dain = g_strdup(strs[i].input); wantout = g_strdup(strs[i].output); } daout = gnc_resolve_file_path(dain); do_test_args(g_strcmp0(daout, wantout) == 0, "gnc_resolve_file_path", __FILE__, __LINE__, "%s (%s) vs %s", daout, dain, wantout); g_free(dain); g_free(wantout); g_free(daout); } print_test_results(); return get_rv(); }
static gchar * gnc_filepath_locate_file (const gchar *default_path, const gchar *name) { gchar *fullname; g_return_val_if_fail (name != NULL, NULL); if (g_path_is_absolute (name)) fullname = g_strdup (name); else if (default_path) fullname = g_build_filename (default_path, name, NULL); else fullname = gnc_resolve_file_path (name); if (!g_file_test (fullname, G_FILE_TEST_IS_REGULAR)) { g_error ("Could not locate file %s", name); g_free (fullname); return NULL; } return fullname; }
/* Splits a uri into its separate components */ void gnc_uri_get_components (const gchar *uri, gchar **protocol, gchar **hostname, gint32 *port, gchar **username, gchar **password, gchar **path) { gchar **splituri, **spliturl; gchar *url = NULL, *tmpusername = NULL, *tmphostname = NULL; gchar *delimiter = NULL; *protocol = NULL; *hostname = NULL; *port = 0; *username = NULL; *password = NULL; *path = NULL; g_return_if_fail( uri != NULL ); splituri = g_strsplit ( uri, "://", 2 ); if ( splituri[1] == NULL ) { /* No protocol means simple file uri */ *protocol = g_strdup ( "file" ); *path = g_strdup ( splituri[0] ); g_strfreev ( splituri ); return; } /* At least a protocol was found, set it here */ *protocol = g_strdup ( splituri[0] ); if ( gnc_uri_is_file_protocol ( *protocol ) ) { /* Protocol indicates file based uri. * Note that unknown protocols are treated as if they are * file-based protocols. This is done to prevent password * lookups on unknown protocols. * On the other hand, since we don't know the specifics of * unknown protocols, we don't attempt to return an absolute * pathname for them, just whatever was there. */ if ( gnc_uri_is_known_protocol ( *protocol ) ) *path = gnc_resolve_file_path ( splituri[1] ); else *path = g_strdup ( splituri[1] ); g_strfreev ( splituri ); return; } /* Protocol indicates full network style uri, let's see if it * has a username and/or password */ url = g_strdup (splituri[1]); g_strfreev ( splituri ); /* Check for "@" sign, but start from the end - the password may contain * this sign as well */ delimiter = g_strrstr ( url, "@" ); if ( delimiter != NULL ) { /* There is at least a username in the url */ delimiter[0] = '\0'; tmpusername = url; tmphostname = delimiter + 1; /* Check if there's a password too by looking for a : * Start from the beginning this time to avoid possible : * in the password */ delimiter = g_strstr_len ( tmpusername, -1, ":" ); if ( delimiter != NULL ) { /* There is password in the url */ delimiter[0] = '\0'; *password = g_strdup ( (const gchar*)(delimiter + 1) ); } *username = g_strdup ( (const gchar*)tmpusername ); } else { /* No username and password were given */ tmphostname = url; } /* Find the path part */ delimiter = g_strstr_len ( tmphostname, -1, "/" ); if ( delimiter != NULL ) { delimiter[0] = '\0'; if ( gnc_uri_is_file_protocol ( *protocol ) ) /* always return absolute file paths */ *path = gnc_resolve_file_path ( (const gchar*)(delimiter + 1) ); else /* path is no file path, so copy it as is */ *path = g_strdup ( (const gchar*)(delimiter + 1) ); } /* Check for a port specifier */ delimiter = g_strstr_len ( tmphostname, -1, ":" ); if ( delimiter != NULL ) { delimiter[0] = '\0'; *port = g_ascii_strtoll ( delimiter + 1, NULL, 0 ); } *hostname = g_strdup ( (const gchar*)tmphostname ); g_free ( url ); return; }
/* Generates a normalized uri from the separate components */ gchar *gnc_uri_create_uri (const gchar *protocol, const gchar *hostname, gint32 port, const gchar *username, const gchar *password, const gchar *path) { gchar *userpass = NULL, *portstr = NULL, *uri = NULL; g_return_val_if_fail( path != 0, NULL ); if ( (protocol == NULL) || gnc_uri_is_file_protocol ( protocol ) ) { /* Compose a file based uri, which means ignore everything but * the protocol and the path * We return an absolute pathname if the protocol is known or * no protocol was given. For an unknown protocol, we return the * path info as is. */ gchar *abs_path; if ( protocol && (!gnc_uri_is_known_protocol (protocol)) ) abs_path = g_strdup ( path ); else abs_path = gnc_resolve_file_path ( path ); if ( protocol == NULL ) uri = g_strdup_printf ( "file://%s", abs_path ); else uri = g_strdup_printf ( "%s://%s", protocol, abs_path ); g_free (abs_path); return uri; } /* Not a file based uri, we need to setup all components that are not NULL * For this scenario, hostname is mandatory. */ g_return_val_if_fail( hostname != 0, NULL ); if ( username != NULL && *username ) { if ( password != NULL && *password ) userpass = g_strdup_printf ( "%s:%s@", username, password ); else userpass = g_strdup_printf ( "%s@", username ); } else userpass = g_strdup ( "" ); if ( port != 0 ) portstr = g_strdup_printf ( ":%d", port ); else portstr = g_strdup ( "" ); // XXX Do I have to add the slash always or are there situations // it is in the path already ? uri = g_strconcat ( protocol, "://", userpass, hostname, portstr, "/", path, NULL ); g_free ( userpass ); g_free ( portstr ); return uri; }