예제 #1
0
int main(int argc, char *argv[])
{
  // 局部变量
  char buf[SECSIZE];
  // FAT表表头标记
  uchar fatStartContent[8] = {0xf8,0xff,0xff,0x0f,0xff,0xff,0xff,0xff};
  struct direntry dire;
  uint dirClusNum;  // 为文件分配的簇号
  uint wClusNum;  // 根目录簇号
  uint fileSize;  // 文件大小
  uint cc, fd;  // cc一次读取文件的字节数,打开文件的fd
  int rootWSize = 0;  // 已向根目录写入的字节数
  int fileWSize = 0;  // 已向文件中写入的字节数
  char filename[FNSIZE]; // 文件名
  int i;

  static_assert(sizeof(int) == 4, "Integers must be 4 bytes!");

  if(argc < 2){
    fprintf(stderr, "Usage: mkfs fs.img files...\n");
    exit(1);
  }

  initDat();

  // 是否有需要断言
  // ?

  fsfd = open(argv[1], O_RDWR|O_CREAT|O_TRUNC, 0666);
  if(fsfd < 0){
    perror(argv[1]);
    exit(1);
  }

  printf("DBR : %d, retain sectors: %d, FAT sector: %d, 2 FATs, data sectors: %d, clusters: %d", 
    nDBR, nRetain, nFAT, nData, nDataClus);

  // 清零fs
  for(i = 0; i < FSSIZE; i++)
    szero(i);

  // 向第0扇区写入DBR
  initDBR();
  memset(buf, 0, sizeof(buf));
  memmove(buf, &fatDBR, sizeof(fatDBR));
  wsect(0, buf);

  // 写入FAT表头标记
  rsect4bytes(fatFstSec, 0, fatStartContent);
  rsect4bytes(fatFstSec, 1, fatStartContent + 4);

  // 写入根目录
  dire = mkFCB(T_DIR, "/", sizeof(DIR)*argc, &dirClusNum);
  dirClusNum = appendBuf(dirClusNum, &dire, sizeof(DIR), rootWSize);
  rootWSize += sizeof(DIR);
  wClusNum = dirClusNum;

  dire = mkFCB(T_DIR, ".", sizeof(DIR)*argc, &dirClusNum);
  wClusNum = appendBuf(wClusNum, &dire, sizeof(DIR), rootWSize);
  rootWSize += sizeof(DIR);

  dire = mkFCB(T_DIR, "..", 0, &dirClusNum);
  wClusNum = appendBuf(wClusNum, &dire, sizeof(DIR), rootWSize);
  rootWSize += sizeof(DIR);

  // 写入其他文件
  for(i = 2; i < argc; i++){
    fileWSize = 0;
    assert(index(argv[i], '/') == 0);

    fileSize = retFileSize(argv[i]);

    if((fd = open(argv[i], 0)) < 0){
      perror(argv[i]);
      exit(1);
    }
    
    if(argv[i][0] == '_')
      ++argv[i];

    // 写到目录区
    strncpy(filename, argv[i], FNSIZE);
    dire = mkFCB(T_FILE, filename, fileSize, &dirClusNum);
    wClusNum = appendBuf(wClusNum, &dire, sizeof(DIR), rootWSize);
    rootWSize += sizeof(DIR);

    // 写入文件
    while((cc = read(fd, buf, sizeof(buf))) > 0)
    {
      dirClusNum = appendBuf(dirClusNum, buf, cc, fileWSize);
      fileWSize += cc;
    }

    close(fd);
  }

  // 向第1扇区写入FSI
  initFSI();
  memset(buf, 0, sizeof(buf));
  memmove(buf, &fsi, sizeof(fsi));
  wsect(1, buf);
  // 向备份FAT中写入相同的内容
  for(i = fatFstSec; i < fatFstSec + nFAT; i++) {
    rsect(i, buf);
    wsect((i+nFAT), buf);
  }
  // // fix size of root inode dir
  // rinode(rootino, &din);
  // off = xint(din.size);
  // off = ((off/BSIZE) + 1) * BSIZE;
  // din.size = xint(off);
  // winode(rootino, &din);
  // balloc(freeblock);
  exit(0);
}
예제 #2
0
 void appendStruct(const T& s) {
     appendBuf(&s, sizeof(T));
 }