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