]> arthur.barton.de Git - netatalk.git/blobdiff - bin/ad/ad_ls.c
Merge master
[netatalk.git] / bin / ad / ad_ls.c
index 87834d8605706d61ed2847bb0bb45239cae4af2d..63226a37cd77ccc5a174ad285151546481a88268 100644 (file)
@@ -41,6 +41,8 @@
 #define DIR_DOT_OR_DOTDOT(a) \
         ((strcmp(a, ".") == 0) || (strcmp(a, "..") == 0))
 
+static volatile sig_atomic_t alarmed;
+
 /* ls options */
 static int ls_a;
 static int ls_l;
@@ -70,6 +72,44 @@ static char *labels[] = {
     "ora"
 };
 
+/*
+  SIGNAL handling:
+  catch SIGINT and SIGTERM which cause clean exit. Ignore anything else.
+*/
+
+static void sig_handler(int signo)
+{
+    alarmed = 1;
+    return;
+}
+
+static void set_signal(void)
+{
+    struct sigaction sv;
+
+    sv.sa_handler = sig_handler;
+    sv.sa_flags = SA_RESTART;
+    sigemptyset(&sv.sa_mask);
+    if (sigaction(SIGTERM, &sv, NULL) < 0)
+        ERROR("error in sigaction(SIGTERM): %s", strerror(errno));
+
+    if (sigaction(SIGINT, &sv, NULL) < 0)
+        ERROR("error in sigaction(SIGINT): %s", strerror(errno));
+
+    memset(&sv, 0, sizeof(struct sigaction));
+    sv.sa_handler = SIG_IGN;
+    sigemptyset(&sv.sa_mask);
+
+    if (sigaction(SIGABRT, &sv, NULL) < 0)
+        ERROR("error in sigaction(SIGABRT): %s", strerror(errno));
+
+    if (sigaction(SIGHUP, &sv, NULL) < 0)
+        ERROR("error in sigaction(SIGHUP): %s", strerror(errno));
+
+    if (sigaction(SIGQUIT, &sv, NULL) < 0)
+        ERROR("error in sigaction(SIGQUIT): %s", strerror(errno));
+}
+
 /*
   Check for netatalk special folders e.g. ".AppleDB" or ".AppleDesktop"
   Returns pointer to name or NULL.
@@ -475,6 +515,11 @@ static int ad_ls_r(char *path, afpvol_t *vol)
     /* First run: print everything */
     dirempty = 1;
     while ((ep = readdir (dp))) {
+        if (alarmed) {
+            ret = -1;
+            goto exit;
+        }
+
         /* Check if its "." or ".." */
         if (DIR_DOT_OR_DOTDOT(ep->d_name))
             continue;
@@ -510,6 +555,11 @@ static int ad_ls_r(char *path, afpvol_t *vol)
     if (ls_R) {
         rewinddir(dp);
         while ((ep = readdir (dp))) {
+            if (alarmed) {
+                ret = -1;
+                goto exit;
+            }
+
             /* Check if its "." or ".." */
             if (DIR_DOT_OR_DOTDOT(ep->d_name))
                 continue;
@@ -577,10 +627,13 @@ int ad_ls(int argc, char **argv)
 
     }
 
+    set_signal();
+    cnid_init();
+
     if ((argc - optind) == 0) {
-        newvol(".", &vol);
+        openvol(".", &vol);
         ad_ls_r(".", &vol);
-        freevol(&vol);
+        closevol(&vol);
     }
     else {
         int havefile = 0;
@@ -598,9 +651,9 @@ int ad_ls(int argc, char **argv)
             first = 1;
             recursion = 0;
 
-            newvol(argv[optind], &vol);
+            openvol(argv[optind], &vol);
             ad_ls_r(argv[optind], &vol);
-            freevol(&vol);
+            closevol(&vol);
         next:
             optind++;
         }
@@ -620,9 +673,9 @@ int ad_ls(int argc, char **argv)
             first = 1;
             recursion = 0;
 
-            newvol(argv[optind], &vol);
+            openvol(argv[optind], &vol);
             ad_ls_r(argv[optind], &vol);
-            freevol(&vol);
+            closevol(&vol);
 
         next2:
             optind++;