On Tue, Aug 10, 2010 at 01:41:21PM +0100, Richard W.M. Jones wrote:
+ r = pcre_exec (re, NULL, str, len, 0, 0, vec, 30);
You can ditch vec here and pass in NULL, 0. None of the above REs use back references, so this shouldn't be an issue.
My reading of the pcre_exec docs suggested otherwise. However I will need to try it when I get back from the conference.
The docs say I can pass ovector as NULL, but in that case pcre_exec might have to malloc extra space (although only in the case where the regexp contains back-references -- ours don't *yet* but someone might add one in future). I think it's safer to just leave this. However I've changed all calls to use sizeof(vec)/sizeof(vec[0]) instead of the fixed integer.
+ char *ret = NULL; + + const char *method; + if (strstr (file, "gzip")) + method = "zcat"; + else if (strstr (file, "bzip2")) + method = "bzcat"; + else + method = "cat"; + + char dir[] = "/tmp/initrd.XXXXXX"; +#define dir_len 18
This should be strlen(dir). The compiler will recognise this as a constant.
OK.
Actually I used 'sizeof dir' instead here.
+ + if (is_regular_file (bin)) { + snprintf (cmd, dir_len + 256, "file %s", bin);
Reusing a magic number from above in a different context. Magic numbers are getting a bit hard to track at this point. Could do with cmd_len for the size of cmd.
Stepping back slightly, you could more cleanly use libmagic here instead of invoking file. It would be less code, and wouldn't encode length limits which aren't defined anywhere.
Yes, that would make a lot of sense.
The code isn't shorter, but I changed it to use libmagic anyway. I'm going to post the whole series again, since it got longer ... Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://et.redhat.com/~rjones/libguestfs/ See what it can do: http://et.redhat.com/~rjones/libguestfs/recipes.html