diff options
Diffstat (limited to 'abs/core/udev/resolve-modalias.c')
| -rw-r--r-- | abs/core/udev/resolve-modalias.c | 62 | 
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; +}  | 
