/* * 生成文件。该程序将硬盘中文件系统之后的附加文件数据读取出来,并以 * 文件形式写入文件系统。关于附加文件数据参见mkfs。NOTE! 这是一个重 * 要的函数,在这些调试函数中占有重要地位,千万别删除它,谨慎修改, * 保持与mkfs同步! */ void produce_files(unsigned char dev) { struct addition * psadd;/* 附加数据的格式说明数据结构指针 */ unsigned long nrblock; /* 要读取的硬盘块号,硬盘块从0编号 */ struct buffer_head * bh; FILEDESC desc; char filename[256] = "/"; char buff[BUFFER_SIZE] = {0}; int i, onewc, leftc;/* onewc: 一次写入字节数,leftc: 剩余字节数 */ unsigned short oldfs; nrblock = super.size; psadd = (struct addition *)buff; /* 不停读取附加数据块,生成文件 */ while(1) { bh = bread(dev, nrblock++); memcpy(buff, bh->p_data, BUFFER_SIZE); brelse(bh); /* 处理文件对应的第一个硬盘块 */ if(!psadd->fileflag) break; i = sizeof(struct addition); /* filename[0] -- '/' */ memcpy(&filename[1], &buff[i], psadd->namelen); filename[psadd->namelen+1] = 0; oldfs = set_fs_kernel(); desc = sys_creat(filename, FILE_FILE | FILE_RW); set_fs(oldfs); i += psadd->namelen; leftc = psadd->datalen; onewc = BUFFER_SIZE-i; onewc = onewc>leftc ? leftc : onewc; leftc -= onewc; oldfs = set_fs_kernel(); sys_write(desc, &buff[i], onewc); set_fs(oldfs); /* 处理文件数据对应的后续硬盘块 */ while(leftc) { onewc = BUFFER_SIZE; onewc = onewc>leftc ? leftc : onewc; leftc -= onewc; bh = bread(dev, nrblock++); oldfs = set_fs_kernel(); sys_write(desc, bh->p_data, onewc); set_fs(oldfs); brelse(bh); } sys_close(desc); } }
int rdr_save_8m(const char *dir, const char *name, char *postfix, const void *address, u32 length) { int fd; long bytes; mm_segment_t old_fs; char xname[RDR_FNAME_LEN] = {0}; if (NULL == dir || NULL == name || postfix == NULL) { pr_err("rdr:%s():file name and dir shouldnt null\n", __func__); return -1; } if ((strlen((const char *)dir) + strlen((const char *)name) + strlen(postfix) + 1) >= RDR_FNAME_LEN) { pr_err("rdr:%s():error:dir is too long, exit.\n", __func__); return -1; } old_fs = get_fs(); set_fs(KERNEL_DS); memset(xname, 0, sizeof(xname)); snprintf(xname, sizeof(xname), "%s%s/", dir, name); rdr_create_dir(xname); memset(xname, 0, sizeof(xname)); snprintf(xname, sizeof(xname), "%s%s/%s.bin", dir, name, postfix); fd = sys_creat(xname, 0644); if (fd < 0) { pr_err("rdr:%s():create file %s err.\n", __func__, xname); set_fs(old_fs); return -1; } bytes = sys_write((unsigned int)fd, (const char *)address, length); if ((u32)bytes != length) { DUMP_LOG((int)bytes); rdr_file_close(fd); set_fs(old_fs); return -1; } sys_fsync(fd); rdr_file_close(fd); set_fs(old_fs); pr_info("rdr:save file %s success ...", xname); return 0; }
bool syscall(uint32_t sysno, uint32_t *args) { uint8_t *readbuf = (uint8_t *)args[1]; switch (sysno) { case SYS_EXIT: sys_exit((uint32_t)args[0]); break; case SYS_OPEN: Return = sys_open((uint8_t *)args[0], (uint32_t)args[1]); printf("fd = %d\n", Return); break; case SYS_CLOSE: Return = sys_close((uint32_t)args[0]); break; case SYS_READ: readbuf = sys_read((uint32_t)args[0], (uint8_t *)args[1], (uint32_t)args[2]); printf("always read buf:%s\n", readbuf); break; case SYS_WRITE: Return = sys_write((uint32_t)args[0], (uint8_t *)args[1], (uint32_t)args[2]); break; case SYS_KILL: sys_kill((uint32_t)args[0], (uint32_t)args[1]); break; case SYS_MALLOC: ReturnVoid = sys_malloc((uint32_t)args[0]); break; case SYS_FREE: sys_free((uint8_t *)args[0]); break; case SYS_CREAT: Return = sys_creat((uint8_t *)args[0], (uint32_t)args[1]); break; case SYS_LSEEK: sys_lseek((uint32_t)args[0], (uint32_t)args[1], (uint32_t)args[2]); break; default: // Error sysno break; } return true; }
/* Note: it is necessary to treat mode as an unsigned int, * with the corresponding cast to a signed int to insure that the * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) * and the register representation of a signed int (msr in 64-bit mode) is performed. */ asmlinkage long compat_sys_creat(const char __user * pathname, u32 mode) { return sys_creat(pathname, (int)mode); }
int wsys_creat(const smb_ucs2_t *wfname, mode_t mode) { pstring fname; return sys_creat(unicode_to_unix(fname,wfname,sizeof(fname)), mode); }
int bsp_om_save_loop_file(char * dirName, char *fileHeader, void * address, u32 length) { int ret = BSP_OK; int fd; int bytes; mm_segment_t old_fs; char newFileName[OM_DUMP_FILE_NAME_LENGTH] = {0}; /* 进入目录 */ if (NULL == dirName || NULL == fileHeader) { om_error("<bsp_om_save_loop_file>, file name NULL!\n"); return BSP_ERROR; } if ((strlen((const char*)dirName) + strlen((const char*)fileHeader)) >= OM_DUMP_FILE_NAME_LENGTH) { om_error("<bsp_om_save_loop_file>, file name too long!\n"); return BSP_ERROR; } old_fs = get_fs(); set_fs(KERNEL_DS); fd = om_open_dir(dirName); if(fd < 0) { om_error("<bsp_om_save_loop_file>, open om dir failed! ret = %d\n", ret); ret = BSP_ERROR; goto out; } ret = om_clear_old_file(fd, fileHeader); if(BSP_OK != ret) { om_error("<bsp_om_save_loop_file>, clear old file failed! ret = %d\n", ret); ret = BSP_ERROR; goto out; } om_close_dir(fd); //新文件名:0 memset(newFileName, 0, sizeof(newFileName)); snprintf(newFileName, sizeof(newFileName), "%s%s%02d.bin", dirName, fileHeader, 0); fd = sys_creat(newFileName, 0755); if(fd < 0) { om_error("<bsp_om_save_loop_file>, creat file failed! ret = %d\n", ret); ret = BSP_ERROR; goto out; } bytes = sys_write(fd, address, length); if(bytes != length) { om_error("<bsp_om_save_loop_file>, write data to file failed! ret = %d\n", bytes); ret = BSP_ERROR; (void)sys_close(fd); goto out; } ret = sys_close(fd); if(0 != ret) { om_error("<bsp_om_save_loop_file>, close file failed! ret = %d\n", ret); ret = BSP_ERROR; goto out; } ret = BSP_OK; out: set_fs(old_fs); return ret; }
} void creat_lseek_read_write_open_close_file_test(void) { int count = 0; char buff_in[100] = "Hello world!\nI'm writing a small OS.\nThanks."; char buff_out[100] = {0}; char filename[50] = {0}; unsigned short oldfs; /* 已创建了内核默认的最多磁盘存储文件数,则停止 */ while((++count) < NR_D_INODE) { _k_printf("This is the content will be written: \n%s\n\n", buff_in); sprintf(filename, "/hello--%d.txt", count); _k_printf("%s\n", filename); /* 创建文件并写入 */ oldfs = set_fs_kernel(); FILEDESC desc = sys_creat(filename, FILE_FILE | FILE_RW); set_fs(oldfs); if(-1 == desc) { k_printf("creat_lseek_...: Create file failed!"); return; } d_printf("Create file return.\n"); if(-1 == sys_lseek(desc, 995920, SEEK_SET)) { k_printf("creat_lseek_...: Lseek file failed!"); return; } d_printf("Lseek file return.\n"); oldfs = set_fs_kernel(); if(-1 == sys_write(desc, buff_in, 1 + strlen(buff_in))) { set_fs(oldfs); k_printf("creat_lseek_...: Write file failed!"); return; } set_fs(oldfs); d_printf("Write file return.\n"); if(-1 == sys_close(desc)) { k_printf("creat_lseek_...: Close file failed!"); return; } d_printf("Close file return.\n"); /* 打印根目录含有的文件 */ print_dir("/"); /* 打开之前创建的文件,读取 */ oldfs = set_fs_kernel(); if(-1 == (desc = sys_open(filename, O_RW))) { set_fs(oldfs); k_printf("creat_lseek_...: Open file failed!"); return; } set_fs(oldfs); d_printf("Open file return.\n"); if(-1 == sys_lseek(desc, 995920, SEEK_SET)) { k_printf("creat_lseek_...: Lseek file failed!"); return; } d_printf("Lseek file return.\n"); oldfs = set_fs_kernel(); if(-1 == sys_read(desc, buff_out, 1 + strlen(buff_in))) { set_fs(oldfs); k_printf("creat_lseek_...: Read file failed!"); return; } set_fs(oldfs); d_printf("Read file return.\n"); if(-1 == sys_close(desc)) { k_printf("creat_lseek_...: Close file failed!"); return; } d_printf("Close file return.\n"); _k_printf("This is the content of READ file: \n%s\n\n", buff_out);
/* * Will be obsoleted ... */ int rdr_save_file(const char *dir, const char *file_header, const void *address, u32 length) { int fd, ret; long bytes; mm_segment_t old_fs; char new_filename[RDR_FNAME_LEN] = {0}; if (NULL == dir || NULL == file_header) { DUMP_LOG(0); return -1; } if ((strlen((const char *)dir) + strlen((const char *)file_header)) >= RDR_FNAME_LEN) { DUMP_LOG(0); return -1; } old_fs = get_fs(); set_fs(KERNEL_DS); fd = rdr_open_dir(dir); if (fd < 0) { DUMP_LOG(fd); set_fs(old_fs); return -1; } ret = del_old_file(dir, file_header, (unsigned int)fd, file_header); if (0 != ret) { DUMP_LOG(ret); rdr_file_close(fd); set_fs(old_fs); return -1; } rdr_file_close(fd); memset(new_filename, 0, sizeof(new_filename)); snprintf(new_filename, sizeof(new_filename), "%s%s%02d.bin", dir, file_header, 0); fd = sys_creat(new_filename, 0644); if (fd < 0) { DUMP_LOG(fd); set_fs(old_fs); return -1; } bytes = sys_write((unsigned int)fd, (const char *)address, length); if ((u32)bytes != length) { DUMP_LOG((int)bytes); rdr_file_close(fd); set_fs(old_fs); return -1; } sys_fsync(fd); rdr_file_close(fd); set_fs(old_fs); pr_info("rdr:save file %s success ...", new_filename); return 0; }