+ int len;
+ register char *cp;
+ struct inodesc idesc;
+ extern int findname();
+
+ if (statemap[curdir] != DSTATE && statemap[curdir] != DFOUND) {
+ (void)strcpy(namebuf, "?");
+ return;
+ }
+ bzero((char *)&idesc, sizeof(struct inodesc));
+ idesc.id_type = DATA;
+ cp = &namebuf[MAXPATHLEN - 1];
+ *cp = '\0';
+ if (curdir != ino) {
+ idesc.id_parent = curdir;
+ goto namelookup;
+ }
+ while (ino != ROOTINO) {
+ idesc.id_number = ino;
+ idesc.id_func = findino;
+ idesc.id_name = "..";
+ if ((ckinode(ginode(ino), &idesc) & FOUND) == 0)
+ break;
+ namelookup:
+ idesc.id_number = idesc.id_parent;
+ idesc.id_parent = ino;
+ idesc.id_func = findname;
+ idesc.id_name = namebuf;
+ if ((ckinode(ginode(idesc.id_number), &idesc)&FOUND) == 0)
+ break;
+ len = strlen(namebuf);
+ cp -= len;
+ if (cp < &namebuf[MAXNAMLEN])
+ break;
+ bcopy(namebuf, cp, (size_t)len);
+ *--cp = '/';
+ ino = idesc.id_number;
+ }
+ if (ino != ROOTINO) {
+ (void)strcpy(namebuf, "?");
+ return;
+ }
+ bcopy(cp, namebuf, (size_t)(&namebuf[MAXPATHLEN] - cp));
+}