summaryrefslogtreecommitdiffstats
path: root/abs/core/udev/resolve-modalias.c
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core/udev/resolve-modalias.c')
-rw-r--r--abs/core/udev/resolve-modalias.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/abs/core/udev/resolve-modalias.c b/abs/core/udev/resolve-modalias.c
new file mode 100644
index 0000000..d1680b1
--- /dev/null
+++ b/abs/core/udev/resolve-modalias.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <fnmatch.h>
+#include <string.h>
+#include <malloc.h>
+
+static char *getline(FILE *file) {
+ static size_t size = 1024;
+ static char *buf = NULL;
+ static unsigned int i = 0, r = 0;;
+
+ if(buf == NULL)
+ buf = (char*)malloc(size);
+
+ if(i) {
+ memmove(buf, buf+i, size-i);
+ r -= i;
+ i = 0;
+ }
+
+ while(1) {
+ if(i == size) {
+ size *= 2;
+ buf = (char*)realloc(buf, size);
+ }
+
+ if(i==r)
+ r += fread(buf+i, 1, size-i, file);
+
+ if(i==r && i == 0) {
+ free(buf);
+ buf = NULL;
+ r = 0;
+ return NULL;
+ }
+
+ if(i==r || buf[i] == '\n') {
+ buf[i++] = '\0';
+ return buf;
+ }
+ i++;
+ }
+}
+
+int main(int argc, char *argv[]) {
+ FILE *f=fopen(argv[1], "r");
+ char *line, *pattern, *module;
+ char *pos1, *pos2;
+
+ while((line=getline(f))!=NULL) {
+ if(!strncmp(line, "alias", strlen("alias"))) {
+ pos1 = index(line, ' ');
+ pos2 = index(pos1+1, ' ');
+ pattern = pos1+1;
+ *pos2 = '\0';
+ module = pos2+1;
+
+ if(!fnmatch(pattern, argv[2], 0))
+ printf("%s\n", module);
+ }
+ }
+ return 0;
+}