|
rpm
5.4.4
|
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
1.7.5.1