isosize.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:2k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)isosize.c 1.6 99/10/18 Copyright 1996 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)isosize.c 1.6 99/10/18 Copyright 1996 J. Schilling";
  5. #endif
  6. /*
  7.  * Copyright (c) 1996 J. Schilling
  8.  */
  9. /*
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  */
  24. #include <sys/types.h>
  25. #include <sys/stat.h>
  26. #include <statdefs.h>
  27. #include <unixstd.h>
  28. #include <standard.h>
  29. #include <utypes.h>
  30. #include <intcvt.h>
  31. #include "iso9660.h"
  32. long isosize __PR((int f));
  33. long
  34. isosize(f)
  35. int f;
  36. {
  37. struct iso9660_voldesc vd;
  38. struct iso9660_pr_voldesc *vp;
  39. long isize;
  40. struct stat sb;
  41. long mode;
  42. /*
  43.  * First check if a bad guy tries to call isosize()
  44.  * with an unappropriate file descriptor.
  45.  * return -1 in this case.
  46.  */
  47. if (isatty(f))
  48. return (-1L);
  49. if (fstat(f, &sb) < 0)
  50. return (-1L);
  51. mode = (long)(sb.st_mode & S_IFMT);
  52. if (!S_ISREG(mode) && !S_ISBLK(mode) && !S_ISCHR(mode))
  53. return (-1L);
  54. if (lseek(f, (off_t)(16L * 2048L), SEEK_SET) == -1)
  55. return (-1L);
  56. vp = (struct iso9660_pr_voldesc *) &vd;
  57. do {
  58. read(f, &vd, sizeof(vd));
  59. if (GET_UBYTE(vd.vd_type) == VD_PRIMARY)
  60. break;
  61. } while (GET_UBYTE(vd.vd_type) != VD_TERM);
  62. lseek(f, (off_t)0L, SEEK_SET);
  63. if (GET_UBYTE(vd.vd_type) != VD_PRIMARY)
  64. return (-1L);
  65. isize = GET_BINT(vp->vd_volume_space_size);
  66. isize *= GET_BSHORT(vp->vd_lbsize);
  67. return (isize);
  68. }