355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CDDL HEADER START
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * The contents of this file are subject to the terms of the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Common Development and Distribution License (the "License").
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * You may not use this file except in compliance with the License.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * or http://www.opensolaris.org/os/licensing.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * See the License for the specific language governing permissions
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * and limitations under the License.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * When distributing Covered Code, include this CDDL HEADER in each
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * If applicable, add the following below this CDDL HEADER, with the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * fields enclosed by brackets "[]" replaced with your own identifying
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * information: Portions Copyright [yyyy] [name of copyright owner]
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CDDL HEADER END
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/* $Id: uri.c 146 2006-03-24 00:26:54Z njacobs $ */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*LINTLIBRARY*/
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdio.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <unistd.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <string.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <sys/types.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <errno.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include "uri.h"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * This will handle the following forms:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * scheme:scheme_data
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * scheme://[[user[:password]@]host[:port]]/path[[#fragment]|[?query]]
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobsint
355b4669e025ff377602b6fc7caaf30dbc218371jacobsuri_from_string(char *string, uri_t **uri)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *ptr;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_t *u;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((string == NULL) || (uri == NULL)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs errno = EINVAL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (-1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* find the scheme:scheme_part split */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((ptr = strchr(string, ':')) == NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs errno = EINVAL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (-1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((*uri = u = calloc(1, sizeof (*u))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (-1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->scheme = strndup(string, ptr - string);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((ptr[1] == '/') && (ptr[2] == '/')) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CSTYLED
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * scheme://[host_part]/[path_part]
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *end = NULL, *user = NULL, *host = NULL, *path = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs string = ptr + 3; /* skip the :// */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((path = end = strchr(string, '/')) == NULL)
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner for (end = string; *end != '\0'; end++)
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner continue;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->host_part = strndup(string, end - string);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (host = string; host < end; host ++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*host == '@') {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* string to host is the user part */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->user_part = strndup(string, host-string);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* host+1 to end is the host part */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->host_part = strndup(host + 1,
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner end - (host+1));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs user = string;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs host++;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (user != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *password = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (password = user; (password < host - 1); password++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*password == ':') {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->password = strndup(password + 1,
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner host - password - 2);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->user = strndup(user, password - user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs host = string;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (host != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *port = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (port = host; (port < path); port++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((*port == ':') || (*port == '/'))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (port < path) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->port = strndup(port + 1, path - port - 1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->host = strndup(host, port - host);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (path != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *name = strrchr(path, '/');
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->path_part = strdup(path);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (name != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *query, *fragment;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs query = strrchr(name, '?');
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((query != NULL) && (*query != '\0')) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->query = strdup(query + 1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs end = query;
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner } else {
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner for (end = path; *end != '\0'; end++)
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner continue;
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fragment = strrchr(name, '#');
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((fragment != NULL) && (*fragment != '\0')) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->fragment = strndup(fragment + 1,
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner end - fragment - 1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs end = fragment;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->path = strndup(path, end - path);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else { /* scheme:scheme_part */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs u->scheme_part = strdup(&ptr[1]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs if ((u->host_part == NULL) && (u->path_part == NULL) &&
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs (u->scheme_part == NULL)) {
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs errno = EINVAL;
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs uri_free(u);
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs *uri = NULL;
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs return (-1);
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs }
c1ecd8b9404ee0d96d93f02e82c441b9bb149a3djacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsint
355b4669e025ff377602b6fc7caaf30dbc218371jacobsuri_to_string(uri_t *uri, char *buffer, size_t buflen)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka char *uri_ppfix;
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((uri == NULL) || (buffer == NULL) || (buflen == 0) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (uri->scheme == NULL) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ((uri->password != NULL) && (uri->user == NULL)) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ((uri->user != NULL) && (uri->host == NULL)) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ((uri->port != NULL) && (uri->host == NULL)) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ((uri->fragment != NULL) && (uri->path == NULL)) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ((uri->query != NULL) && (uri->path == NULL))) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs errno = EINVAL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (-1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka if (uri->path == NULL || uri->path[0] == '/')
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka uri_ppfix = "";
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka else
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka uri_ppfix = "/";
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) memset(buffer, 0, buflen);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->scheme_part == NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) snprintf(buffer, buflen,
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka "%s://%s%s%s%s%s%s%s%s%s%s%s%s%s",
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka uri->scheme,
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->user ? uri->user : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->password ? ":" : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->password ? uri->password : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->user ? "@": ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->host ? uri->host : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->port ? ":" : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->port ? uri->port : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka uri_ppfix,
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->path ? uri->path : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->fragment ? "#" : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->fragment ? uri->fragment : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->query ? "?" : ""),
e059026e2da8f12ef0ebea9d686d67f32660cfc0Keerthi Kondaka (uri->query ? uri->query : ""));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) snprintf(buffer, buflen, "%s:%s", uri->scheme,
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner uri->scheme_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobsuri_free(uri_t *uri)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->scheme != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->scheme);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->scheme_part != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->scheme_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->user != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->password != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->password);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->host != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->host);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->port != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->port);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->path != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->path);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->fragment != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->fragment);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->query != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->query);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* help me debug */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->user_part != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->user_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->host_part != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->host_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->path_part != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri->path_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEADBEEF
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic void
355b4669e025ff377602b6fc7caaf30dbc218371jacobsuri_dump(FILE *fp, uri_t *uri)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "URI:\n");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->scheme != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "scheme: %s\n", uri->scheme);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->scheme_part != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "scheme_part: %s\n", uri->scheme_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->user != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "user: %s\n", uri->user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->password != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "password: %s\n", uri->password);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->host != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "host: %s\n", uri->host);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->port != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "port: %s\n", uri->port);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->path != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "path: %s\n", uri->path);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->fragment != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "fragment: %s\n", uri->fragment);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->query != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "query: %s\n", uri->query);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* help me debug */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->user_part != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "user_part: %s\n", uri->user_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->host_part != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "host_part: %s\n", uri->host_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri->path_part != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(fp, "path_part: %s\n", uri->path_part);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fflush(fp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsint
355b4669e025ff377602b6fc7caaf30dbc218371jacobsmain(int argc, char *argv[])
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_t *u = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (argc != 2) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stderr, "Usage: %s uri\n", argv[0]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs exit(1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri_from_string(argv[1], &u) == 0) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char buf[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_dump(stdout, u);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_to_string(u, buf, sizeof (buf));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stdout, "reconstituted: %s\n", buf);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_to_string(u, buf, 12);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs fprintf(stdout, "reconstituted(12): %s\n", buf);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printf(" failed for %s (%s)\n", argv[1], strerror(errno));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs exit(0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif /* DEADBEEF */