keith@seismo.CSS.GOV (Keith Bostic) (10/22/85)
Subject: csh Index: bin/csh/sh.exec.c, bin/csh/sh.glob.c, bin/csh/sh.h 2.9BSD Description: The csh should use the new directory reading subroutines. Fix: The previous postings regarding reading directories applies to csh. The following diffs can replace the old directory reading code with the new directory reading subroutines, if you're so inclined. ---------------------------------------------------------------------- diff sh.exec.c.wrong sh.exec.right 253,255c253,255 < struct direct dirbuf[BUFSIZ / sizeof (struct direct)]; < char d_name[MAXNAMLEN + 1]; < register int dirf, cnt; --- > DIR *dirp; > register struct direct *dp; > register int cnt; 268,269c268,269 < dirf = open(*pv, 0); < if (dirf < 0) --- > dirp = opendir(*pv); > if (dirp == NULL) 271,272c271,272 < if (fstat(dirf, &stb) < 0 || !isdir(stb)) { < close(dirf); --- > if (fstat(dirp->dd_fd, &stb) < 0 || !isdir(stb)) { > closedir(dirp); 275,283c275,282 < while ((cnt = read(dirf, (char *) dirbuf, sizeof dirbuf)) >= sizeof dirbuf[0]) { < register struct direct *ep = dirbuf; < < for (cnt /= sizeof(struct direct); cnt > 0; cnt--, ep++) { < if (ep->d_ino == 0) < continue; < copdent(d_name, ep->d_name); < xhash[hash(d_name)] |= (1 << i); < } --- > while ((dp = readdir(dirp)) != NULL) { > if (dp->d_ino == 0) > continue; > if (dp->d_name[0] == '.' && > (dp->d_name[1] == '\0' || > dp->d_name[1] == '.' && dp->d_name[2] == '\0')) > continue; > xhash[hash(dp->d_name)] |= (1 << i); 285c284 < close(dirf); --- > closedir(dirp); ---------------------------------------------------------------------- diff sh.glob.wrong sh.glob.right 173,175c173,174 < struct direct dirbuf[BUFSIZ / sizeof (struct direct)]; < char d_name[MAXNAMLEN+1]; < register int dirf, cnt; --- > register struct direct *dp; > register DIR *dirp; 177,178c176,177 < dirf = open(gpath, 0); < if (dirf < 0) { --- > dirp = opendir(gpath); > if (dirp == NULL) { 181c180 < goto patherr; --- > goto patherr2; 183,184c182,183 < if (fstat(dirf, &stb) < 0) < goto patherr; --- > if (fstat(dirp->dd_fd, &stb) < 0) > goto patherr1; 187c186 < goto patherr; --- > goto patherr1; 189,199c188,193 < while ((cnt = read(dirf, (char *) dirbuf, sizeof dirbuf)) >= sizeof dirbuf[0]) { < register struct direct *ep = dirbuf; < < for (cnt /= sizeof (struct direct); cnt > 0; cnt--, ep++) { < if (ep->d_ino == 0) < continue; < copdent(d_name, ep->d_name); < if (match(d_name, pattern)) { < Gcat(gpath, d_name); < globcnt++; < } --- > while ((dp = readdir(dirp)) != NULL) { > if (dp->d_ino == 0) > continue; > if (match(dp->d_name, pattern)) { > Gcat(gpath, dp->d_name); > globcnt++; 202c196 < close(dirf); --- > closedir(dirp); 205c199,201 < patherr: --- > patherr1: > closedir(dirp); > patherr2: 207,217d202 < } < < copdent(to, from) < register char *to, *from; < { < register int cnt = MAXNAMLEN; < < do < *to++ = *from++; < while (--cnt); < *to = 0; ---------------------------------------------------------------------- diff sh.h.wrong sh.h.right 19d20 < #define KERNEL 20d22 < #undef KERNEL