- if (res != FR_OK) LEAVE_FF(dj.fs, res);
-
- INITBUF(dj, sfn, lfn);
- res = follow_path(&dj, path); /* Follow the file path */
- if (res == FR_OK) res = FR_EXIST; /* Any file or directory is already existing */
- if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT))
- res = FR_INVALID_NAME;
- if (res != FR_NO_FILE) /* Any error occured */
- LEAVE_FF(dj.fs, res);
-
- dclst = create_chain(dj.fs, 0); /* Allocate a new cluster for new directory table */
- res = FR_OK;
- if (dclst == 0) res = FR_DENIED;
- if (dclst == 1) res = FR_INT_ERR;
- if (dclst == 0xFFFFFFFF) res = FR_DISK_ERR;
- if (res == FR_OK)
- res = move_window(dj.fs, 0);
- if (res != FR_OK) LEAVE_FF(dj.fs, res);
- dsect = clust2sect(dj.fs, dclst);
-
- dir = dj.fs->win; /* Initialize the new directory table */
- mem_set(dir, 0, SS(dj.fs));
- mem_set(dir+DIR_Name, ' ', 8+3); /* Create "." entry */
- dir[DIR_Name] = '.';
- dir[DIR_Attr] = AM_DIR;
- tim = get_fattime();
- ST_DWORD(dir+DIR_WrtTime, tim);
- ST_WORD(dir+DIR_FstClusLO, dclst);
- ST_WORD(dir+DIR_FstClusHI, dclst >> 16);
- mem_cpy(dir+32, dir, 32); /* Create ".." entry */
- dir[33] = '.';
- pclst = dj.sclust;
- if (dj.fs->fs_type == FS_FAT32 && pclst == dj.fs->dirbase)
- pclst = 0;
- ST_WORD(dir+32+DIR_FstClusLO, pclst);
- ST_WORD(dir+32+DIR_FstClusHI, pclst >> 16);
- for (n = 0; n < dj.fs->csize; n++) { /* Write dot entries and clear left sectors */
- dj.fs->winsect = dsect++;
- dj.fs->wflag = 1;
- res = move_window(dj.fs, 0);
- if (res) LEAVE_FF(dj.fs, res);
- mem_set(dir, 0, SS(dj.fs));
- }
-
- res = dir_register(&dj);
- if (res != FR_OK) {
- remove_chain(dj.fs, dclst);
- } else {
- dir = dj.dir;
- dir[DIR_Attr] = AM_DIR; /* Attribute */
- ST_DWORD(dir+DIR_WrtTime, tim); /* Crated time */
- ST_WORD(dir+DIR_FstClusLO, dclst); /* Table start cluster */
- ST_WORD(dir+DIR_FstClusHI, dclst >> 16);
- dj.fs->wflag = 1;
- res = sync(dj.fs);
+ if (res == FR_OK) {
+ INIT_BUF(dj);
+ res = follow_path(&dj, path); /* Follow the file path */
+ if (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */
+ if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT))
+ res = FR_INVALID_NAME;
+ if (res == FR_NO_FILE) { /* Can create a new directory */
+ dcl = create_chain(dj.fs, 0); /* Allocate a cluster for the new directory table */
+ res = FR_OK;
+ if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */
+ if (dcl == 1) res = FR_INT_ERR;
+ if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR;
+ if (res == FR_OK) /* Flush FAT */
+ res = move_window(dj.fs, 0);
+ if (res == FR_OK) { /* Initialize the new directory table */
+ dsc = clust2sect(dj.fs, dcl);
+ dir = dj.fs->win;
+ mem_set(dir, 0, SS(dj.fs));
+ mem_set(dir+DIR_Name, ' ', 8+3); /* Create "." entry */
+ dir[DIR_Name] = '.';
+ dir[DIR_Attr] = AM_DIR;
+ ST_DWORD(dir+DIR_WrtTime, tim);
+ ST_WORD(dir+DIR_FstClusLO, dcl);
+ ST_WORD(dir+DIR_FstClusHI, dcl >> 16);
+ mem_cpy(dir+32, dir, 32); /* Create ".." entry */
+ dir[33] = '.'; pcl = dj.sclust;
+ if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase)
+ pcl = 0;
+ ST_WORD(dir+32+DIR_FstClusLO, pcl);
+ ST_WORD(dir+32+DIR_FstClusHI, pcl >> 16);
+ for (n = dj.fs->csize; n; n--) { /* Write dot entries and clear following sectors */
+ dj.fs->winsect = dsc++;
+ dj.fs->wflag = 1;
+ res = move_window(dj.fs, 0);
+ if (res != FR_OK) break;
+ mem_set(dir, 0, SS(dj.fs));
+ }
+ }
+ if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */
+ if (res != FR_OK) {
+ remove_chain(dj.fs, dcl); /* Could not register, remove cluster chain */
+ } else {
+ dir = dj.dir;
+ dir[DIR_Attr] = AM_DIR; /* Attribute */
+ ST_DWORD(dir+DIR_WrtTime, tim); /* Created time */
+ ST_WORD(dir+DIR_FstClusLO, dcl); /* Table start cluster */
+ ST_WORD(dir+DIR_FstClusHI, dcl >> 16);
+ dj.fs->wflag = 1;
+ res = sync(dj.fs);
+ }
+ }
+ FREE_BUF();