359 fdinfo.pr_fileflags <<= 16;
360 fdinfo.pr_fileflags |= fp->f_flag;
361 if ((fdinfo.pr_fileflags & (FSEARCH | FEXEC)) == 0)
362 fdinfo.pr_fileflags += FOPEN;
363 fdinfo.pr_offset = fp->f_offset;
364
365
366 fvp = fp->f_vnode;
367 VN_HOLD(fvp);
368 UF_EXIT(ufp);
369 mutex_exit(&fip->fi_lock);
370
371 /*
372 * There are some vnodes that have no corresponding
373 * path. Its reasonable for this to fail, in which
374 * case the path will remain an empty string.
375 */
376 (void) vnodetopath(vroot, fvp, fdinfo.pr_path,
377 sizeof (fdinfo.pr_path), credp);
378
379 error = VOP_GETATTR(fvp, &vattr, 0, credp, NULL);
380 if (error != 0) {
381 VN_RELE(fvp);
382 VN_RELE(vroot);
383 goto done;
384 }
385
386 if (fvp->v_type == VSOCK)
387 fdinfo.pr_fileflags |= sock_getfasync(fvp);
388
389 VN_RELE(fvp);
390
391 /*
392 * This logic mirrors fstat(), which we cannot use
393 * directly, as it calls copyout().
394 */
395 fdinfo.pr_major = getmajor(vattr.va_fsid);
396 fdinfo.pr_minor = getminor(vattr.va_fsid);
397 fdinfo.pr_ino = (ino64_t)vattr.va_nodeid;
398 fdinfo.pr_mode = VTTOIF(vattr.va_type) | vattr.va_mode;
399 fdinfo.pr_uid = vattr.va_uid;
400 fdinfo.pr_gid = vattr.va_gid;
401 fdinfo.pr_rmajor = getmajor(vattr.va_rdev);
402 fdinfo.pr_rminor = getminor(vattr.va_rdev);
403 fdinfo.pr_size = (off64_t)vattr.va_size;
|
359 fdinfo.pr_fileflags <<= 16;
360 fdinfo.pr_fileflags |= fp->f_flag;
361 if ((fdinfo.pr_fileflags & (FSEARCH | FEXEC)) == 0)
362 fdinfo.pr_fileflags += FOPEN;
363 fdinfo.pr_offset = fp->f_offset;
364
365
366 fvp = fp->f_vnode;
367 VN_HOLD(fvp);
368 UF_EXIT(ufp);
369 mutex_exit(&fip->fi_lock);
370
371 /*
372 * There are some vnodes that have no corresponding
373 * path. Its reasonable for this to fail, in which
374 * case the path will remain an empty string.
375 */
376 (void) vnodetopath(vroot, fvp, fdinfo.pr_path,
377 sizeof (fdinfo.pr_path), credp);
378
379 if (VOP_GETATTR(fvp, &vattr, 0, credp, NULL) != 0) {
380 /*
381 * Try to write at least a subset of information
382 */
383 fdinfo.pr_major = 0;
384 fdinfo.pr_minor = 0;
385 fdinfo.pr_ino = 0;
386 fdinfo.pr_mode = 0;
387 fdinfo.pr_uid = -1;
388 fdinfo.pr_gid = -1;
389 fdinfo.pr_rmajor = 0;
390 fdinfo.pr_rminor = 0;
391 fdinfo.pr_size = -1;
392
393 error = elfnote(vp, &offset, NT_FDINFO,
394 sizeof (fdinfo), &fdinfo,
395 rlimit, credp);
396 VN_RELE(fvp);
397 VN_RELE(vroot);
398 if (error)
399 goto done;
400 continue;
401 }
402
403 if (fvp->v_type == VSOCK)
404 fdinfo.pr_fileflags |= sock_getfasync(fvp);
405
406 VN_RELE(fvp);
407
408 /*
409 * This logic mirrors fstat(), which we cannot use
410 * directly, as it calls copyout().
411 */
412 fdinfo.pr_major = getmajor(vattr.va_fsid);
413 fdinfo.pr_minor = getminor(vattr.va_fsid);
414 fdinfo.pr_ino = (ino64_t)vattr.va_nodeid;
415 fdinfo.pr_mode = VTTOIF(vattr.va_type) | vattr.va_mode;
416 fdinfo.pr_uid = vattr.va_uid;
417 fdinfo.pr_gid = vattr.va_gid;
418 fdinfo.pr_rmajor = getmajor(vattr.va_rdev);
419 fdinfo.pr_rminor = getminor(vattr.va_rdev);
420 fdinfo.pr_size = (off64_t)vattr.va_size;
|