]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/enumerate.c
Update the CNID code again to allow for 4G CNIDs, and a little somethin'
[netatalk.git] / etc / afpd / enumerate.c
index ab8ba9ed67904efc97a3d4bf2f16459a3e0cfb54..199913fee298cc8f91f6b8c0af4dce76bea98af3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: enumerate.c,v 1.12 2002-01-03 17:49:38 sibaz Exp $
+ * $Id: enumerate.c,v 1.16 2002-01-29 21:12:14 jmarcus Exp $
  *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -15,7 +15,7 @@
 #include <dirent.h>
 #include <errno.h>
 
-#include <syslog.h>
+#include <atalk/logger.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/file.h>
@@ -39,6 +39,8 @@
 #include "parse_mtab.h"
 #endif /* DID_MTAB */
 
+#define min(a,b)       ((a)<(b)?(a):(b))
+
 struct dir *
             adddir( vol, dir, name, namlen, upath, upathlen, st )
             struct vol *vol;
@@ -57,7 +59,7 @@ struct stat *st;
 #endif /* USE_LASTDID */
 
     if ((cdir = dirnew(namlen + 1)) == NULL) {
-        syslog( LOG_ERR, "adddir: malloc: %s", strerror(errno) );
+        LOG(log_error, logtype_default, "adddir: malloc: %s", strerror(errno) );
         return NULL;
     }
     strcpy( cdir->d_name, name );
@@ -79,6 +81,18 @@ struct stat *st;
     /* add to cnid db */
     cdir->d_did = cnid_add(vol->v_db, st, dir->d_did, upath,
                            upathlen, cdir->d_did);
+    /* Fail out if things go bad with CNID. */
+    if (cdir->d_did < 0) {
+        switch (errno) {
+        case CNID_ERR_PARAM:
+            LOG(log_error, logtype_default, "adddir: Incorrect parameters passed to cnid_add");
+            return NULL;
+        case CNID_ERR_PATH:
+        case CNID_ERR_DB:
+        case CNID_ERR_MAX:
+            return NULL;
+        }
+    }
 #endif /* CNID_DB */
 
     if (cdir->d_did == 0) {
@@ -101,7 +115,7 @@ struct stat *st;
 #ifndef CNID_DB
         if (edir->d_name) {
             if (strcmp(edir->d_name, cdir->d_name)) {
-                syslog(LOG_INFO, "WARNING: DID conflict for '%s' and '%s'. Are these the same file?", edir->d_name, cdir->d_name);
+                LOG(log_info, logtype_default, "WARNING: DID conflict for '%s' and '%s'. Are these the same file?", edir->d_name, cdir->d_name);
             }
             free(cdir->d_name);
             free(cdir);
@@ -151,7 +165,7 @@ int         ibuflen, *rbuflen;
 
     if ( sd.sd_buflen == 0 ) {
         if (( sd.sd_buf = (char *)malloc( SDBUFBRK )) == NULL ) {
-            syslog( LOG_ERR, "afp_enumerate: malloc: %s", strerror(errno) );
+            LOG(log_error, logtype_default, "afp_enumerate: malloc: %s", strerror(errno) );
             *rbuflen = 0;
             return AFPERR_MISC;
         }
@@ -205,6 +219,8 @@ int         ibuflen, *rbuflen;
     maxsz = ntohs( maxsz );
     ibuf += sizeof( maxsz );
 
+    maxsz = min(maxsz, *rbuflen);
+
     if (( path = cname( vol, dir, &ibuf )) == NULL ) {
         *rbuflen = 0;
         return( AFPERR_NODIR );
@@ -250,8 +266,8 @@ int         ibuflen, *rbuflen;
                 start = sd.sd_buf;
                 if ((buf = (char *) realloc( sd.sd_buf, sd.sd_buflen +
                                              SDBUFBRK )) == NULL ) {
-                    syslog( LOG_ERR, "afp_enumerate: realloc: %s",
-                            strerror(errno) );
+                    LOG(log_error, logtype_default, "afp_enumerate: realloc: %s",
+                        strerror(errno) );
                     closedir(dp);
                     *rbuflen = 0;
                     return AFPERR_MISC;
@@ -309,8 +325,8 @@ int         ibuflen, *rbuflen;
         sd.sd_last++;
 
         if ( stat( sd.sd_last, &st ) < 0 ) {
-            syslog( LOG_DEBUG, "afp_enumerate: stat %s: %s",
-                    sd.sd_last, strerror(errno) );
+            LOG(log_debug, logtype_default, "afp_enumerate: stat %s: %s",
+                sd.sd_last, strerror(errno) );
             sd.sd_last += len + 1;
             continue;
         }