rpm  5.4.10
rpmfi-rb.c
Go to the documentation of this file.
1 
5 #include "system.h"
6 
7 #include "rpm-rb.h"
8 #include "rpmfi-rb.h"
9 
10 #ifdef NOTYET
11 #include <argv.h>
12 #include <mire.h>
13 #endif
14 
15 #define _RPMFI_INTERNAL
16 #include <rpmtag.h>
17 #include <rpmtypes.h>
18 #include <rpmio.h>
19 #include <rpmfi.h>
20 #include <rpmts.h>
21 
22 
23 #include "../debug.h"
24 
25 
26 VALUE rpmfiClass;
27 
28 
29 /*@unchecked@*/
30 static int _debug = 0;
31 
32 
33 /* --- helpers */
34 static void *
35 rpmfi_ptr(VALUE s)
36 {
37  void *ptr;
38  Data_Get_Struct(s, void, ptr);
39  return ptr;
40 }
41 
42 /* --- Object methods */
43 
44 static void
45 initMethods(VALUE klass)
46 {
47 }
48 
49 /* --- Object properties */
50 static VALUE
52 {
53 if (_debug)
54 fprintf(stderr, "==> %s(0x%lx)\n", __FUNCTION__, s);
55  return INT2FIX(_debug);
56 }
57 
58 static VALUE
59 rpmfi_debug_set(VALUE s, VALUE v)
60 {
61 if (_debug)
62 fprintf(stderr, "==> %s(0x%lx, 0x%lx)\n", __FUNCTION__, s, v);
63  return INT2FIX(_debug = FIX2INT(v));
64 }
65 
66 static VALUE
67 rpmfi_FC_get(VALUE s)
68 {
69  rpmfi fi = rpmfi_ptr(s);
70 if (_debug)
71 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
72  return INT2FIX(rpmfiFC(fi));
73 }
74 
75 static VALUE
76 rpmfi_FX_get(VALUE s)
77 {
78  rpmfi fi = rpmfi_ptr(s);
79 if (_debug)
80 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
81  return INT2FIX(rpmfiFX(fi));
82 }
83 
84 static VALUE
85 rpmfi_FX_set(VALUE s, VALUE v)
86 {
87  rpmfi fi = rpmfi_ptr(s);
88  int ix = FIX2INT(v);
89 if (_debug)
90 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
91  if (ix != rpmfiFX(fi)) {
92  (void) rpmfiSetFX(fi, ix-1);
93  /* XXX flush and recreate {BN,DN,FN} with a rpmfiNext() step */
94  (void) rpmfiNext(fi);
95  }
96  return INT2FIX(rpmfiFX(fi));
97 }
98 
99 static VALUE
100 rpmfi_DC_get(VALUE s)
101 {
102  rpmfi fi = rpmfi_ptr(s);
103 if (_debug)
104 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
105  return INT2FIX(rpmfiDC(fi));
106 }
107 
108 static VALUE
109 rpmfi_DX_get(VALUE s)
110 {
111  rpmfi fi = rpmfi_ptr(s);
112 if (_debug)
113 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
114  return INT2FIX(rpmfiDX(fi));
115 }
116 
117 static VALUE
118 rpmfi_DX_set(VALUE s, VALUE v)
119 {
120  rpmfi fi = rpmfi_ptr(s);
121  int ix = FIX2INT(v);
122 if (_debug)
123 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
124  (void) rpmfiSetDX(fi, ix);
125  if (ix != rpmfiDX(fi)) {
126  (void) rpmfiSetDX(fi, ix-1);
127  /* XXX flush and recreate {BN,DN,FN} with a rpmfiNextD() step */
128  (void) rpmfiNextD(fi);
129  }
130  return INT2FIX(rpmfiDX(fi));
131 }
132 
133 static VALUE
134 rpmfi_BN_get(VALUE s)
135 {
136  rpmfi fi = rpmfi_ptr(s);
137 if (_debug)
138 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
139  return rb_str_new2(rpmfiBN(fi));
140 }
141 
142 static VALUE
143 rpmfi_DN_get(VALUE s)
144 {
145  rpmfi fi = rpmfi_ptr(s);
146 if (_debug)
147 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
148  return rb_str_new2(rpmfiDN(fi));
149 }
150 
151 static VALUE
152 rpmfi_FN_get(VALUE s)
153 {
154  rpmfi fi = rpmfi_ptr(s);
155 if (_debug)
156 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
157  return rb_str_new2(rpmfiFN(fi));
158 }
159 
160 static VALUE
162 {
163  rpmfi fi = rpmfi_ptr(s);
164 if (_debug)
165 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
166  return INT2FIX(rpmfiVFlags(fi));
167 }
168 
169 static VALUE
171 {
172  rpmfi fi = rpmfi_ptr(s);
173 if (_debug)
174 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
175  return INT2FIX(rpmfiFFlags(fi));
176 }
177 
178 static VALUE
180 {
181  rpmfi fi = rpmfi_ptr(s);
182 if (_debug)
183 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
184  return INT2FIX(rpmfiFMode(fi));
185 }
186 
187 static VALUE
189 {
190  rpmfi fi = rpmfi_ptr(s);
191 if (_debug)
192 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
193  return INT2FIX(rpmfiFState(fi));
194 }
195 
196 static VALUE
197 rpmfi_FDigest_get(VALUE self)
198 {
199  rpmfi fi = rpmfi_ptr(self);
200  int dalgo = 0;
201  size_t dlen = 0;
202  const unsigned char * digest = rpmfiDigest(fi, &dalgo, &dlen);
203  const unsigned char * s = digest;
204  size_t nb = 2 * dlen;
205  char * fdigest = memset(alloca(nb+1), 0, nb+1);
206  char *t = fdigest;
207  int i;
208 
209 if (_debug)
210 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, self, fi);
211  for (i = 0, s = digest, t = fdigest; i < (int)dlen; i++, s++, t+= 2) {
212  static const char hex[] = "0123456789abcdef";
213  t[0] = hex[(s[0] >> 4) & 0xf];
214  t[1] = hex[(s[0] ) & 0xf];
215  }
216  *t = '\0';
217 
218  return rb_str_new2(fdigest);
219 }
220 
221 static VALUE
223 {
224  rpmfi fi = rpmfi_ptr(s);
225 if (_debug)
226 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
227  return INT2FIX(rpmfiFLink(fi));
228 }
229 
230 static VALUE
232 {
233  rpmfi fi = rpmfi_ptr(s);
234 if (_debug)
235 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
236  return INT2FIX(rpmfiFSize(fi));
237 }
238 
239 static VALUE
241 {
242  rpmfi fi = rpmfi_ptr(s);
243 if (_debug)
244 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
245  return INT2FIX(rpmfiFRdev(fi));
246 }
247 
248 static VALUE
250 {
251  rpmfi fi = rpmfi_ptr(s);
252 if (_debug)
253 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
254  return INT2FIX(rpmfiFMtime(fi));
255 }
256 
257 static VALUE
259 {
260  rpmfi fi = rpmfi_ptr(s);
261 if (_debug)
262 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
263  return rb_str_new2(rpmfiFUser(fi));
264 }
265 
266 static VALUE
268 {
269  rpmfi fi = rpmfi_ptr(s);
270 if (_debug)
271 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
272  return rb_str_new2(rpmfiFGroup(fi));
273 }
274 
275 static VALUE
277 {
278  rpmfi fi = rpmfi_ptr(s);
279 if (_debug)
280 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
281  return INT2FIX(rpmfiFColor(fi));
282 }
283 
284 static VALUE
286 {
287  rpmfi fi = rpmfi_ptr(s);
288  const char * FClass = rpmfiFClass(fi);
289  char * t;
290  VALUE v;
291 if (_debug)
292 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, fi);
293  if (FClass == NULL) FClass = "";
294  /* XXX spot fix for known embedded single quotes. */
295  t = xstrdup(FClass);
296  if (!strncmp(t, "symbolic link to `", sizeof("symbolic link to `")-1))
297  t[sizeof("symbolic link")-1] = '\0';
298  v = rb_str_new2(FClass);
299  t = _free(t);
300  return v;
301 }
302 
303 static void
304 initProperties(VALUE klass)
305 {
306  rb_define_method(klass, "debug", rpmfi_debug_get, 0);
307  rb_define_method(klass, "debug=", rpmfi_debug_set, 1);
308  rb_define_method(klass, "length", rpmfi_FC_get, 0);
309  rb_define_method(klass, "fc", rpmfi_FC_get, 0);
310  rb_define_method(klass, "fx", rpmfi_FX_get, 0);
311  rb_define_method(klass, "fx=", rpmfi_FX_set, 1);
312  rb_define_method(klass, "dc", rpmfi_DC_get, 0);
313  rb_define_method(klass, "dx", rpmfi_DX_get, 0);
314  rb_define_method(klass, "dx=", rpmfi_DX_set, 1);
315  rb_define_method(klass, "bn", rpmfi_BN_get, 0);
316  rb_define_method(klass, "dn", rpmfi_DN_get, 0);
317  rb_define_method(klass, "fn", rpmfi_FN_get, 0);
318  rb_define_method(klass, "vflags", rpmfi_VFlags_get, 0);
319  rb_define_method(klass, "fflags", rpmfi_FFlags_get, 0);
320  rb_define_method(klass, "fmode", rpmfi_FMode_get, 0);
321  rb_define_method(klass, "fstate", rpmfi_FState_get, 0);
322  rb_define_method(klass, "fdigest", rpmfi_FDigest_get, 0);
323  rb_define_method(klass, "flink", rpmfi_FLink_get, 0);
324  rb_define_method(klass, "fsize", rpmfi_FSize_get, 0);
325  rb_define_method(klass, "frdev", rpmfi_FRdev_get, 0);
326  rb_define_method(klass, "fmtime", rpmfi_FMtime_get, 0);
327  rb_define_method(klass, "fuser", rpmfi_FUser_get, 0);
328  rb_define_method(klass, "fgroup", rpmfi_FGroup_get, 0);
329  rb_define_method(klass, "fcolor", rpmfi_FColor_get, 0);
330  rb_define_method(klass, "fclass", rpmfi_FClass_get, 0);
331 }
332 
333 /* --- Object ctors/dtors */
334 static void
336 {
337 if (_debug)
338 fprintf(stderr, "==> %s(%p)\n", __FUNCTION__, fi);
339  fi = rpmfiFree(fi);
340 }
341 
342 static VALUE
343 rpmfi_new(int argc, VALUE *argv, VALUE s)
344 {
345  VALUE v_ts, v_hdr, v_tag;
346  rpmts ts;
347  Header h;
348  rpmTag tag = RPMTAG_BASENAMES;
349  int flags = 0;
350  rpmfi fi;
351 
352  rb_scan_args(argc, argv, "21", &v_ts, &v_hdr, &v_tag);
353 
354  ts = rpmfi_ptr(v_ts);
355  h = rpmfi_ptr(v_hdr);
356 
357  if (!NIL_P(v_tag))
358  tag = FIX2INT(v_tag);
359 
360  fi = rpmfiNew(ts, h, tag, flags);
361 
362 if (_debug)
363 fprintf(stderr, "==> %s(%p[%d], 0x%lx) mi %p\n", __FUNCTION__, argv, argc, s, fi);
364  return Data_Wrap_Struct(s, 0, rpmfi_free, fi);
365 }
366 
367 /* --- Class initialization */
368 
369 void
371 {
372  rpmfiClass = rb_define_class("Fi", rb_cObject);
373 if (_debug)
374 fprintf(stderr, "==> %s() rpmfiClass 0x%lx\n", __FUNCTION__, rpmfiClass);
375 #ifdef NOTYET
376  rb_include_module(rpmfiClass, rb_mEnumerable);
377 #endif
378  rb_define_singleton_method(rpmfiClass, "new", rpmfi_new, -1);
381 }
382 
383 VALUE
385 {
386  return Data_Wrap_Struct(rpmfiClass, 0, rpmfi_free, _fi);
387 }
388