acmecert: Fix cryptography bugs.
[utils.git] / bkselect.c
index 6227a5b..96f3ad9 100644 (file)
@@ -5,8 +5,11 @@
 #include <dirent.h>
 #include <string.h>
 #include <sys/stat.h>
-#include <attr/xattr.h>
-#include <attr/attributes.h>
+#include <sys/xattr.h>
+
+int printsize = 0;
+int printnames = 1;
+long long tsize = 0;
 
 int bkselect(char *path, int s)
 {
@@ -19,8 +22,8 @@ int bkselect(char *path, int s)
     int pbl, pl, al;
     
     al = sizeof(ab) - 1;
-    if(attr_get(path, "bkselect", ab, &al, 0)) {
-       if(errno == ENOATTR) {
+    if((al = getxattr(path, "user.bkselect", ab, sizeof(ab))) < 0) {
+       if(errno == ENODATA) {
        } else if(errno == EPERM) {
            /* Ignore for now because of weird effects... */
        } else if(errno == E2BIG) {
@@ -66,8 +69,11 @@ int bkselect(char *path, int s)
            if(bkselect(pb, s))
                r = 1;
        } else if(S_ISREG(sb.st_mode) || S_ISLNK(sb.st_mode)) {
-           if(s)
-               printf("%s\n", pb);
+           if(s) {
+               if(printnames)
+                   printf("%s\n", pb);
+               tsize += sb.st_size;
+           }
        }
     }
     
@@ -75,18 +81,43 @@ int bkselect(char *path, int s)
     return(r);
 }
 
+void usage(void)
+{
+    fprintf(stderr, "usage: bkselect [-hsqo] [path...]\n");
+}
+
 int main(int argc, char **argv)
 {
-    int i, r;
+    int c, i, r, s;
     
-    if(argc < 1) {
-       fprintf(stderr, "usage: bkselect path...\n");
-       exit(1);
+    s = 1;
+    while((c = getopt(argc, argv, "hsqo")) >= 0) {
+       switch(c) {
+       case 's':
+           printsize = 1;
+           break;
+       case 'q':
+           printnames = 0;
+           break;
+       case 'o':
+           s = 0;
+           break;
+       case 'h':
+       default:
+           usage();
+           exit((c == 'h')?0:1);
+       }
     }
-    r = 0;
-    for(i = 1; i < argc; i++) {
-       if(bkselect(argv[i], 0))
-           r = 1;
+    if(argc - optind < 1) {
+       r = bkselect(".", s);
+    } else {
+       r = 0;
+       for(i = optind; i < argc; i++) {
+           if(bkselect(argv[i], s))
+               r = 1;
+       }
     }
+    if(printsize)
+       printf("%lli\n", tsize);
     return(r);
 }