plover/razor.c
author J. Ali Harlow <ali@juiblex.co.uk>
Fri Jun 01 17:19:01 2018 +0100 (2018-06-01)
changeset 71 bd272d15bea4
parent 65 d1433cd15271
child 99 0121592e2512
permissions -rw-r--r--
Treat invalid URIs as programming errors
ali@0
     1
/*
ali@0
     2
 * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
ali@0
     3
 * Copyright (C) 2008  Red Hat, Inc
ali@62
     4
 * Copyright (C) 2009, 2011, 2012, 2014, 2016  J. Ali Harlow <ali@juiblex.co.uk>
ali@0
     5
 *
ali@0
     6
 * This program is free software; you can redistribute it and/or modify
ali@0
     7
 * it under the terms of the GNU General Public License as published by
ali@0
     8
 * the Free Software Foundation; either version 2 of the License, or
ali@0
     9
 * (at your option) any later version.
ali@0
    10
 *
ali@0
    11
 * This program is distributed in the hope that it will be useful,
ali@0
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@0
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@0
    14
 * GNU General Public License for more details.
ali@0
    15
 *
ali@0
    16
 * You should have received a copy of the GNU General Public License along
ali@0
    17
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@0
    18
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@0
    19
 */
ali@0
    20
ali@61
    21
#define _GNU_SOURCE
ali@0
    22
#include <stdlib.h>
ali@0
    23
#include <stdio.h>
ali@0
    24
#include <stdarg.h>
ali@0
    25
#include <string.h>
ali@24
    26
#include <errno.h>
ali@0
    27
#include <unistd.h>
ali@0
    28
#include <razor.h>
ali@24
    29
#include <glib.h>
ali@24
    30
#include <gio/gio.h>
ali@0
    31
#include "config.h"
ali@0
    32
#include "plover/plover.h"
ali@24
    33
#include "plover/transaction.h"
ali@44
    34
#include "plover/uri-handler.h"
ali@0
    35
ali@62
    36
#if HAVE_DLFCN_H
ali@62
    37
#define DEBUG_HOOK_RAZOR_SET		/* For debugging */
ali@62
    38
#endif
ali@62
    39
ali@0
    40
static char *rpm_filename(const char *name,const char *version,const char *arch)
ali@0
    41
{
ali@0
    42
    const char *v;
ali@0
    43
    v=strchr(version,':');	      /* Skip epoch */
ali@0
    44
    if (v)
ali@0
    45
	v++;
ali@0
    46
    else
ali@0
    47
	v=version;
ali@24
    48
    return g_strconcat(name,"-",v,".",arch,".rpm",NULL);
ali@0
    49
}
ali@0
    50
ali@19
    51
/*
ali@19
    52
 * Returns 0 on success, -1 on failure and 1 if a RAZOR_INSTALL_ACTION_COMMIT
ali@19
    53
 * is met (in which case the action is consumed).
ali@19
    54
 */
ali@13
    55
int plover_run_transaction(struct razor_transaction *trans,
ali@61
    56
  struct razor_install_iterator *ii,const char *root_uri,
ali@24
    57
  struct razor_set *system,PloverPackageSet *next,PloverRepository *upstream,
ali@24
    58
  struct razor_atomic *atomic,struct razor_relocations *relocations,
ali@24
    59
  enum razor_stage_type stage,GCancellable *cancellable)
ali@0
    60
{
ali@24
    61
    struct razor_package *pkg;
ali@0
    62
    enum razor_install_action action;
ali@0
    63
    struct razor_rpm *rpm;
ali@19
    64
    struct razor_error *error=NULL;
ali@0
    65
    const char *name,*version,*arch;
ali@24
    66
    gchar *t;
ali@19
    67
    int r,count;
ali@24
    68
    GError *tmp_error=NULL;
ali@24
    69
    PloverPackage *package;
ali@71
    70
    g_return_val_if_fail(plover__uri_validate(root_uri),-1);
ali@44
    71
    plover__uri_handler_init();
ali@61
    72
    if (!*root_uri)
ali@61
    73
	root_uri="file:/";
ali@13
    74
    switch(stage)
ali@13
    75
    {
ali@13
    76
	case RAZOR_STAGE_SCRIPTS_PRE:
ali@13
    77
	    printf("Running pre-transaction scripts\n");
ali@13
    78
	    break;
ali@13
    79
	case RAZOR_STAGE_FILES:
ali@13
    80
	    printf("Running Transaction\n");
ali@13
    81
	    break;
ali@13
    82
	case RAZOR_STAGE_SCRIPTS_POST:
ali@13
    83
	    printf("Running post-transaction scripts\n");
ali@13
    84
	    break;
ali@13
    85
	default:
ali@13
    86
	    /* Keep the compiler happy */
ali@13
    87
	    break;
ali@13
    88
    }
ali@24
    89
    while (razor_install_iterator_next(ii,&pkg,&action,&count))
ali@0
    90
    {
ali@24
    91
	if (g_cancellable_is_cancelled(cancellable))
ali@24
    92
	{
ali@24
    93
	    razor_atomic_abort(atomic,PLOVER_GENERAL_ERROR,
ali@24
    94
	      PLOVER_GENERAL_ERROR_CANCELLED,"Operation was cancelled");
ali@24
    95
	    return -1;
ali@24
    96
	}
ali@0
    97
	if (action==RAZOR_INSTALL_ACTION_REMOVE)
ali@0
    98
	{
ali@24
    99
	    razor_package_get_details(system,pkg,RAZOR_DETAIL_NAME,&name,
ali@0
   100
	      RAZOR_DETAIL_LAST);
ali@13
   101
	    if (stage==RAZOR_STAGE_FILES)
ali@13
   102
		printf("  Removing : %s ",name);
ali@24
   103
	    r=razor_package_remove(system,plover_package_set_get_razor(next),
ali@61
   104
	      atomic,pkg,root_uri,count,stage);
ali@13
   105
	    if (stage==RAZOR_STAGE_FILES)
ali@13
   106
		printf("\n");
ali@0
   107
	}
ali@19
   108
	else if (action==RAZOR_INSTALL_ACTION_ADD)
ali@0
   109
	{
ali@24
   110
	    package=plover_package_set_lookup(next,pkg);
ali@24
   111
	    rpm=plover_repository_open_rpm(upstream,package,&tmp_error);
ali@0
   112
	    if (!rpm)
ali@19
   113
	    {
ali@24
   114
		plover_propagate_g_error(&error,tmp_error);
ali@24
   115
		razor_atomic_propagate_error(atomic,error,NULL);
ali@0
   116
		return -1;
ali@19
   117
	    }
ali@13
   118
	    if (stage==RAZOR_STAGE_FILES)
ali@24
   119
		printf("  Installing : %s ",plover_package_get_name(package));
ali@0
   120
	    if (relocations)
ali@0
   121
		razor_rpm_set_relocations(rpm,relocations);
ali@24
   122
	    razor_transaction_fixup_package(trans,pkg,rpm);
ali@61
   123
	    r=razor_rpm_install(rpm,atomic,root_uri,1,stage);
ali@0
   124
	    razor_rpm_close(rpm);
ali@13
   125
	    if (stage==RAZOR_STAGE_FILES)
ali@13
   126
		printf("\n");
ali@0
   127
	}
ali@61
   128
	else if (action==RAZOR_INSTALL_ACTION_COMMIT)
ali@19
   129
	    return 1;
ali@19
   130
	else
ali@19
   131
	    r=0;
ali@13
   132
	if (razor_atomic_in_error_state(atomic))
ali@13
   133
	    return -1;
ali@19
   134
	else if (r)
ali@19
   135
	{
ali@29
   136
	    if (action==RAZOR_INSTALL_ACTION_REMOVE)
ali@29
   137
	    {
ali@29
   138
		razor_package_get_details(system,pkg,RAZOR_DETAIL_NAME,&name,
ali@29
   139
		  RAZOR_DETAIL_VERSION,&version,RAZOR_DETAIL_ARCH,&arch,
ali@29
   140
		  RAZOR_DETAIL_LAST);
ali@29
   141
	    }
ali@29
   142
	    else
ali@29
   143
	    {
ali@29
   144
		package=plover_package_set_lookup(next,pkg);
ali@29
   145
		name=plover_package_get_name(package);
ali@29
   146
		version=plover_package_get_version(package);
ali@29
   147
		arch=plover_package_get_arch(package);
ali@29
   148
	    }
ali@19
   149
	    /*
ali@19
   150
	     * If a pre or preun script fails, then we should
ali@19
   151
	     * treat that as a fatal error. post and postun
ali@19
   152
	     * script failures are treated as warnings. Be
ali@19
   153
	     * nice and tell the user _which_ script failed.
ali@19
   154
	     */
ali@19
   155
	    if (stage==RAZOR_STAGE_SCRIPTS_PRE)
ali@22
   156
	    {
ali@24
   157
		t=g_strconcat(action==RAZOR_INSTALL_ACTION_ADD?
ali@24
   158
		  "%pre":"%preun","(",name,"-",version,".",arch,
ali@24
   159
		  ") scriptlet failed",NULL);
ali@24
   160
		fprintf(stderr,"error: %s, exit status %d\n",t,r);
ali@24
   161
		razor_atomic_abort(atomic,PLOVER_SCRIPTLET_ERROR,r,t);
ali@24
   162
		g_free(t);
ali@19
   163
		return -1;
ali@22
   164
	    }
ali@22
   165
	    else
ali@22
   166
		fprintf(stderr,
ali@22
   167
		  "warning: %s(%s-%s.%s) scriptlet failed, exit status %d\n",
ali@22
   168
		  action==RAZOR_INSTALL_ACTION_ADD?"%post":"%postun",
ali@22
   169
		  name,version,arch,r);
ali@19
   170
	}
ali@0
   171
    }
ali@13
   172
    return 0;
ali@13
   173
}
ali@13
   174
ali@43
   175
gboolean plover_install_uri(const char *base_uri,const char *prefix,char **pkgs,
ali@43
   176
  GError **error)
ali@43
   177
{
ali@43
   178
    gboolean retval;
ali@43
   179
    PloverTransaction *transaction;
ali@71
   180
    g_return_val_if_fail(plover__uri_validate(base_uri),FALSE);
ali@43
   181
    transaction=plover_transaction_new_install_uri(base_uri,prefix,pkgs,error);
ali@43
   182
    if (!transaction)
ali@43
   183
	return FALSE;
ali@43
   184
    retval=plover_transaction_commit(transaction,NULL,error);
ali@43
   185
    g_object_unref(transaction);
ali@43
   186
    return retval;
ali@43
   187
}
ali@43
   188
ali@24
   189
gboolean plover_install(const char *base,const char *prefix,char **pkgs,
ali@24
   190
  GError **error)
ali@13
   191
{
ali@24
   192
    gboolean retval;
ali@43
   193
    GFile *file;
ali@43
   194
    gchar *base_uri;
ali@43
   195
    file=g_file_new_for_path(base);
ali@43
   196
    base_uri=g_file_get_uri(file);
ali@43
   197
    g_object_unref(file);
ali@43
   198
    retval=plover_install_uri(base_uri,prefix,pkgs,error);
ali@43
   199
    g_free(base_uri);
ali@13
   200
    return retval;
ali@0
   201
}
ali@0
   202
ali@59
   203
gboolean plover_update_uri(const char *base_uri,const char *prefix,char **pkgs,
ali@59
   204
  GError **error)
ali@59
   205
{
ali@59
   206
    gboolean retval;
ali@59
   207
    PloverTransaction *transaction;
ali@71
   208
    g_return_val_if_fail(plover__uri_validate(base_uri),FALSE);
ali@61
   209
    transaction=plover_transaction_new_update_uri(base_uri,prefix,pkgs,error);
ali@59
   210
    if (!transaction)
ali@61
   211
	return FALSE;
ali@61
   212
    retval=plover_transaction_commit(transaction,NULL,error);
ali@61
   213
    g_object_unref(transaction);
ali@59
   214
    return retval;
ali@59
   215
}
ali@59
   216
ali@24
   217
gboolean plover_update(const char *base,const char *prefix,char **pkgs,
ali@24
   218
  GError **error)
ali@0
   219
{
ali@24
   220
    gboolean retval;
ali@24
   221
    PloverTransaction *transaction;
ali@61
   222
    transaction=plover_transaction_new_update(base,prefix,pkgs,error);
ali@24
   223
    if (!transaction)
ali@61
   224
	return FALSE;
ali@61
   225
    retval=plover_transaction_commit(transaction,NULL,error);
ali@61
   226
    g_object_unref(transaction);
ali@0
   227
    return retval;
ali@0
   228
}
ali@0
   229
ali@24
   230
gboolean plover_remove(char **pkgs,GError **error)
ali@0
   231
{
ali@24
   232
    gboolean retval;
ali@24
   233
    GError *tmp_error=NULL;
ali@24
   234
    PloverTransaction *transaction;
ali@24
   235
    transaction=plover_transaction_new_remove(pkgs,&tmp_error);
ali@24
   236
    if (!transaction)
ali@0
   237
    {
ali@24
   238
	retval=g_error_matches(tmp_error,PLOVER_POSIX_ERROR,ENOENT);
ali@24
   239
	if (retval)
ali@24
   240
	{
ali@24
   241
	    g_error_free(tmp_error);
ali@24
   242
	    if (pkgs)
ali@24
   243
	    {
ali@24
   244
		g_set_error(error,PLOVER_GENERAL_ERROR,
ali@24
   245
		  PLOVER_GENERAL_ERROR_NO_SUCH_PACKAGE,"%s: %s",pkgs[0],
ali@24
   246
		  "Package not found");
ali@24
   247
		retval=FALSE;
ali@24
   248
	    }
ali@24
   249
	}
ali@19
   250
	else
ali@24
   251
	    g_propagate_error(error,tmp_error);
ali@13
   252
    }
ali@13
   253
    else
ali@19
   254
    {
ali@24
   255
	retval=plover_transaction_commit(transaction,NULL,error);
ali@24
   256
	g_object_unref(transaction);
ali@19
   257
    }
ali@13
   258
    return retval;
ali@13
   259
}
ali@13
   260
ali@13
   261
/*
ali@61
   262
 * Returns:
ali@61
   263
 *	 0 if there are any installed files that don't match prefix, or
ali@61
   264
 *	-1 if there are no installed files at all, or
ali@61
   265
 * 	 1 if there are installed files and they all match prefix.
ali@13
   266
 */
ali@13
   267
ali@13
   268
int plover_installed_files_match_prefix(const char *prefix)
ali@13
   269
{
ali@61
   270
    int len,matches=-1;
ali@13
   271
    const char *name;
ali@42
   272
    const char *install_root;
ali@13
   273
    struct razor_set *set;
ali@13
   274
    struct razor_package *package;
ali@13
   275
    struct razor_package_iterator *pi;
ali@13
   276
    struct razor_file_iterator *fi;
ali@44
   277
    plover__uri_handler_init();
ali@13
   278
    len=strlen(prefix);
ali@13
   279
    while(len && prefix[len-1]=='/')
ali@13
   280
	len--;
ali@42
   281
    install_root=g_getenv("RAZOR_ROOT");
ali@13
   282
    if (!install_root)
ali@42
   283
	install_root="file:///";
ali@42
   284
    set=razor_root_open_read_only(install_root,NULL);
ali@13
   285
    if (set)
ali@13
   286
    {
ali@13
   287
	pi=razor_package_iterator_create(set);
ali@13
   288
	while (matches &&
ali@13
   289
	  razor_package_iterator_next(pi,&package,RAZOR_DETAIL_LAST))
ali@13
   290
	{
ali@13
   291
	    fi=razor_file_iterator_create(set,package,0);
ali@13
   292
	    while (matches && razor_file_iterator_next(fi,&name))
ali@13
   293
	    {
ali@13
   294
		if (strncmp(name,prefix,len) ||
ali@13
   295
		  name[len]!='\0' && name[len]!='/')
ali@13
   296
		    matches=0;
ali@61
   297
		else
ali@61
   298
		    matches=1;
ali@13
   299
	    }
ali@13
   300
	    razor_file_iterator_destroy(fi);
ali@13
   301
	}
ali@13
   302
	razor_package_iterator_destroy(pi);
ali@13
   303
	razor_set_unref(set);
ali@0
   304
    }
ali@13
   305
    return matches;
ali@0
   306
}
ali@61
   307
ali@65
   308
#ifdef DEBUG_HOOK_RAZOR_SET
ali@61
   309
#include <fcntl.h>
ali@61
   310
#include <dlfcn.h>
ali@61
   311
ali@61
   312
struct razor_set_counter
ali@61
   313
{
ali@61
   314
    struct razor_set *set;
ali@61
   315
    int count;
ali@61
   316
};
ali@61
   317
ali@61
   318
static GList *counters;
ali@61
   319
ali@61
   320
static struct razor_set_counter *get_razor_set_counter(struct razor_set *set)
ali@61
   321
{
ali@61
   322
    GList *lnk;
ali@61
   323
    struct razor_set_counter *counter;
ali@61
   324
    for(lnk=counters;lnk;lnk=lnk->next)
ali@61
   325
    {
ali@61
   326
	counter=lnk->data;
ali@61
   327
	if (counter->set==set)
ali@61
   328
	    return counter;
ali@61
   329
    }
ali@61
   330
    counter=g_new(struct razor_set_counter,1);
ali@61
   331
    counter->set=set;
ali@61
   332
    counter->count=0;
ali@61
   333
    counters=g_list_prepend(counters,counter);
ali@61
   334
    return counter;
ali@61
   335
}
ali@61
   336
ali@61
   337
static void dump_razor_set_ref(struct razor_set *set)
ali@61
   338
{
ali@61
   339
    FILE *fp;
ali@61
   340
    gchar *filename;
ali@61
   341
    void *bt[16];
ali@61
   342
    size_t len;
ali@61
   343
    struct razor_set_counter *counter;
ali@61
   344
    filename=g_strdup_printf("razor-set-%p",set);
ali@61
   345
    fp=fopen(filename,"a");
ali@61
   346
    g_free(filename);
ali@61
   347
    counter=get_razor_set_counter(set);
ali@61
   348
    counter->count++;
ali@61
   349
    fprintf(fp,"Ref %p (%d refs)\n",set,counter->count);
ali@61
   350
    fflush(fp);
ali@61
   351
    len=backtrace(bt,G_N_ELEMENTS(bt));
ali@61
   352
    backtrace_symbols_fd(bt,len,fileno(fp));
ali@61
   353
    fprintf(fp,"\n");
ali@61
   354
    fclose(fp);
ali@61
   355
}
ali@61
   356
ali@61
   357
static void dump_razor_set_unref(struct razor_set *set)
ali@61
   358
{
ali@61
   359
    FILE *fp;
ali@61
   360
    gchar *filename;
ali@61
   361
    void *bt[16];
ali@61
   362
    size_t len;
ali@61
   363
    struct razor_set_counter *counter;
ali@61
   364
    filename=g_strdup_printf("razor-set-%p",set);
ali@61
   365
    fp=fopen(filename,"a");
ali@61
   366
    g_free(filename);
ali@61
   367
    counter=get_razor_set_counter(set);
ali@61
   368
    --counter->count;
ali@61
   369
    fprintf(fp,"Unref %p (%d refs)\n",set,counter->count);
ali@61
   370
    fflush(fp);
ali@61
   371
    len=backtrace(bt,G_N_ELEMENTS(bt));
ali@61
   372
    backtrace_symbols_fd(bt,len,fileno(fp));
ali@61
   373
    fprintf(fp,"\n");
ali@61
   374
    fclose(fp);
ali@61
   375
}
ali@61
   376
ali@61
   377
static void dump_razor_set_peek(struct razor_set *set)
ali@61
   378
{
ali@61
   379
    FILE *fp;
ali@61
   380
    gchar *filename;
ali@61
   381
    void *bt[16];
ali@61
   382
    size_t len;
ali@61
   383
    struct razor_set_counter *counter;
ali@61
   384
    filename=g_strdup_printf("razor-set-%p",set);
ali@61
   385
    fp=fopen(filename,"a");
ali@61
   386
    g_free(filename);
ali@61
   387
    counter=get_razor_set_counter(set);
ali@61
   388
    fprintf(fp,"Peek %p (%d refs)\n",set,counter->count);
ali@61
   389
    fflush(fp);
ali@61
   390
    len=backtrace(bt,G_N_ELEMENTS(bt));
ali@61
   391
    backtrace_symbols_fd(bt,len,fileno(fp));
ali@61
   392
    fprintf(fp,"\n");
ali@61
   393
    fclose(fp);
ali@61
   394
}
ali@61
   395
ali@61
   396
struct razor_set *razor_set_create_without_root(void)
ali@61
   397
{
ali@61
   398
    static struct razor_set *(*next)(void);
ali@61
   399
    struct razor_set *set;
ali@61
   400
    if (!next)
ali@61
   401
	next=dlsym(RTLD_NEXT,"razor_set_create_without_root");
ali@61
   402
    set=(*next)();
ali@61
   403
    dump_razor_set_ref(set);
ali@61
   404
    return set;
ali@61
   405
}
ali@61
   406
ali@61
   407
struct razor_set *razor_set_create(void)
ali@61
   408
{
ali@61
   409
    static struct razor_set *(*next)(void);
ali@61
   410
    struct razor_set *set;
ali@61
   411
    if (!next)
ali@61
   412
	next=dlsym(RTLD_NEXT,"razor_set_create");
ali@61
   413
    set=(*next)();
ali@61
   414
    dump_razor_set_ref(set);
ali@61
   415
    return set;
ali@61
   416
}
ali@61
   417
ali@61
   418
struct razor_set *razor_set_open(const char *uri,enum razor_set_flags flags,
ali@61
   419
  struct razor_error **error)
ali@61
   420
{
ali@61
   421
    static struct razor_set *(*next)(const char *uri,enum razor_set_flags flags,
ali@61
   422
      struct razor_error **error);
ali@61
   423
    struct razor_set *set;
ali@71
   424
    g_return_val_if_fail(plover__uri_validate(uri),NULL);
ali@61
   425
    if (!next)
ali@61
   426
	next=dlsym(RTLD_NEXT,"razor_set_open");
ali@61
   427
    set=(*next)(uri,flags,error);
ali@61
   428
    dump_razor_set_ref(set);
ali@61
   429
    return set;
ali@61
   430
}
ali@61
   431
ali@61
   432
void razor_set_unref(struct razor_set *set)
ali@61
   433
{
ali@61
   434
    static void (*next)(struct razor_set *set);
ali@61
   435
    if (!next)
ali@61
   436
	next=dlsym(RTLD_NEXT,"razor_set_unref");
ali@61
   437
    if (!set)
ali@61
   438
	abort();
ali@61
   439
    dump_razor_set_unref(set);
ali@61
   440
    (*next)(set);
ali@61
   441
}
ali@61
   442
ali@61
   443
struct razor_set *razor_set_ref(struct razor_set *set)
ali@61
   444
{
ali@61
   445
    static struct razor_set *(*next)(struct razor_set *set);
ali@61
   446
    if (!next)
ali@61
   447
	next=dlsym(RTLD_NEXT,"razor_set_ref");
ali@61
   448
    (*next)(set);
ali@61
   449
    dump_razor_set_ref(set);
ali@61
   450
    return set;
ali@61
   451
}
ali@61
   452
ali@61
   453
struct razor_set *
ali@61
   454
  razor_install_iterator_commit_set(struct razor_install_iterator *ii)
ali@61
   455
{
ali@61
   456
    static struct razor_set *(*next)(struct razor_install_iterator *ii);
ali@61
   457
    struct razor_set *set;
ali@61
   458
    if (!next)
ali@61
   459
	next=dlsym(RTLD_NEXT,"razor_install_iterator_commit_set");
ali@61
   460
    set=(*next)(ii);
ali@61
   461
    dump_razor_set_ref(set);
ali@61
   462
    return set;
ali@61
   463
}
ali@61
   464
ali@61
   465
struct razor_set *razor_transaction_commit(struct razor_transaction *trans)
ali@61
   466
{
ali@61
   467
    static struct razor_set *(*next)(struct razor_transaction *trans);
ali@61
   468
    struct razor_set *set;
ali@61
   469
    if (!next)
ali@61
   470
	next=dlsym(RTLD_NEXT,"razor_transaction_commit");
ali@61
   471
    set=(*next)(trans);
ali@61
   472
    dump_razor_set_ref(set);
ali@61
   473
    return set;
ali@61
   474
}
ali@61
   475
ali@61
   476
struct razor_set *razor_importer_finish(struct razor_importer *importer)
ali@61
   477
{
ali@61
   478
    static struct razor_set *(*next)(struct razor_importer *importer);
ali@61
   479
    struct razor_set *set;
ali@61
   480
    if (!next)
ali@61
   481
	next=dlsym(RTLD_NEXT,"razor_importer_finish");
ali@61
   482
    set=(*next)(importer);
ali@61
   483
    dump_razor_set_ref(set);
ali@61
   484
    return set;
ali@61
   485
}
ali@61
   486
ali@61
   487
struct razor_set *razor_root_open_read_only(const char *root_uri,
ali@61
   488
  struct razor_error **error)
ali@61
   489
{
ali@61
   490
    static struct razor_set *(*next)(const char *root_uri,
ali@61
   491
      struct razor_error **error);
ali@61
   492
    struct razor_set *set;
ali@71
   493
    g_return_val_if_fail(plover__uri_validate(root_uri),NULL);
ali@61
   494
    if (!next)
ali@61
   495
	next=dlsym(RTLD_NEXT,"razor_root_open_read_only");
ali@61
   496
    set=(*next)(root_uri,error);
ali@61
   497
    dump_razor_set_ref(set);
ali@61
   498
    return set;
ali@61
   499
}
ali@61
   500
ali@61
   501
struct razor_set *razor_root_get_system_set(struct razor_root *root)
ali@61
   502
{
ali@61
   503
    static struct razor_set *(*next)(struct razor_root *root);
ali@61
   504
    struct razor_set *set;
ali@61
   505
    if (!next)
ali@61
   506
	next=dlsym(RTLD_NEXT,"razor_root_get_system_set");
ali@61
   507
    set=(*next)(root);
ali@61
   508
    dump_razor_set_peek(set);
ali@61
   509
    return set;
ali@61
   510
}
ali@62
   511
#endif /* DEBUG_HOOK_RAZOR_SET */