if (namelen + dp->d_namlen >= MAXPATHLEN) {
if (namelen + dp->d_namlen >= sizeof(locname)) {
static struct direct	*searchdir __P((ino_t, char *));/* *	Extract directory contents, building up a directory structure *	on disk for extraction by name. *	If genmode is requested, save mode, owner, and times for all *	directories on the tape. */voidextractdirs(genmode)	int genmode;{	register int i;	register struct dinode *ip;	struct inotab *itp;	struct direct nulldir;	int fd;	vprintf(stdout, "Extract directories from tape\n");	(void) sprintf(dirfile, "%srstdir%d", _PATH_TMP, dumpdate);	if (command != 'r' && command != 'R') {		(void *) strcat(dirfile, "-XXXXXX");		if (mktemp(dirfile) == NULL) {			fprintf(stderr,			    "restore: %s - cannot mktemp directory temporary\n",			    dirfile);			exit(1);		}	}	if ((fd = open(dirfile, O_RDWR|O_CREAT|O_EXCL, 0666)) == -1 ||	    (df = fdopen(fd, "w")) == NULL) {		if (fd != -1)			close(fd);		fprintf(stderr,		    "restore: %s - cannot create directory temporary\n",		    dirfile);		fprintf(stderr, "fopen: %s\n", strerror(errno));		exit(1);	}	if (genmode != 0) {		(void) sprintf(modefile, "%srstmode%d", _PATH_TMP, dumpdate);		if (command != 'r' && command != 'R') {			(void *) strcat(modefile, "-XXXXXX");			if (mktemp(modefile) == NULL) {				fprintf(stderr,				    "restore: %s - cannot mktemp modefile\n",				    modefile);				exit(1);			}		}		if ((fd = open(modefile, O_RDWR|O_CREAT|O_EXCL,		    0666)) == -1 || (mf = fdopen(fd, "w")) == NULL) {			if (fd != -1)				close(fd);			fprintf(stderr,			    "restore: %s - cannot create modefile \n",			    modefile);			fprintf(stderr, "fopen: %s\n", strerror(errno));			exit(1);		}	}	nulldir.d_ino = 0;	nulldir.d_type = DT_DIR;	nulldir.d_namlen = 1;	(void) strcpy(nulldir.d_name, "/");	nulldir.d_reclen = DIRSIZ(0, &nulldir);	for (;;) {		curfile.name = "<directory file - name unknown>";		curfile.action = USING;		ip = curfile.dip;		if (ip == NULL || (ip->di_mode & IFMT) != IFDIR) {			(void) fclose(df);			dirp = opendirfile(dirfile);			if (dirp == NULL)				fprintf(stderr, "opendirfile: %s\n",				    strerror(errno));			if (mf != NULL)				(void) fclose(mf);			i = dirlookup(dot);			if (i == 0)				panic("Root directory is not on tape\n");			return;		}		itp = allocinotab(curfile.ino, ip, seekpt);		getfile(putdir, xtrnull);		putent(&nulldir);		flushent();		itp->t_size = seekpt - itp->t_seekpt;	}}/* * skip over all the directories on the tape */voidskipdirs(){	while (curfile.dip && (curfile.dip->di_mode & IFMT) == IFDIR) {		skipfile();	}}/* *	Recursively find names and inumbers of all files in subtree  *	pname and pass them off to be processed. */voidtreescan(pname, ino, todo)	char *pname;	ino_t ino;	long (*todo) __P((char *, ino_t, int));{	register struct inotab *itp;	register struct direct *dp;	int namelen;	long bpt;	char locname[MAXPATHLEN + 1];	itp = inotablookup(ino);	if (itp == NULL) {		/*		 * Pname is name of a simple file or an unchanged directory.		 */		(void) (*todo)(pname, ino, LEAF);		return;	}	/*	 * Pname is a dumped directory name.	 */	if ((*todo)(pname, ino, NODE) == FAIL)		return;	/*	 * begin search through the directory	 * skipping over "." and ".."	 */	(void) strncpy(locname, pname, MAXPATHLEN);	(void) strncat(locname, "/", MAXPATHLEN);	namelen = strlen(locname);	rst_seekdir(dirp, itp->t_seekpt, itp->t_seekpt);	dp = rst_readdir(dirp); /* "." */	if (dp != NULL && strcmp(dp->d_name, ".") == 0)		dp = rst_readdir(dirp); /* ".." */	else		fprintf(stderr, "Warning: `.' missing from directory %s\n",			pname);	if (dp != NULL && strcmp(dp->d_name, "..") == 0)		dp = rst_readdir(dirp); /* first real entry */	else		fprintf(stderr, "Warning: `..' missing from directory %s\n",			pname);	bpt = rst_telldir(dirp);	/*	 * a zero inode signals end of directory	 */	while (dp != NULL) {		locname[namelen] = '\0';		if (namelen + dp->d_namlen >= MAXPATHLEN) {			fprintf(stderr, "%s%s: name exceeds %d char\n",				locname, dp->d_name, MAXPATHLEN);		} else {			(void) strncat(locname, dp->d_name, (int)dp->d_namlen);			treescan(locname, dp->d_ino, todo);			rst_seekdir(dirp, bpt, itp->t_seekpt);		}		dp = rst_readdir(dirp);		bpt = rst_telldir(dirp);	}}/* * Lookup a pathname which is always assumed to start from the ROOTINO. */struct direct *pathsearch(pathname)	const char *pathname;{	ino_t ino;	struct direct *dp;	char *path, *name, buffer[MAXPATHLEN];	strcpy(buffer, pathname);	path = buffer;	ino = ROOTINO;	while (*path == '/')		path++;	dp = NULL;	while ((name = strsep(&path, "/")) != NULL && *name != NULL) {		if ((dp = searchdir(ino, name)) == NULL)			return (NULL);		ino = dp->d_ino;	}	return (dp);}/* * Lookup the requested name in directory inum. * Return its inode number if found, zero if it does not exist. */static struct direct *searchdir(inum, name)	ino_t	inum;	char	*name;{	register struct direct *dp;	register struct inotab *itp;	int len;	itp = inotablookup(inum);	if (itp == NULL)		return (NULL);	rst_seekdir(dirp, itp->t_seekpt, itp->t_seekpt);	len = strlen(name);	do {		dp = rst_readdir(dirp);		if (dp == NULL)			return (NULL);	} while (dp->d_namlen != len || strncmp(dp->d_name, name, len) != 0);	return (dp);}