rpm  5.4.4
ruby/rpmfi-rb.c
Go to the documentation of this file.
00001 
00005 #include "system.h"
00006 
00007 #include "rpm-rb.h"
00008 #include "rpmfi-rb.h"
00009 
00010 #ifdef  NOTYET
00011 #include <argv.h>
00012 #include <mire.h>
00013 #endif
00014 
00015 #define _RPMFI_INTERNAL
00016 #include <rpmtag.h>
00017 #include <rpmtypes.h>
00018 #include <rpmio.h>
00019 #include <rpmfi.h>
00020 #include <rpmts.h>
00021 
00022 
00023 #include "../debug.h"
00024 
00025 
00026 VALUE rpmfiClass;
00027 
00028 
00029 /*@unchecked@*/
00030 static int _debug = 0;
00031 
00032 
00033 /* --- helpers */
00034 static void *
00035 rpmfi_ptr(VALUE s)
00036 {
00037     void *ptr;
00038     Data_Get_Struct(s, void, ptr);
00039     return ptr;
00040 }
00041 
00042 /* --- Object methods */
00043 
00044 static void
00045 initMethods(VALUE klass)
00046 {
00047 }
00048 
00049 /* --- Object properties */
00050 static VALUE
00051 rpmfi_debug_get(VALUE s)
00052 {
00053 if (_debug)
00054 fprintf(stderr, "==> %s(0x%lx)\n", __FUNCTION__, s);
00055     return INT2FIX(_debug);
00056 }
00057 
00058 static VALUE
00059 rpmfi_debug_set(VALUE s, VALUE v)
00060 {
00061 if (_debug)
00062 fprintf(stderr, "==> %s(0x%lx, 0x%lx)\n", __FUNCTION__, s, v);
00063     return INT2FIX(_debug = FIX2INT(v));
00064 }
00065 
00066 static VALUE
00067 rpmfi_FC_get(VALUE s)
00068 {
00069     rpmfi fi = rpmfi_ptr(s);
00070 if (_debug)
00071 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00072     return INT2FIX(rpmfiFC(fi));
00073 }
00074 
00075 static VALUE
00076 rpmfi_FX_get(VALUE s)
00077 {
00078     rpmfi fi = rpmfi_ptr(s);
00079 if (_debug)
00080 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00081     return INT2FIX(rpmfiFX(fi));
00082 }
00083 
00084 static VALUE
00085 rpmfi_FX_set(VALUE s, VALUE v)
00086 {
00087     rpmfi fi = rpmfi_ptr(s);
00088     int ix = FIX2INT(v);
00089 if (_debug)
00090 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00091     if (ix != rpmfiFX(fi)) {
00092         (void) rpmfiSetFX(fi, ix-1);
00093         /* XXX flush and recreate {BN,DN,FN} with a rpmfiNext() step */
00094         (void) rpmfiNext(fi);
00095     }
00096     return INT2FIX(rpmfiFX(fi));
00097 }
00098 
00099 static VALUE
00100 rpmfi_DC_get(VALUE s)
00101 {
00102     rpmfi fi = rpmfi_ptr(s);
00103 if (_debug)
00104 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00105     return INT2FIX(rpmfiDC(fi));
00106 }
00107 
00108 static VALUE
00109 rpmfi_DX_get(VALUE s)
00110 {
00111     rpmfi fi = rpmfi_ptr(s);
00112 if (_debug)
00113 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00114     return INT2FIX(rpmfiDX(fi));
00115 }
00116 
00117 static VALUE
00118 rpmfi_DX_set(VALUE s, VALUE v)
00119 {
00120     rpmfi fi = rpmfi_ptr(s);
00121     int ix = FIX2INT(v);
00122 if (_debug)
00123 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00124     (void) rpmfiSetDX(fi, ix);
00125     if (ix != rpmfiDX(fi)) {
00126         (void) rpmfiSetDX(fi, ix-1);
00127         /* XXX flush and recreate {BN,DN,FN} with a rpmfiNextD() step */
00128         (void) rpmfiNextD(fi);
00129     }
00130     return INT2FIX(rpmfiDX(fi));
00131 }
00132 
00133 static VALUE
00134 rpmfi_BN_get(VALUE s)
00135 {
00136     rpmfi fi = rpmfi_ptr(s);
00137 if (_debug)
00138 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00139     return rb_str_new2(rpmfiBN(fi));
00140 }
00141 
00142 static VALUE
00143 rpmfi_DN_get(VALUE s)
00144 {
00145     rpmfi fi = rpmfi_ptr(s);
00146 if (_debug)
00147 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00148     return rb_str_new2(rpmfiDN(fi));
00149 }
00150 
00151 static VALUE
00152 rpmfi_FN_get(VALUE s)
00153 {
00154     rpmfi fi = rpmfi_ptr(s);
00155 if (_debug)
00156 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00157     return rb_str_new2(rpmfiFN(fi));
00158 }
00159 
00160 static VALUE
00161 rpmfi_VFlags_get(VALUE s)
00162 {
00163     rpmfi fi = rpmfi_ptr(s);
00164 if (_debug)
00165 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00166     return INT2FIX(rpmfiVFlags(fi));
00167 }
00168 
00169 static VALUE
00170 rpmfi_FFlags_get(VALUE s)
00171 {
00172     rpmfi fi = rpmfi_ptr(s);
00173 if (_debug)
00174 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00175     return INT2FIX(rpmfiFFlags(fi));
00176 }
00177 
00178 static VALUE
00179 rpmfi_FMode_get(VALUE s)
00180 {
00181     rpmfi fi = rpmfi_ptr(s);
00182 if (_debug)
00183 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00184     return INT2FIX(rpmfiFMode(fi));
00185 }
00186 
00187 static VALUE
00188 rpmfi_FState_get(VALUE s)
00189 {
00190     rpmfi fi = rpmfi_ptr(s);
00191 if (_debug)
00192 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00193     return INT2FIX(rpmfiFState(fi));
00194 }
00195 
00196 static VALUE
00197 rpmfi_FDigest_get(VALUE self)
00198 {
00199     rpmfi fi = rpmfi_ptr(self);
00200     int dalgo = 0;
00201     size_t dlen = 0;
00202     const unsigned char * digest = rpmfiDigest(fi, &dalgo, &dlen);
00203     const unsigned char * s = digest;
00204     size_t nb = 2 * dlen;
00205     char * fdigest = memset(alloca(nb+1), 0, nb+1);
00206     char *t = fdigest;
00207     int i;
00208 
00209 if (_debug)
00210 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, self, fi);
00211     for (i = 0, s = digest, t = fdigest; i < (int)dlen; i++, s++, t+= 2) {
00212         static const char hex[] = "0123456789abcdef";
00213         t[0] = hex[(s[0] >> 4) & 0xf];
00214         t[1] = hex[(s[0]     ) & 0xf];
00215     }
00216     *t = '\0';
00217 
00218     return rb_str_new2(fdigest);
00219 }
00220 
00221 static VALUE
00222 rpmfi_FLink_get(VALUE s)
00223 {
00224     rpmfi fi = rpmfi_ptr(s);
00225 if (_debug)
00226 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00227     return INT2FIX(rpmfiFLink(fi));
00228 }
00229 
00230 static VALUE
00231 rpmfi_FSize_get(VALUE s)
00232 {
00233     rpmfi fi = rpmfi_ptr(s);
00234 if (_debug)
00235 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00236     return INT2FIX(rpmfiFSize(fi));
00237 }
00238 
00239 static VALUE
00240 rpmfi_FRdev_get(VALUE s)
00241 {
00242     rpmfi fi = rpmfi_ptr(s);
00243 if (_debug)
00244 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00245     return INT2FIX(rpmfiFRdev(fi));
00246 }
00247 
00248 static VALUE
00249 rpmfi_FMtime_get(VALUE s)
00250 {
00251     rpmfi fi = rpmfi_ptr(s);
00252 if (_debug)
00253 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00254     return INT2FIX(rpmfiFMtime(fi));
00255 }
00256 
00257 static VALUE
00258 rpmfi_FUser_get(VALUE s)
00259 {
00260     rpmfi fi = rpmfi_ptr(s);
00261 if (_debug)
00262 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00263     return rb_str_new2(rpmfiFUser(fi));
00264 }
00265 
00266 static VALUE
00267 rpmfi_FGroup_get(VALUE s)
00268 {
00269     rpmfi fi = rpmfi_ptr(s);
00270 if (_debug)
00271 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00272     return rb_str_new2(rpmfiFGroup(fi));
00273 }
00274 
00275 static VALUE
00276 rpmfi_FColor_get(VALUE s)
00277 {
00278     rpmfi fi = rpmfi_ptr(s);
00279 if (_debug)
00280 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00281     return INT2FIX(rpmfiFColor(fi));
00282 }
00283 
00284 static VALUE
00285 rpmfi_FClass_get(VALUE s)
00286 {
00287     rpmfi fi = rpmfi_ptr(s);
00288     const char * FClass = rpmfiFClass(fi);
00289     char * t;
00290     VALUE v;
00291 if (_debug)
00292 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
00293     if (FClass == NULL) FClass = "";
00294     /* XXX spot fix for known embedded single quotes. */
00295     t = xstrdup(FClass);
00296     if (!strncmp(t, "symbolic link to `", sizeof("symbolic link to `")-1))
00297         t[sizeof("symbolic link")-1] = '\0';
00298     v = rb_str_new2(FClass);
00299     t = _free(t);
00300     return v;
00301 }
00302 
00303 static void
00304 initProperties(VALUE klass)
00305 {
00306     rb_define_method(klass, "debug", rpmfi_debug_get, 0);
00307     rb_define_method(klass, "debug=", rpmfi_debug_set, 1);
00308     rb_define_method(klass, "length", rpmfi_FC_get, 0);
00309     rb_define_method(klass, "fc", rpmfi_FC_get, 0);
00310     rb_define_method(klass, "fx", rpmfi_FX_get, 0);
00311     rb_define_method(klass, "fx=", rpmfi_FX_set, 1);
00312     rb_define_method(klass, "dc", rpmfi_DC_get, 0);
00313     rb_define_method(klass, "dx", rpmfi_DX_get, 0);
00314     rb_define_method(klass, "dx=", rpmfi_DX_set, 1);
00315     rb_define_method(klass, "bn", rpmfi_BN_get, 0);
00316     rb_define_method(klass, "dn", rpmfi_DN_get, 0);
00317     rb_define_method(klass, "fn", rpmfi_FN_get, 0);
00318     rb_define_method(klass, "vflags", rpmfi_VFlags_get, 0);
00319     rb_define_method(klass, "fflags", rpmfi_FFlags_get, 0);
00320     rb_define_method(klass, "fmode", rpmfi_FMode_get, 0);
00321     rb_define_method(klass, "fstate", rpmfi_FState_get, 0);
00322     rb_define_method(klass, "fdigest", rpmfi_FDigest_get, 0);
00323     rb_define_method(klass, "flink", rpmfi_FLink_get, 0);
00324     rb_define_method(klass, "fsize", rpmfi_FSize_get, 0);
00325     rb_define_method(klass, "frdev", rpmfi_FRdev_get, 0);
00326     rb_define_method(klass, "fmtime", rpmfi_FMtime_get, 0);
00327     rb_define_method(klass, "fuser", rpmfi_FUser_get, 0);
00328     rb_define_method(klass, "fgroup", rpmfi_FGroup_get, 0);
00329     rb_define_method(klass, "fcolor", rpmfi_FColor_get, 0);
00330     rb_define_method(klass, "fclass", rpmfi_FClass_get, 0);
00331 }
00332 
00333 /* --- Object ctors/dtors */
00334 static void
00335 rpmfi_free(rpmfi fi)
00336 {
00337 if (_debug)
00338 fprintf(stderr, "==> %s(%p)\n", __FUNCTION__, fi);
00339     fi = rpmfiFree(fi);
00340 }
00341 
00342 static VALUE
00343 rpmfi_new(int argc, VALUE *argv, VALUE s)
00344 {
00345     VALUE v_ts, v_hdr, v_tag;
00346     rpmts ts;
00347     Header h;
00348     rpmTag tag = RPMTAG_BASENAMES;
00349     int flags = 0;
00350     rpmfi fi;
00351 
00352     rb_scan_args(argc, argv, "21", &v_ts, &v_hdr, &v_tag);
00353 
00354     ts = rpmfi_ptr(v_ts);
00355     h = rpmfi_ptr(v_hdr);
00356 
00357     if (!NIL_P(v_tag))
00358         tag = FIX2INT(v_tag);
00359 
00360     fi = rpmfiNew(ts, h, tag, flags);
00361 
00362 if (_debug)
00363 fprintf(stderr, "==> %s(%p[%d], 0x%lx) mi %p\n", __FUNCTION__, argv, argc, s, fi);
00364     return Data_Wrap_Struct(s, 0, rpmfi_free, fi);
00365 }
00366 
00367 /* --- Class initialization */
00368 
00369 void
00370 Init_rpmfi(void)
00371 {
00372     rpmfiClass = rb_define_class("Fi", rb_cObject);
00373 if (_debug)
00374 fprintf(stderr, "==> %s() rpmfiClass 0x%lx\n", __FUNCTION__, rpmfiClass);
00375 #ifdef  NOTYET
00376     rb_include_module(rpmfiClass, rb_mEnumerable);
00377 #endif
00378     rb_define_singleton_method(rpmfiClass, "new", rpmfi_new, -1);
00379     initProperties(rpmfiClass);
00380     initMethods(rpmfiClass);
00381 }
00382 
00383 VALUE
00384 rpmrb_NewFi(void *_fi)
00385 {
00386     return Data_Wrap_Struct(rpmfiClass, 0, rpmfi_free, _fi);
00387 }
00388