[BACK]Return to fdesc_vnops.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / miscfs / fdesc

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/miscfs/fdesc/fdesc_vnops.c between version 1.106 and 1.107

version 1.106, 2009/03/15 17:22:37 version 1.107, 2009/05/24 21:41:26
Line 276  fdesc_lookup(void *v)
Line 276  fdesc_lookup(void *v)
         struct lwp *l = curlwp;          struct lwp *l = curlwp;
         const char *pname = cnp->cn_nameptr;          const char *pname = cnp->cn_nameptr;
         struct proc *p = l->l_proc;          struct proc *p = l->l_proc;
         filedesc_t *fdp = p->p_fd;  
         int numfiles = fdp->fd_nfiles;  
         unsigned fd = 0;          unsigned fd = 0;
         int error;          int error;
         struct vnode *fvp;          struct vnode *fvp;
         const char *ln;          const char *ln;
           fdtab_t *dt;
   
           dt = curlwp->l_fd->fd_dt;
   
         if (cnp->cn_namelen == 1 && *pname == '.') {          if (cnp->cn_namelen == 1 && *pname == '.') {
                 *vpp = dvp;                  *vpp = dvp;
Line 370  fdesc_lookup(void *v)
Line 371  fdesc_lookup(void *v)
                 fd = 0;                  fd = 0;
                 while (*pname >= '0' && *pname <= '9') {                  while (*pname >= '0' && *pname <= '9') {
                         fd = 10 * fd + *pname++ - '0';                          fd = 10 * fd + *pname++ - '0';
                         if (fd >= numfiles)                          if (fd >= dt->dt_nfiles)
                                 break;                                  break;
                 }                  }
   
Line 379  fdesc_lookup(void *v)
Line 380  fdesc_lookup(void *v)
                         goto bad;                          goto bad;
                 }                  }
   
                 mutex_enter(&fdp->fd_lock);                  if (fd >= dt->dt_nfiles || dt->dt_ff[fd] == NULL ||
                 if (fd >= numfiles ||fdp->fd_ofiles[fd] == NULL ||                      dt->dt_ff[fd]->ff_file == NULL) {
                     fdp->fd_ofiles[fd]->ff_file == NULL) {  
                         mutex_exit(&fdp->fd_lock);  
                         error = EBADF;                          error = EBADF;
                         goto bad;                          goto bad;
                 }                  }
                 mutex_exit(&fdp->fd_lock);  
   
                 error = fdesc_allocvp(Fdesc, FD_DESC+fd, dvp->v_mount, &fvp);                  error = fdesc_allocvp(Fdesc, FD_DESC+fd, dvp->v_mount, &fvp);
                 if (error)                  if (error)
Line 650  fdesc_readdir(void *v)
Line 648  fdesc_readdir(void *v)
         } */ *ap = v;          } */ *ap = v;
         struct uio *uio = ap->a_uio;          struct uio *uio = ap->a_uio;
         struct dirent d;          struct dirent d;
         filedesc_t *fdp;  
         off_t i;          off_t i;
         int j;          int j;
         int error;          int error;
         off_t *cookies = NULL;          off_t *cookies = NULL;
         int ncookies;          int ncookies;
           fdtab_t *dt;
   
         switch (VTOFDESC(ap->a_vp)->fd_type) {          switch (VTOFDESC(ap->a_vp)->fd_type) {
         case Fctty:          case Fctty:
Line 668  fdesc_readdir(void *v)
Line 666  fdesc_readdir(void *v)
                 break;                  break;
         }          }
   
         fdp = curproc->p_fd;          dt = curlwp->l_fd->fd_dt;
   
         if (uio->uio_resid < UIO_MX)          if (uio->uio_resid < UIO_MX)
                 return EINVAL;                  return EINVAL;
Line 709  fdesc_readdir(void *v)
Line 707  fdesc_readdir(void *v)
                         case FD_STDIN:                          case FD_STDIN:
                         case FD_STDOUT:                          case FD_STDOUT:
                         case FD_STDERR:                          case FD_STDERR:
                                 if (fdp == NULL)  
                                         continue;  
                                 if ((ft->ft_fileno - FD_STDIN) >=                                  if ((ft->ft_fileno - FD_STDIN) >=
                                     fdp->fd_nfiles)                                      dt->dt_nfiles)
                                         continue;                                          continue;
                                 membar_consumer();                                  if (dt->dt_ff[ft->ft_fileno - FD_STDIN]
                                 if (fdp->fd_ofiles[ft->ft_fileno - FD_STDIN]                                      == NULL || dt->dt_ff[ft->ft_fileno -
                                     == NULL || fdp->fd_ofiles[ft->ft_fileno -  
                                     FD_STDIN]->ff_file == NULL)                                      FD_STDIN]->ff_file == NULL)
                                         continue;                                          continue;
                                 break;                                  break;
Line 733  fdesc_readdir(void *v)
Line 728  fdesc_readdir(void *v)
                                 *cookies++ = i + 1;                                  *cookies++ = i + 1;
                 }                  }
         } else {          } else {
                 int nfdp = fdp ? fdp->fd_nfiles : 0;  
                 membar_consumer();                  membar_consumer();
                 if (ap->a_ncookies) {                  if (ap->a_ncookies) {
                         ncookies = min(ncookies, nfdp + 2);                          ncookies = min(ncookies, dt->dt_nfiles + 2);
                         cookies = malloc(ncookies * sizeof(off_t),                          cookies = malloc(ncookies * sizeof(off_t),
                             M_TEMP, M_WAITOK);                              M_TEMP, M_WAITOK);
                         *ap->a_cookies = cookies;                          *ap->a_cookies = cookies;
                         *ap->a_ncookies = ncookies;                          *ap->a_ncookies = ncookies;
                 }                  }
                 for (; i - 2 < nfdp && uio->uio_resid >= UIO_MX; i++) {                  for (; i - 2 < dt->dt_nfiles && uio->uio_resid >= UIO_MX; i++) {
                         switch (i) {                          switch (i) {
                         case 0:                          case 0:
                         case 1:                          case 1:
Line 754  fdesc_readdir(void *v)
Line 748  fdesc_readdir(void *v)
                                 break;                                  break;
   
                         default:                          default:
                                 KASSERT(fdp != NULL);  
                                 j = (int)i - 2;                                  j = (int)i - 2;
                                 if (fdp == NULL || fdp->fd_ofiles[j] == NULL ||                                  if (dt->dt_ff[j] == NULL ||
                                     fdp->fd_ofiles[j]->ff_file == NULL)                                      dt->dt_ff[j]->ff_file == NULL)
                                         continue;                                          continue;
                                 d.d_fileno = j + FD_STDIN;                                  d.d_fileno = j + FD_STDIN;
                                 d.d_namlen = sprintf(d.d_name, "%d", j);                                  d.d_namlen = sprintf(d.d_name, "%d", j);

Legend:
Removed from v.1.106  
changed lines
  Added in v.1.107

CVSweb <webmaster@jp.NetBSD.org>