|
|
|
@ -1028,10 +1028,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size, |
|
|
|
|
if (retdent) { |
|
|
|
|
/* Update file size and start_cluster in a directory entry */ |
|
|
|
|
retdent->size = cpu_to_le32(size); |
|
|
|
|
start_cluster = FAT2CPU16(retdent->start); |
|
|
|
|
if (mydata->fatsize == 32) |
|
|
|
|
start_cluster |= |
|
|
|
|
(FAT2CPU16(retdent->starthi) << 16); |
|
|
|
|
start_cluster = START(retdent); |
|
|
|
|
|
|
|
|
|
ret = check_overflow(mydata, start_cluster, size); |
|
|
|
|
if (ret) { |
|
|
|
@ -1044,29 +1041,6 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size, |
|
|
|
|
printf("Error: clearing FAT entries\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ret = set_contents(mydata, retdent, buffer, size, actwrite); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
printf("Error: writing contents\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
debug("attempt to write 0x%llx bytes\n", *actwrite); |
|
|
|
|
|
|
|
|
|
/* Flush fat buffer */ |
|
|
|
|
ret = flush_fat_buffer(mydata); |
|
|
|
|
if (ret) { |
|
|
|
|
printf("Error: flush fat buffer\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Write directory table to device */ |
|
|
|
|
ret = set_cluster(mydata, dir_curclust, |
|
|
|
|
get_dentfromdir_block, |
|
|
|
|
mydata->clust_size * mydata->sect_size); |
|
|
|
|
if (ret) { |
|
|
|
|
printf("Error: writing directory entry\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
/* Set short name to set alias checksum field in dir_slot */ |
|
|
|
|
set_name(empty_dentptr, filename); |
|
|
|
@ -1088,31 +1062,29 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size, |
|
|
|
|
fill_dentry(mydata, empty_dentptr, filename, |
|
|
|
|
start_cluster, size, 0x20); |
|
|
|
|
|
|
|
|
|
ret = set_contents(mydata, empty_dentptr, buffer, size, |
|
|
|
|
actwrite); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
printf("Error: writing contents\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
debug("attempt to write 0x%llx bytes\n", *actwrite); |
|
|
|
|
retdent = empty_dentptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Flush fat buffer */ |
|
|
|
|
ret = flush_fat_buffer(mydata); |
|
|
|
|
if (ret) { |
|
|
|
|
printf("Error: flush fat buffer\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
ret = set_contents(mydata, retdent, buffer, size, actwrite); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
printf("Error: writing contents\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
debug("attempt to write 0x%llx bytes\n", *actwrite); |
|
|
|
|
|
|
|
|
|
/* Write directory table to device */ |
|
|
|
|
ret = set_cluster(mydata, dir_curclust, |
|
|
|
|
get_dentfromdir_block, |
|
|
|
|
mydata->clust_size * mydata->sect_size); |
|
|
|
|
if (ret) { |
|
|
|
|
printf("Error: writing directory entry\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
/* Flush fat buffer */ |
|
|
|
|
ret = flush_fat_buffer(mydata); |
|
|
|
|
if (ret) { |
|
|
|
|
printf("Error: flush fat buffer\n"); |
|
|
|
|
goto exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Write directory table to device */ |
|
|
|
|
ret = set_cluster(mydata, dir_curclust, get_dentfromdir_block, |
|
|
|
|
mydata->clust_size * mydata->sect_size); |
|
|
|
|
if (ret) |
|
|
|
|
printf("Error: writing directory entry\n"); |
|
|
|
|
|
|
|
|
|
exit: |
|
|
|
|
free(mydata->fatbuf); |
|
|
|
|
return ret; |
|
|
|
|