+/*
+ * Free a previously allocated block
+ */
+freeblk(blkno, frags)
+ daddr_t blkno;
+ int frags;
+{
+ struct inodesc idesc;
+
+ idesc.id_blkno = blkno;
+ idesc.id_numfrags = frags;
+ pass4check(&idesc);
+}
+
+/*
+ * Find a pathname
+ */
+getpathname(namebuf, curdir, ino)
+ char *namebuf;
+ ino_t curdir, ino;
+{
+ int len;
+ register char *cp;
+ struct inodesc idesc;
+ extern int findname();
+
+ if (statemap[ino] != DSTATE && statemap[ino] != DFOUND) {
+ strcpy(namebuf, "?");
+ return;
+ }
+ bzero(&idesc, sizeof(struct inodesc));
+ idesc.id_type = DATA;
+ cp = &namebuf[BUFSIZ - 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) & STOP) == 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) & STOP) == 0)
+ break;
+ len = strlen(namebuf);
+ cp -= len;
+ if (cp < &namebuf[MAXNAMLEN])
+ break;
+ bcopy(namebuf, cp, len);
+ *--cp = '/';
+ ino = idesc.id_number;
+ }
+ if (ino != ROOTINO) {
+ strcpy(namebuf, "?");
+ return;
+ }
+ bcopy(cp, namebuf, &namebuf[BUFSIZ] - cp);
+}
+