Пример #1
0
/**
  * @brief  write date into a the sdcard file. 
  * @param  
           *data: pointer to the date to be writen.
		    cnt : length of the data.
			*filename: the name of saving file. 
  * @retval None
  */
void Write_Warn_Date(void  *data)
{ 
  int warn_count = 0;
	
	block_size = 8;

	if(f_mount(0, &fs) != FR_OK) return;
  
	if(f_open(&warn_fdst, "warn.dat", /*FA_CREATE_ALWAYS |*/ FA_WRITE) != FR_OK){
	  f_open(&warn_fdst, "warn.dat", FA_CREATE_NEW | FA_WRITE);
		 f_chmod("warn.dat", AM_MASK, AM_HID);
	}else{
	  warn_count = (warn_fdst.fsize)/block_size - 1;
  }
	
	if(warn_count >= ALARM_MESSAGE_CAP){
    f_lseek(&warn_fdst, block_size*(warn_ops + 1));
		warn_ops++;
		if(ALARM_MESSAGE_CAP == warn_ops) warn_ops = 0;
  }else{		
	  f_lseek(&warn_fdst, block_size*(warn_count + 1));
		warn_ops = 0;
	}   
	f_write(&warn_fdst, (void*)(data), block_size, &bw);
	
	f_lseek(&warn_fdst, 0);
	f_write(&warn_fdst, (void*)(&warn_ops), 1, &bw);
	
	f_close(&warn_fdst);
  f_mount(0, NULL); 
}
Пример #2
0
bool TestExtFile::test_chown() {
  Variant f = f_fopen("test/test_ext_file.tmp", "w");
  f_fputs(f, "testing\nchown\n");
  f_fclose(f);
  VERIFY(f_chmod("test/test_ext_file.txt", 0777));
  //VERIFY(f_chown("test/test_ext_file.tmp", "hzhao"));
  f_unlink("test/test_ext_file.tmp");
  return Count(true);
}
Пример #3
0
void OnChangeAttribute(nwazetMessageContext_t* nmc){
  uint8_t res = (uint8_t) FR_OK;
  uint8_t attribute = 0;
  uint8_t attributeMask = 0;
  uint8_t isTextASCII = 0;
  uint16_t textLength = 0;
  const char* objName = (const char*)GetStringReference(nmc->cmdContext, &textLength, &isTextASCII);
  Get(nmc->cmdContext, (void*)&attribute, sizeof(attribute));
  Get(nmc->cmdContext, (void*)&attributeMask, sizeof(attributeMask));
  if(objName && isTextASCII){
    res = fsCheckSuccess(__func__, "f_chmod", f_chmod(objName, attribute, attributeMask), objName);
    StartResponse(nmc, res, true);
    return;
  }
  res = FR_INVALID_NAME;
  fsCheckSuccess(__func__, "objName", res, objName);
  StartResponse(nmc, res, true);
}
Пример #4
0
/**
 * @brief fatfs_attrib set the attribs on a file
 * @param fc the current FAT session
 * @param filename an existing file
 * @param attrib a string with the attributes. i.e., "RHS"
 * @return 0 on success
 */
int fatfs_attrib(struct block_cache *output, off_t block_offset, const char *filename, const char *attrib)
{
    MAYBE_MOUNT(output, block_offset);

    BYTE mode = 0;
    while (*attrib) {
        switch (*attrib++) {
        case 'S':
        case 's':
            mode |= AM_SYS;
            break;
        case 'H':
        case 'h':
            mode |= AM_HID;
            break;
        case 'R':
        case 'r':
            mode |= AM_RDO;
            break;
        }
    }
    CHECK("fat_attrib", filename, f_chmod(filename, mode, AM_RDO | AM_HID | AM_SYS));
    return 0;
}
Пример #5
0
Файл: Road.c Проект: rmnsfx/Pion
long rod_CreateFile_edit (void)
{

  s32 i = 0;  		
	FIL Fil;
	FIL Fil2;
	FRESULT result;	
	FATFS   fls;          
	FILINFO fno;
	long res = 0;
	char t_str[25];
	

	__disable_irq();
	__disable_fiq(); 
	
	IWDG_ReloadCounter();
	
	res = f_mount(&fls, "0:", 1);
				
	res = f_open(&Fil,"0:Road.0", FA_CREATE_ALWAYS | FA_WRITE);	
	f_printf(&Fil,"%s", "без маршрута   ");		
	f_putc(0,&Fil);
	
		
//	f_open(&Fil,"0:Road.000", FA_OPEN_ALWAYS | FA_WRITE);	
//	f_lseek(&Fil, 16);
	
	for(i=1;i<500;i++)
	{
			{
					f_printf(&Fil,"%s %03u      ","точка",i);				
					f_putc(i,&Fil);
	
			}									
	}		
	//Получаем размер 
	res = f_size(&Fil);		
	f_close(&Fil);

	IWDG_ReloadCounter();	
	
	//Только чтение
	f_chmod("0:Road.0", AM_RDO, AM_RDO | AM_ARC);	
	
	f_open(&Fil,"0:Road.log", FA_CREATE_ALWAYS | FA_WRITE);
	f_printf(&Fil,"%s", "Road.0");
	f_close(&Fil);
	
	f_open(&Fil2,"0:Roads.txt", FA_CREATE_ALWAYS | FA_WRITE);
	f_printf(&Fil2,"%s", "Road.0");
	f_close(&Fil2);	

	
//	//Проверяем размер 
//	f_open(&Fil,"0:Road.100", FA_OPEN_ALWAYS);				
//	//if (f_size(&Fil) == 16000) res = 1;			
//	res = f_size(&Fil);
//	f_close(&Fil);	
	
	f_mount(0,"0:", 0);	
	
	__enable_irq();
	__enable_fiq();
	
  return res;		 
}
/*******************************************************************************
* FUNCTION: xFSSetReadOnlyFlag
*
* PARAMETERS:
* ~ szFileName      - The path to the file that we want to check.
* ~ ucReadOnlyFlag  - The read only flag.
*
* RETURN:
* ~ Error code.
*
* DESCRIPTIONS:
* Set the read only flag of a file.
*
*******************************************************************************/
FRESULT xFSSetReadOnlyFlag(const char *szFileName, unsigned char ucReadOnlyFlag)
{
    return f_chmod(szFileName, ucReadOnlyFlag, AM_RDO);
}
Пример #7
0
bool TestExtFile::test_is_executable() {
  VERIFY(f_chmod("test/test_ext_file.txt", 0777));
  VERIFY(f_is_executable("test/test_ext_file.txt"));
  return Count(true);
}
Пример #8
0
bool TestExtFile::test_chmod() {
  VERIFY(f_chmod("test/test_ext_file.txt", 0777));
  return Count(true);
}
Пример #9
0
int InstallData(char* drive){
	FIL firmfile;
	char* progressbar = "[       ]";
	char* progress = progressbar+1;
	print("%s", progressbar);  ConsolePrevLine();
	
	//Create the workdir
	sprintf(tmpstr, "%s:%s", drive, DATAFOLDER);
	f_mkdir(tmpstr);
	f_chmod(tmpstr, AM_HID, AM_HID);
	
	//Read firmware data
	if(f_open(&firmfile, "firmware.bin", FA_READ | FA_OPEN_EXISTING) == FR_OK){
		//... We'll see
	}else return CONF_NOFIRMBIN;
	*progress++ = '.'; DrawString(BOT_SCREEN, progressbar, 130, 50, ConsoleGetTextColor(), ConsoleGetBackgroundColor());
	
	//Create patched native_firm
	f_read(&firmfile, WORKBUF, NAT_SIZE, &tmpu32);
	u8* n_firm = decryptFirmTitle(WORKBUF, NAT_SIZE, 0x00000002);
	u8* n_firm_patch = GetFilePack("nat_patch.bin");
	applyPatch(n_firm, n_firm_patch);
	u8 keyx[16] = {0};
	if(GetSystemVersion() < 3){
		FileOpen(&tempfile, KEYFILENAME, 0);
		FileRead(&tempfile, &keyx[0], 16, 0);
		FileClose(&tempfile);
	}
	*progress++ = '.'; DrawString(BOT_SCREEN, progressbar, 130, 50, ConsoleGetTextColor(), ConsoleGetBackgroundColor());
	for(int i = 0; i < NAT_SIZE; i+=0x4){
		if(!strcmp((char*)n_firm + i, "Shit")){
			if(1){
				memcpy((char*)n_firm + i, rxmode_emu_label, 4);
			}else{
				memcpy((char*)n_firm + i, rxmode_sys_label , 4);
			}
		}
		if(!strcmp((char*)n_firm + i, "InsertKeyXHere!") && keyx[0] != 0){
			memcpy(n_firm + i, keyx, 16);
		}
		if(*((unsigned int*)(n_firm + i)) == 0xAAAABBBB){
			*((unsigned int*)(n_firm + i)) = (checkEmuNAND() / 0x200) - 1;
		}
	}
	*progress++ = '.'; DrawString(BOT_SCREEN, progressbar, 130, 50, ConsoleGetTextColor(), ConsoleGetBackgroundColor());
	sprintf(tmpstr, "%s:%s/0004013800000002.bin", drive, DATAFOLDER);
	if(FileOpen(&tempfile, tmpstr, 1)){
		FileWrite(&tempfile, n_firm, NAT_SIZE, 0);
		FileClose(&tempfile);
		//FileCopy("0004013800000002.bin", tmpstr);
	}else return CONF_ERRNFIRM;
	*progress++ = '.'; DrawString(BOT_SCREEN, progressbar, 130, 50, ConsoleGetTextColor(), ConsoleGetBackgroundColor());
	
	//Create AGB patched firmware
	f_read(&firmfile, WORKBUF, AGB_SIZE, &tmpu32);
	u8* a_firm = decryptFirmTitle(WORKBUF, AGB_SIZE, 0x00000202);
	u8* a_firm_patch = GetFilePack("agb_patch.bin");
	if(a_firm){
		applyPatch(a_firm, a_firm_patch);
		sprintf(tmpstr, "%s:%s/0004013800000202.bin", drive, DATAFOLDER);
		if(FileOpen(&tempfile, tmpstr, 1)){
			FileWrite(&tempfile, a_firm, AGB_SIZE, 0);
			FileClose(&tempfile);
		}else return CONF_ERRNFIRM;
		*progress++ = '.';
	}else{	
		//If we cannot decrypt it from firmware.bin becouse of titlekey messed up, it probably means that AGB has been modified in some way.
		//So we read it from his installed ncch...
		FindApp(0x00040138, 0x00000202, 1);
		char* path = getContentAppPath();
		FileOpen(&tempfile, path, 0);
		FileRead(&tempfile, WORKBUF, AGB_SIZE, 0);
		FileClose(&tempfile);
		a_firm = decryptFirmTitleNcch(WORKBUF, AGB_SIZE);
		if(a_firm){
			applyPatch(a_firm, a_firm_patch);
			sprintf(tmpstr, "%s:%s/0004013800000202.bin", drive, DATAFOLDER);
			if(FileOpen(&tempfile, tmpstr, 1)){
				FileWrite(&tempfile, a_firm, AGB_SIZE, 0);
				FileClose(&tempfile);
			}else return CONF_ERRNFIRM;
			*progress++ = '.';
		}else{
			*progress++ = 'x'; //If we get here, then we'll play without AGB, lol
		}
	}
	DrawString(BOT_SCREEN, progressbar, 130, 50, ConsoleGetTextColor(), ConsoleGetBackgroundColor());
	
	//Create TWL patched firmware
	f_read(&firmfile, WORKBUF, TWL_SIZE, &tmpu32);
	u8* t_firm = decryptFirmTitle(WORKBUF, TWL_SIZE, 0x00000102);
	u8* t_firm_patch = GetFilePack("twl_patch.bin");
	if(t_firm){
		applyPatch(t_firm, t_firm_patch);
		sprintf(tmpstr, "%s:%s/0004013800000102.bin", drive, DATAFOLDER);
		if(FileOpen(&tempfile, tmpstr, 1)){
			FileWrite(&tempfile, t_firm, TWL_SIZE, 0);
			FileClose(&tempfile);
			//FileCopy("0004013800000102.bin", tmpstr);
		}else return CONF_ERRNFIRM;
		*progress++ = '.'; 
	}else{
		*progress++ = 'x'; 
	}
	DrawString(BOT_SCREEN, progressbar, 130, 50, ConsoleGetTextColor(), ConsoleGetBackgroundColor());
	
	sprintf(tmpstr, "%s:%s/data.bin", drive, DATAFOLDER);
	if(FileOpen(&tempfile, tmpstr, 1)){
		FileWrite(&tempfile, __DATE__, 12, 0);
		FileWrite(&tempfile, __TIME__, 9, 12);
		FileClose(&tempfile);
	}else return CONF_CANTOPENFILE;
	*progress++ = '.'; DrawString(BOT_SCREEN, progressbar, 130, 50, ConsoleGetTextColor(), ConsoleGetBackgroundColor());
	
	f_close(&firmfile);
	return 0;
}
Пример #10
0
FRESULT DFATFS::fschmod(const char* path, uint8_t value, uint8_t mask)
{
    return(f_chmod(path, value, mask));
}
Пример #11
0
static msg_t ThreadFatFSWorker(void *arg) {
    (void)arg;

    Thread* p;

    chRegSetThreadName("fatfsWorker");
    while (!chThdShouldTerminate()) {

        /* Wait for msg with work to do. */
        p = chMsgWait();


        struct wrapper_msg_base* msg = (struct wrapper_msg_base*) chMsgGet(p);

        msg->result = FR_INVALID_PARAMETER;

        switch(msg->action) {

        case eTERMINATE: {
            break;
        }

#if HAS_MOUNT
        case eFMOUNT: {
            const struct wrapper_msg_vBYTEpFATFS* exmsg = \
                    (const struct wrapper_msg_vBYTEpFATFS*) msg;
            msg->result = f_mount(exmsg->byte, exmsg->fatfsp);
            break;
        }
#endif /* HAS_MOUNT */

#if HAS_OPEN
        case eFOPEN: {
            const struct wrapper_msg_pFILpTCHARvBYTE* exmsg = \
                    (const struct wrapper_msg_pFILpTCHARvBYTE*) msg;

            msg->result = f_open(exmsg->filep, exmsg->string, exmsg->byte);
            break;
        }
#endif /* HAS_OPEN */

#if HAS_READ
        case eFREAD: {
            const struct wrapper_msg_pFILpVOIDvUINTpUINT* exmsg = \
                    (const struct wrapper_msg_pFILpVOIDvUINTpUINT*) msg;

            msg->result = f_read(exmsg->filep, exmsg->voidp, exmsg->uint,
                                 exmsg->uintp);
            break;
        }
#endif /* HAS_READ */

#if HAS_WRITE
        case eFWRITE: {
            const struct wrapper_msg_pFILpVOIDvUINTpUINT* exmsg = \
                    (const struct wrapper_msg_pFILpVOIDvUINTpUINT*) msg;
            msg->result = f_write(exmsg->filep, exmsg->voidp, exmsg->uint,
                                  exmsg->uintp);
            break;
        }
#endif /* HAD_WRITE */

#if HAS_SYNC
        case eFSYNC: {
            const struct wrapper_msg_pFIL* exmsg = \
                                                   (const struct wrapper_msg_pFIL*) msg;
            msg->result = f_sync(exmsg->filep);
            break;
        }
#endif /* HAS_SYNC */

#if HAS_CHDRIVE
        case eFCHDRIVE: {
            const struct wrapper_msg_vBYTE* exmsg = \
                                                    (const struct wrapper_msg_vBYTE*) msg;
            msg->result = f_chdrive(exmsg->byte);
            break;
        }
#endif

#if HAS_CHDIR
        case eFCHDIR: {
            const struct wrapper_msg_pTCHAR* exmsg = \
                    (const struct wrapper_msg_pTCHAR*) msg;

            msg->result = f_chdir(exmsg->string);
            break;
        }
#endif /* HAS_CHDIR */

#if HAS_GETCWD
        case eFGETCWD: {
            const struct wrapper_msg_pTCHARvUINT* exmsg = \
                    (const struct wrapper_msg_pTCHARvUINT*) msg;
            msg->result = f_getcwd(exmsg->string, exmsg->uint);
            break;
        }
#endif

#if HAS_LSEEK
        case eFLSEEK: {
            const struct wrapper_msg_pFILvDWORD* exmsg = \
                    (const struct wrapper_msg_pFILvDWORD*) msg;
            msg->result = f_lseek(exmsg->filep, exmsg->dword);
            break;
        }
#endif /* HAS_LSEEK */

#if HAS_CLOSE
        case eFCLOSE: {
            const struct wrapper_msg_pFIL* exmsg = \
                                                   (const struct wrapper_msg_pFIL*) msg;
            msg->result = f_close(exmsg->filep);
            break;
        }
#endif /* HAS_CLOSE */

#if HAS_OPENDIR
        case eFOPENDIR: {
            const struct wrapper_msg_pDIRpTCHAR* exmsg = \
                    (const struct wrapper_msg_pDIRpTCHAR*) msg;
            msg->result = f_opendir(exmsg->dirp, exmsg->string);
            break;
        }
#endif /* HAD_OPENDIR */

#if HAS_READDIR
        case eFREADDIR: {
            const struct wrapper_msg_pDIRpFILINFO* exmsg = \
                    (const struct wrapper_msg_pDIRpFILINFO*) msg;
            msg->result = f_readdir(exmsg->dirp, exmsg->filinfop);
            break;
        }
#endif /* HAS_READDIR */

#if HAS_STAT
        case eFSTAT: {
            const struct wrapper_msg_pTCHARpFILINFO* exmsg = \
                    (const struct wrapper_msg_pTCHARpFILINFO*) msg;
            msg->result = f_stat(exmsg->string, exmsg->filinfop);
            break;
        }
#endif /* HAS_STAT */

#if HAS_GETFREE
        case eFGETFREE: {
            const struct wrapper_msg_pTCHARpDWORDppFATFS* exmsg = \
                    (const struct wrapper_msg_pTCHARpDWORDppFATFS*) msg;
            msg->result = f_getfree(exmsg->string, exmsg->dwordp, exmsg->fatfspp);
            break;
        }
#endif /* HAS_GETFREE */

#if HAS_TRUNCATE
        case eFTRUNCATE: {
            const struct wrapper_msg_pFIL* exmsg = \
                                                   (const struct wrapper_msg_pFIL*) msg;
            msg->result = f_truncate(exmsg->filep);
            break;
        }
#endif /* HAS_TRUNCATE */

#if HAS_UNLINK
        case eFUNLINK: {
            const struct wrapper_msg_pTCHAR* exmsg = \
                    (const struct wrapper_msg_pTCHAR*) msg;
            msg->result = f_unlink(exmsg->string);
            break;
        }
#endif /* HAS_UNLINK */

#if HAS_MKDIR
        case eFMKDIR: {
            const struct wrapper_msg_pTCHAR* exmsg = \
                    (const struct wrapper_msg_pTCHAR*) msg;
            msg->result = f_mkdir(exmsg->string);
            break;
        }
#endif /* HAS_MKDIR */

#if HAS_CHMOD
        case eFCHMOD: {
            const struct wrapper_msg_pTCHARvBYTEvBYTE* exmsg = \
                    (const struct wrapper_msg_pTCHARvBYTEvBYTE*) msg;
            msg->result = f_chmod(exmsg->string, exmsg->byte1, exmsg->byte2);
            break;
        }
#endif /* HAS_CHMOD */

#if HAS_UTIME
        case eFUTIME: {
            const struct wrapper_msg_pTCHARpFILINFO* exmsg = \
                    (const struct wrapper_msg_pTCHARpFILINFO*) msg;
            msg->result = f_utime(exmsg->string, exmsg->filinfop);
            break;
        }
#endif /* HAD_UTIME */

#if HAS_RENAME
        case eFRENAME: {
            const struct wrapper_msg_pTCHARpTCHAR* exmsg = \
                    (const struct wrapper_msg_pTCHARpTCHAR*) msg;

            msg->result = f_rename(exmsg->string1, exmsg->string2);
            break;
        }
#endif /* HAS_RENAME */

#if HAS_MKFS
        case eFMKFS: {
            const struct wrapper_msg_vBYTEvBYTEvUINT* exmsg = \
                    (const struct wrapper_msg_vBYTEvBYTEvUINT*) msg;
            msg->result = f_mkfs(exmsg->byte1, exmsg->byte2, exmsg->uint);
            break;
        }
#endif /* HAS_MKFS */

#if HAS_FDISK
        case eFFDISK: {
            const struct wrapper_msg_vBYTEpDWORDpVOID* exmsg = \
                    (const struct wrapper_msg_vBYTEpDWORDpVOID*) msg;
            msg->result = f_fdisk(exmsg->byte, exmsg->dwordp, exmsg->voidp);
            break;
        }
#endif /* HAS_FDISK */

#if HAS_GETS
        case eFGETS: {
            struct wrapper_msg_pTCHARvINTpFILpTCHAR* exmsg = \
                    (struct wrapper_msg_pTCHARvINTpFILpTCHAR*) msg;

            exmsg->string2 = f_gets(exmsg->string, exmsg->n, exmsg->filep);
            break;
        }
#endif /* HAS_GETS */

#if HAS_PUTC
        case eFPUTC: {
            const struct wrapper_msg_vTCHARpFIL* exmsg = \
                    (const struct wrapper_msg_vTCHARpFIL*) msg;

            msg->result = f_putc(exmsg->tchar, exmsg->filep);
            break;
        }
#endif /* HAS_PUTC */

#if HAS_PUTS
        case eFPUTS: {
            const struct wrapper_msg_pTCHARpFIL* exmsg = \
                    (const struct wrapper_msg_pTCHARpFIL*) msg;

            msg->result = f_puts(exmsg->string, exmsg->filep);
            break;
        }
#endif /* HAS_PUTS */

        }

        /* Done, release msg again. */
        chMsgRelease(p, 0);
    }

    return 0;
}
Пример #12
0
static int runCommand(int argc, char ** argv)
{
    int i, sectors;

    DIR rootDir;
    FILINFO info;

    char * filename;

    FIL    intFileObj;
    FILE * extFileObj;

    UINT bytesRead, bytesWritten;

    // What command?
    if (strcmp(argv[2], "mkfs") == 0)
    {
        // Get sector count
        if (argc != 4)
            return printUsage();

        sectors = atoi(argv[3]);

        // Validate sector count
        if (sectors <= 0)
        {
            fputs("Sector Count must be > 0\n", stderr);
            return 1;
        }

        sectorCount = (DWORD) sectors;

        // Write 0s for the image
        memset(buffer, 0, SECTOR_SIZE);
        for (i = 0; i < sectors; i++)
        {
            if (disk_write(0, buffer, i, 1) != RES_OK)
                return 1;
        }

        // Make filesystem
        if (f_mkfs(0, 1, 0) != FR_OK)
        {
            fputs("mkfs failed\n", stderr);
            return 1;
        }
    }
    else if (strcmp(argv[2], "ls") == 0)
    {
        // Get directory to list
        if (argc > 4)
            return printUsage();

        // Open directory
        if (f_opendir(&rootDir, (argc == 4) ? argv[3] : "") != FR_OK)
        {
            fputs("opendir failed (directory exists?)\n", stderr);
            return 1;
        }

        // Set long file name buffer
        info.lfname = (char *) buffer;
        info.lfsize = BUFFER_SIZE;

        // List contents
        while (f_readdir(&rootDir, &info) == FR_OK && info.fname[0] != 0)
        {
            // Get filename
            filename = *info.lfname ? info.lfname : info.fname;

            // Print attributes
            printf((info.fattrib & AM_RDO) ? "r" : " ");
            printf((info.fattrib & AM_HID) ? "h" : " ");
            printf((info.fattrib & AM_SYS) ? "s" : " ");
            printf((info.fattrib & AM_DIR) ? "d" : " ");
            printf((info.fattrib & AM_ARC) ? "a" : " ");

            // Print filename
            printf(" %s\n", filename);
        }
    }
    else if (strcmp(argv[2], "rm") == 0)
    {
        // Get filename
        if (argc != 4)
            return printUsage();

        filename = argv[3];

        // Make file writable
        f_chmod(filename, 0, AM_RDO);

        // Remove file
        if (f_unlink(filename) != FR_OK)
        {
            fputs("unlink failed (file exists?)\n", stderr);
            return 1;
        }
    }
    else if (strcmp(argv[2], "mkdir") == 0)
    {
        // Get filename
        if (argc != 4)
            return printUsage();

        filename = argv[3];

        // Create directory
        if (f_mkdir(filename) != FR_OK)
        {
            fputs("mkdir failed\n", stderr);
            return 1;
        }
    }
    else if (strcmp(argv[2], "read") == 0)
    {
        // Get both files
        if (argc != 5)
            return printUsage();

        // Open both files
        if (f_open(&intFileObj, argv[3], FA_READ) != FR_OK)
        {
            fputs("internal open failed (file exists?)\n", stderr);
            return 1;
        }

        extFileObj = fopen(argv[4], "wb");
        if (extFileObj == NULL)
        {
            perror("external open failed\n");
            f_close(&intFileObj);
            return 1;
        }

        // Copy data
        do
        {
            // Internal read
            if (f_read(&intFileObj, buffer, BUFFER_SIZE, &bytesRead) != FR_OK)
            {
                fputs("internal read failed\n", stderr);
                fclose(extFileObj);
                f_close(&intFileObj);
                return 1;
            }

            // External write
            if (fwrite(buffer, 1, bytesRead, extFileObj) != bytesRead)
            {
                perror("external write failed\n");
                fclose(extFileObj);
                f_close(&intFileObj);
                return 1;
            }
        }
        while (bytesRead == BUFFER_SIZE);

        // Close files
        fclose(extFileObj);
        f_close(&intFileObj);
    }
    else if (strcmp(argv[2], "write") == 0)
    {
        // Get both files
        if (argc != 5)
            return printUsage();

        // Open both files
        if (f_open(&intFileObj, argv[3], FA_WRITE | FA_CREATE_ALWAYS) != FR_OK)
        {
            fputs("internal open failed\n", stderr);
            return 1;
        }

        extFileObj = fopen(argv[4], "rb");
        if (extFileObj == NULL)
        {
            perror("external open failed (file exists?)");
            f_close(&intFileObj);
            return 1;
        }

        // Copy data
        do
        {
            // External read
            bytesRead = fread(buffer, 1, BUFFER_SIZE, extFileObj);
            if (bytesRead != BUFFER_SIZE && !feof(extFileObj))
            {
                fputs("external read failed\n", stderr);
                fclose(extFileObj);
                f_close(&intFileObj);
                return 1;
            }

            // Internal write
            if (f_write(&intFileObj, buffer, bytesRead, &bytesWritten) != FR_OK ||
                    bytesRead != bytesWritten)
            {
                fputs("internal write failed\n", stderr);
                fclose(extFileObj);
                f_close(&intFileObj);
                return 1;
            }
        }
        while (bytesRead == BUFFER_SIZE);

        // Close files
        fclose(extFileObj);
        f_close(&intFileObj);
    }
    else
    {
        // Bad command
        return printUsage();
    }

    return 0;
}
Пример #13
0
int fatfs_stat(vnode_t * vnode, struct stat * buf)
{
    struct fatfs_sb * ffsb = get_ffsb_of_sb(vnode->sb);
    struct fatfs_inode * in = get_inode_of_vnode(vnode);
    FILINFO fno;
    struct stat mp_stat = { .st_uid = 0, .st_gid = 0 };
    size_t blksize = ffsb->ff_fs.ssize;
    int err;

    memset(&fno, 0, sizeof(fno));

    err = get_mp_stat(vnode, &mp_stat);
    if (err) {
        if (err == -EINPROGRESS) {
#ifdef configFATFS_DEBUG
            KERROR(KERROR_WARN, "vnode->sb->mountpoint should be set\n");
#endif
        } else {
#ifdef configFATFS_DEBUG
            KERROR(KERROR_WARN,
                   "get_mp_stat() returned error (%d)\n",
                   err);
#endif

            return err;
        }
    }

    /* Can't stat FAT root */
    if (vnode == vnode->sb->root) {
        memcpy(buf, &mp_stat, sizeof(struct stat));

        return 0;
    }

    err = f_stat(&ffsb->ff_fs, in->in_fpath, &fno);
    if (err) {
#ifdef configFATFS_DEBUG
        KERROR(KERROR_DEBUG,
                 "f_stat(fs %p, fpath \"%s\", fno %p) failed\n",
                 &ffsb->ff_fs, in->in_fpath, &fno);
#endif
        return fresult2errno(err);
    }

    buf->st_dev = vnode->sb->vdev_id;
    buf->st_ino = vnode->vn_num;
    buf->st_mode = vnode->vn_mode;
    buf->st_nlink = 1; /* Always one link on FAT. */
    buf->st_uid = mp_stat.st_uid;
    buf->st_gid = mp_stat.st_gid;
    buf->st_size = fno.fsize;
    /* TODO Times */
#if 0
    buf->st_atim;
    buf->st_mtim;
    buf->st_ctim;
    buf->st_birthtime;
#endif
    buf->st_flags = fattrib2uflags(fno.fattrib);
    buf->st_blksize = blksize;
    buf->st_blocks = fno.fsize / blksize + 1; /* Best guess. */

    return 0;
}

int fatfs_chmod(vnode_t * vnode, mode_t mode)
{
    struct fatfs_sb * ffsb = get_ffsb_of_sb(vnode->sb);
    struct fatfs_inode * in = get_inode_of_vnode(vnode);
    uint8_t attr = 0;
    const uint8_t mask = AM_RDO;
    int err;

    if (!(mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
        attr |= AM_RDO;

    err = fresult2errno(f_chmod(&ffsb->ff_fs, in->in_fpath, attr, mask));
    if (!err)
        vnode->vn_mode = mode;

    return err;
}

/*
 * Note: Thre is practically two ways to set AM_RDO, either
 * by using chmod() or by this chflags().
 */
int fatfs_chflags(vnode_t * vnode, fflags_t flags)
{
    struct fatfs_sb * ffsb = get_ffsb_of_sb(vnode->sb);
    struct fatfs_inode * in = get_inode_of_vnode(vnode);
    uint8_t attr = 0;
    const uint8_t mask = AM_RDO | AM_ARC | AM_SYS | AM_HID;
    FRESULT fresult;

    if (flags & UF_SYSTEM)
        attr |= AM_SYS;
    if (flags & UF_ARCHIVE)
        attr |= AM_ARC;
    if (flags & UF_READONLY)
        attr |= AM_RDO;
    if (flags & UF_HIDDEN)
        attr |= AM_HID;

    fresult = f_chmod(&ffsb->ff_fs, in->in_fpath, attr, mask);

    return fresult2errno(fresult);
}

/**
 * Initialize fatfs vnode data.
 * @param vnode is the target vnode to be initialized.
 */
static void init_fatfs_vnode(vnode_t * vnode, ino_t inum, mode_t mode,
                             long vn_hash, struct fs_superblock * sb)
{
    struct stat stat;

#ifdef configFATFS_DEBUG
    KERROR(KERROR_DEBUG,
           "init_fatfs_vnode(vnode %p, inum %l, mode %o, vn_hash %u, sb %p)\n",
           vnode, (uint64_t)inum, mode, (uint32_t)vn_hash, sb);
#endif

    fs_vnode_init(vnode, inum, sb, &fatfs_vnode_ops);

    vnode->vn_hash = vn_hash;

    if (S_ISDIR(mode))
        mode |= S_IRWXU | S_IXGRP | S_IXOTH;
    vnode->vn_mode = mode | S_IRUSR | S_IRGRP | S_IROTH;
    fatfs_stat(vnode, &stat);
    vnode->vn_len = stat.st_size;
    if ((stat.st_flags & UF_READONLY) == 0)
        vnode->vn_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
}

/**
 * Get mountpoint stat.
 */
static int get_mp_stat(vnode_t * vnode, struct stat * st)
{
     struct fs_superblock * sb;
     vnode_t * mp;

#ifdef configFATFS_DEBUG
    KASSERT(vnode, "Vnode was given");
    KASSERT(vnode->sb, "Superblock is set");
#endif

    sb = vnode->sb;
    mp = sb->mountpoint;

    if (!mp) {
        /* We are probably mounting and mountpoint is not yet set. */
#ifdef configFATFS_DEBUG
        KERROR(KERROR_DEBUG, "mp not set\n");
#endif
        return -EINPROGRESS;
    }

#ifdef configFATFS_DEBUG
    KASSERT(mp->vnode_ops->stat, "stat() is defined");
#endif

    return mp->vnode_ops->stat(mp, st);
}

static int fresult2errno(int fresult)
{
    switch (fresult) {
    case FR_DISK_ERR:
    case FR_INVALID_OBJECT:
    case FR_INT_ERR:
        return -EIO;
    case FR_NOT_ENABLED:
        return -ENODEV;
    case FR_NO_FILESYSTEM:
        return -ENXIO;
    case FR_NO_FILE:
    case FR_NO_PATH:
        return -ENOENT;
    case FR_DENIED:
        return -EACCES;
    case FR_EXIST:
        return -EEXIST;
    case FR_WRITE_PROTECTED:
        return -EPERM;
    case FR_NOT_READY:
        return -EBUSY;
    case FR_INVALID_NAME:
    case FR_INVALID_DRIVE:
    case FR_MKFS_ABORTED:
    case FR_INVALID_PARAMETER:
        return -EINVAL;
    case FR_TIMEOUT:
        return -EWOULDBLOCK;
    case FR_NOT_ENOUGH_CORE:
        return -ENOMEM;
    case FR_TOO_MANY_OPEN_FILES:
        return -ENFILE;
    default:
        if (fresult != 0) /* Unknown error */
            return -EIO;
    }

    return 0;
}
Пример #14
0
FRESULT FatFs::chmod(const char* path, uint8_t value, uint8_t mask)
{
    return f_chmod(path, value, mask);
}