Changeset 127033


Ignore:
Timestamp:
Oct 19, 2014, 7:07:42 PM (5 years ago)
Author:
cal@…
Message:

trace mode: deal with volfs paths correctly, remove unnecessary normalization code at a place that can only be reached with normalized paths

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/base/src/darwintracelib1.0/darwintrace.c

    r124216 r127033  
    420420static inline void __darwintrace_log_op(const char *op, const char *path) {
    421421        uint32_t size;
    422         char pathbuf[MAXPATHLEN];
    423422        char logbuffer[BUFFER_SIZE];
    424         const char *realpath;
    425 
    426         do {
    427 #if defined(__APPLE__) && defined(ATTR_CMN_FULLPATH) && 0
    428                 if (false && strncmp(path, "/.vol/", 6) == 0) {
    429                         // path in VOLFS, try to get inode -> name lookup from
    430                         // getattrlist(2).
    431                         struct attrlist attrlist;
    432                         attrlist.bitmapcount = ATTR_BIT_MAP_COUNT;
    433                         attrlist.reserved = 0;
    434                         attrlist.commonattr = ATTR_CMN_FULLPATH;
    435                         attrlist.volattr = 0;
    436                         attrlist.dirattr = 0;
    437                         attrlist.fileattr = 0;
    438                         attrlist.forkattr = 0;
    439 
    440                         char attrbuf[sizeof(uint32_t) + sizeof(attrreference_t) + (PATH_MAX)];
    441                         /*           attrlength         attrref_t for the name     UTF-8 name up to PATH_MAX chars */
    442                         if (-1 == (getattrlist(path, &attrlist, attrbuf, sizeof(attrbuf), FSOPT_NOFOLLOW))) {
    443                                 perror("darwintrace: getattrlist");
    444                                 // ignore and just print the /.vol/ path
    445                         } else {
    446                                 attrreference_t *nameAttrRef = (attrreference_t *) (attrbuf + sizeof(uint32_t));
    447                                 strlcpy(pathbuf, ((char *) nameAttrRef) + nameAttrRef->attr_dataoffset, sizeof(pathbuf));
    448                                 realpath = pathbuf;
    449                                 break;
    450                         }
    451                 }
    452 #endif
    453 
    454                 if (*path != '/') {
    455                         if (!getcwd(pathbuf, sizeof(pathbuf))) {
    456                                 perror("darwintrace: getcwd");
    457                                 abort();
    458                         }
    459 
    460                         strlcat(pathbuf, "/", sizeof(pathbuf));
    461                         strlcat(pathbuf, path, sizeof(pathbuf));
    462                         realpath = pathbuf;
    463                         break;
    464                 }
    465 
    466                 /* otherwise, just copy the original path. */
    467                 realpath = path;
    468         } while (0);
    469 
    470         size = snprintf(logbuffer, sizeof(logbuffer), "%s\t%s", op, realpath);
     423
     424        size = snprintf(logbuffer, sizeof(logbuffer), "%s\t%s", op, path);
    471425        __send(logbuffer, size, 0);
    472426}
     
    815769        }
    816770
     771#       ifdef ATTR_CMN_FULLPATH
     772        if (numComponents >= 3 && strncmp(".vol", pathComponents[0].start, pathComponents[0].len) == 0) {
     773                // path in VOLFS, try to get inode -> name lookup from getattrlist(2).
     774
     775                // Add the slashes and the terminating \0
     776                for (size_t i = 0; i < numComponents; ++i) {
     777                        if (i == numComponents - 1) {
     778                                pathComponents[i].start[pathComponents[i].len] = '\0';
     779                        } else {
     780                                pathComponents[i].start[pathComponents[i].len] = '/';
     781                        }
     782                }
     783
     784                struct attrlist attrlist;
     785                attrlist.bitmapcount = ATTR_BIT_MAP_COUNT;
     786                attrlist.reserved = 0;
     787                attrlist.commonattr = ATTR_CMN_FULLPATH;
     788                attrlist.volattr = 0;
     789                attrlist.dirattr = 0;
     790                attrlist.fileattr = 0;
     791                attrlist.forkattr = 0;
     792
     793                char attrbuf[sizeof(uint32_t) + sizeof(attrreference_t) + (PATH_MAX + 1)];
     794                /*           attrlength         attrref_t for the name     UTF-8 name up to PATH_MAX chars */
     795
     796                if (-1 == (getattrlist(normPath, &attrlist, attrbuf, sizeof(attrbuf), FSOPT_NOFOLLOW))) {
     797                        perror("darwintrace: getattrlist");
     798                        // ignore and just return the /.vol/ path
     799                } else {
     800                        attrreference_t *nameAttrRef = (attrreference_t *) (attrbuf + sizeof(uint32_t));
     801                        strlcpy(normPath, ((char *) nameAttrRef) + nameAttrRef->attr_dataoffset, sizeof(normPath));
     802
     803                        numComponents = 0;
     804                        char *writableToken = normPath + 1;
     805                        while ((idx = strcspn(writableToken, "/")) > 0) {
     806                                // found a token, tokenize and store it
     807                                pathComponents[numComponents].start = writableToken;
     808                                pathComponents[numComponents].len   = idx;
     809                                numComponents++;
     810
     811                                bool final = writableToken[idx] == '\0';
     812                                writableToken[idx] = '\0';
     813                                if (final) {
     814                                        break;
     815                                }
     816                                // advance token
     817                                writableToken += idx + 1;
     818                        }
     819                }
     820        }
     821#       endif
     822
    817823        bool pathIsSymlink;
    818824        size_t loopCount = 0;
Note: See TracChangeset for help on using the changeset viewer.