S_ESIX.C
上传用户:yeshiping1
上传日期:2007-01-06
资源大小:29k
文件大小:3k
源码类别:

磁盘编程

开发平台:

Others

  1. /* This file contains system-specific functions for ESIX.
  2.  * The program pfdisk.c calls these routines.
  3.  * Note that ESIX can't use the generic Sys.V/386 version of
  4.  * this file because it uses ioctl calls to access the
  5.  * primary boot sector.  Other systems provide a device which
  6.  * maps onto the whole disk (starting with the boot sector).
  7.  */
  8. #include <stdio.h>
  9. #include <fcntl.h>
  10. #include <sys/types.h>
  11. #include <sys/vtoc.h>
  12. #define extern
  13. #include "sysdep.h"
  14. #undef extern
  15. int usage(prog) /* print a usage message */
  16. char *prog; /* program name */
  17. {
  18.   fprintf(stderr,"Usage: %s devnt%sn", prog,
  19.   "where 'dev' is the device name, i.e. /dev/rdsk/0s0");
  20. }
  21. void getGeometry(dev, c, h, s)
  22. char *dev; /* device name */
  23. unsigned *c,*h,*s; /* cyls, heads, sectors */
  24. {
  25.   int devfd, retval;
  26.   struct disk_parms dp;
  27.   
  28.   devfd = open(dev, O_RDONLY, 0);
  29.   if (devfd < 0) {
  30.     fprintf(stderr,"%s: can't open for readingn", dev);
  31.     return;
  32.   }
  33.   retval = ioctl(devfd, V_GETPARMS, &dp);
  34.   close(devfd);
  35.   if (retval < 0) {
  36.     fprintf(stderr,"%s: can't get disk parametersn", dev);
  37.     return;
  38.   }
  39.   if (dp.dp_type != DPT_WINI) {
  40.     fprintf(stderr,"%s: not a Winchester Diskn", dev);
  41.     return;
  42.   }
  43.   *c = dp.dp_cyls;
  44.   *h = dp.dp_heads;
  45.   *s = dp.dp_sectors;
  46. }
  47. int getFile(name, buf, len) /* read file into buffer */
  48. char *name, *buf;
  49. int len;
  50. { /* (open, read, close) */
  51.   int devfd, retval;
  52.   
  53.   devfd = open(name, O_RDONLY, 0);
  54.   if (devfd < 0) {
  55.     fprintf(stderr,"%s: can't open for readingn", name);
  56.     return(devfd);
  57.   }
  58.   retval = read(devfd, buf, len);
  59.   if (retval < 0)
  60.     fprintf(stderr,"%s: read failedn", name);
  61.   close(devfd);
  62.   return(retval);
  63. }
  64. int putFile(name, buf, len) /* write buffer to file */
  65. char *name, *buf;
  66. int len;
  67. { /* (open, write, close) */
  68.   int devfd, retval;
  69.   
  70.   devfd = open(name, O_WRONLY|O_CREAT, 0666);
  71.   if (devfd < 0) {
  72.     fprintf(stderr,"%s: can't open for writingn", name);
  73.     return(devfd);
  74.   }
  75.   retval = write(devfd, buf, len);
  76.   if (retval < 0)
  77.     fprintf(stderr,"%s: write failedn", name);
  78.   close(devfd);
  79.   return(retval);
  80. }
  81. int getBBlk(name, buf) /* read Boot Block into buffer */
  82. char *name, *buf;
  83. { /* (open, read, close) */
  84.   int devfd, retval;
  85.   struct absio abs;
  86.   
  87.   devfd = open(name, O_RDONLY, 0);
  88.   if (devfd < 0) {
  89.     fprintf(stderr,"%s: can't open for readingn", name);
  90.     return(devfd);
  91.   }
  92.   abs.abs_sec = 0; /* the primary boot sector */
  93.   abs.abs_buf = buf;
  94.   retval = ioctl(devfd, V_RDABS, &abs);
  95.   if (retval < 0)
  96.     fprintf(stderr,"%s: read failedn", name);
  97.   close(devfd);
  98.   return(retval);
  99. }
  100. int putBBlk(name, buf) /* write buffer to Boot Block */
  101. char *name, *buf;
  102. { /* (open, write, close) */
  103.   int devfd, retval;
  104.   struct absio abs;
  105.   
  106.   devfd = open(name, O_WRONLY, 0);
  107.   if (devfd < 0) {
  108.     fprintf(stderr,"%s: can't open for writingn", name);
  109.     return(devfd);
  110.   }
  111.   abs.abs_sec = 0; /* the primary boot sector */
  112.   abs.abs_buf = buf;
  113.   retval = ioctl(devfd, V_WRABS, &abs);
  114.   if (retval < 0)
  115.     fprintf(stderr,"%s: write failedn", name);
  116.   close(devfd);
  117.   return(retval);
  118. }