1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2002-2007 Aleph One Ltd.
5*4882a593Smuzhiyun * for Toby Churchill Ltd and Brightstar Engineering
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Created by Charles Manning <charles@aleph1.co.uk>
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify
10*4882a593Smuzhiyun * it under the terms of the GNU General Public License version 2 as
11*4882a593Smuzhiyun * published by the Free Software Foundation.
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun * yaffscfg.c The configuration for the "direct" use of yaffs.
16*4882a593Smuzhiyun *
17*4882a593Smuzhiyun * This is set up for u-boot.
18*4882a593Smuzhiyun *
19*4882a593Smuzhiyun * This version now uses the ydevconfig mechanism to set up partitions.
20*4882a593Smuzhiyun */
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #include <common.h>
23*4882a593Smuzhiyun #include <div64.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #include <config.h>
26*4882a593Smuzhiyun #include "nand.h"
27*4882a593Smuzhiyun #include "yaffscfg.h"
28*4882a593Smuzhiyun #include "yaffsfs.h"
29*4882a593Smuzhiyun #include "yaffs_packedtags2.h"
30*4882a593Smuzhiyun #include "yaffs_mtdif.h"
31*4882a593Smuzhiyun #include "yaffs_mtdif2.h"
32*4882a593Smuzhiyun #if 0
33*4882a593Smuzhiyun #include <errno.h>
34*4882a593Smuzhiyun #else
35*4882a593Smuzhiyun #include "malloc.h"
36*4882a593Smuzhiyun #endif
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun unsigned yaffs_trace_mask = 0x0; /* Disable logging */
39*4882a593Smuzhiyun static int yaffs_errno;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun
yaffs_bug_fn(const char * fn,int n)42*4882a593Smuzhiyun void yaffs_bug_fn(const char *fn, int n)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun printf("yaffs bug at %s:%d\n", fn, n);
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun
yaffsfs_malloc(size_t x)47*4882a593Smuzhiyun void *yaffsfs_malloc(size_t x)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun return malloc(x);
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun
yaffsfs_free(void * x)52*4882a593Smuzhiyun void yaffsfs_free(void *x)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun free(x);
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun
yaffsfs_SetError(int err)57*4882a593Smuzhiyun void yaffsfs_SetError(int err)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun yaffs_errno = err;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun
yaffsfs_GetLastError(void)62*4882a593Smuzhiyun int yaffsfs_GetLastError(void)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun return yaffs_errno;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun
yaffsfs_GetError(void)68*4882a593Smuzhiyun int yaffsfs_GetError(void)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun return yaffs_errno;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
yaffsfs_Lock(void)73*4882a593Smuzhiyun void yaffsfs_Lock(void)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
yaffsfs_Unlock(void)77*4882a593Smuzhiyun void yaffsfs_Unlock(void)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun
yaffsfs_CurrentTime(void)81*4882a593Smuzhiyun __u32 yaffsfs_CurrentTime(void)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun return 0;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun
yaffs_malloc(size_t size)86*4882a593Smuzhiyun void *yaffs_malloc(size_t size)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun return malloc(size);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun
yaffs_free(void * ptr)91*4882a593Smuzhiyun void yaffs_free(void *ptr)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun free(ptr);
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun
yaffsfs_LocalInitialisation(void)96*4882a593Smuzhiyun void yaffsfs_LocalInitialisation(void)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun /* No locking used */
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun
yaffs_file_type_str(struct yaffs_stat * stat)102*4882a593Smuzhiyun static const char *yaffs_file_type_str(struct yaffs_stat *stat)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun switch (stat->st_mode & S_IFMT) {
105*4882a593Smuzhiyun case S_IFREG: return "regular file";
106*4882a593Smuzhiyun case S_IFDIR: return "directory";
107*4882a593Smuzhiyun case S_IFLNK: return "symlink";
108*4882a593Smuzhiyun default: return "unknown";
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun
yaffs_error_str(void)112*4882a593Smuzhiyun static const char *yaffs_error_str(void)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun int error = yaffsfs_GetLastError();
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun if (error < 0)
117*4882a593Smuzhiyun error = -error;
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun switch (error) {
120*4882a593Smuzhiyun case EBUSY: return "Busy";
121*4882a593Smuzhiyun case ENODEV: return "No such device";
122*4882a593Smuzhiyun case EINVAL: return "Invalid parameter";
123*4882a593Smuzhiyun case ENFILE: return "Too many open files";
124*4882a593Smuzhiyun case EBADF: return "Bad handle";
125*4882a593Smuzhiyun case EACCES: return "Wrong permissions";
126*4882a593Smuzhiyun case EXDEV: return "Not on same device";
127*4882a593Smuzhiyun case ENOENT: return "No such entry";
128*4882a593Smuzhiyun case ENOSPC: return "Device full";
129*4882a593Smuzhiyun case EROFS: return "Read only file system";
130*4882a593Smuzhiyun case ERANGE: return "Range error";
131*4882a593Smuzhiyun case ENOTEMPTY: return "Not empty";
132*4882a593Smuzhiyun case ENAMETOOLONG: return "Name too long";
133*4882a593Smuzhiyun case ENOMEM: return "Out of memory";
134*4882a593Smuzhiyun case EFAULT: return "Fault";
135*4882a593Smuzhiyun case EEXIST: return "Name exists";
136*4882a593Smuzhiyun case ENOTDIR: return "Not a directory";
137*4882a593Smuzhiyun case EISDIR: return "Not permitted on a directory";
138*4882a593Smuzhiyun case ELOOP: return "Symlink loop";
139*4882a593Smuzhiyun case 0: return "No error";
140*4882a593Smuzhiyun default: return "Unknown error";
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun
cmd_yaffs_tracemask(unsigned set,unsigned mask)144*4882a593Smuzhiyun void cmd_yaffs_tracemask(unsigned set, unsigned mask)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun if (set)
147*4882a593Smuzhiyun yaffs_trace_mask = mask;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun printf("yaffs trace mask: %08x\n", yaffs_trace_mask);
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
yaffs_regions_overlap(int a,int b,int x,int y)152*4882a593Smuzhiyun static int yaffs_regions_overlap(int a, int b, int x, int y)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun return (a <= x && x <= b) ||
155*4882a593Smuzhiyun (a <= y && y <= b) ||
156*4882a593Smuzhiyun (x <= a && a <= y) ||
157*4882a593Smuzhiyun (x <= b && b <= y);
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
cmd_yaffs_devconfig(char * _mp,int flash_dev,int start_block,int end_block)160*4882a593Smuzhiyun void cmd_yaffs_devconfig(char *_mp, int flash_dev,
161*4882a593Smuzhiyun int start_block, int end_block)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun struct mtd_info *mtd = NULL;
164*4882a593Smuzhiyun struct yaffs_dev *dev = NULL;
165*4882a593Smuzhiyun struct yaffs_dev *chk;
166*4882a593Smuzhiyun char *mp = NULL;
167*4882a593Smuzhiyun struct nand_chip *chip;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun mtd = get_nand_dev_by_index(flash_dev);
170*4882a593Smuzhiyun if (!mtd) {
171*4882a593Smuzhiyun pr_err("\nno NAND devices available\n");
172*4882a593Smuzhiyun return;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun dev = calloc(1, sizeof(*dev));
176*4882a593Smuzhiyun mp = strdup(_mp);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun if (!dev || !mp) {
179*4882a593Smuzhiyun /* Alloc error */
180*4882a593Smuzhiyun printf("Failed to allocate memory\n");
181*4882a593Smuzhiyun goto err;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun if (flash_dev >= CONFIG_SYS_MAX_NAND_DEVICE) {
185*4882a593Smuzhiyun printf("Flash device invalid\n");
186*4882a593Smuzhiyun goto err;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun if (end_block == 0)
190*4882a593Smuzhiyun end_block = lldiv(mtd->size, mtd->erasesize - 1);
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun if (end_block < start_block) {
193*4882a593Smuzhiyun printf("Bad start/end\n");
194*4882a593Smuzhiyun goto err;
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun chip = mtd_to_nand(mtd);
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /* Check for any conflicts */
200*4882a593Smuzhiyun yaffs_dev_rewind();
201*4882a593Smuzhiyun while (1) {
202*4882a593Smuzhiyun chk = yaffs_next_dev();
203*4882a593Smuzhiyun if (!chk)
204*4882a593Smuzhiyun break;
205*4882a593Smuzhiyun if (strcmp(chk->param.name, mp) == 0) {
206*4882a593Smuzhiyun printf("Mount point name already used\n");
207*4882a593Smuzhiyun goto err;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun if (chk->driver_context == mtd &&
210*4882a593Smuzhiyun yaffs_regions_overlap(
211*4882a593Smuzhiyun chk->param.start_block, chk->param.end_block,
212*4882a593Smuzhiyun start_block, end_block)) {
213*4882a593Smuzhiyun printf("Region overlaps with partition %s\n",
214*4882a593Smuzhiyun chk->param.name);
215*4882a593Smuzhiyun goto err;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun /* Seems sane, so configure */
221*4882a593Smuzhiyun memset(dev, 0, sizeof(*dev));
222*4882a593Smuzhiyun dev->param.name = mp;
223*4882a593Smuzhiyun dev->driver_context = mtd;
224*4882a593Smuzhiyun dev->param.start_block = start_block;
225*4882a593Smuzhiyun dev->param.end_block = end_block;
226*4882a593Smuzhiyun dev->param.chunks_per_block = mtd->erasesize / mtd->writesize;
227*4882a593Smuzhiyun dev->param.total_bytes_per_chunk = mtd->writesize;
228*4882a593Smuzhiyun dev->param.is_yaffs2 = 1;
229*4882a593Smuzhiyun dev->param.use_nand_ecc = 1;
230*4882a593Smuzhiyun dev->param.n_reserved_blocks = 5;
231*4882a593Smuzhiyun if (chip->ecc.layout->oobavail < sizeof(struct yaffs_packed_tags2))
232*4882a593Smuzhiyun dev->param.inband_tags = 1;
233*4882a593Smuzhiyun dev->param.n_caches = 10;
234*4882a593Smuzhiyun dev->param.write_chunk_tags_fn = nandmtd2_write_chunk_tags;
235*4882a593Smuzhiyun dev->param.read_chunk_tags_fn = nandmtd2_read_chunk_tags;
236*4882a593Smuzhiyun dev->param.erase_fn = nandmtd_EraseBlockInNAND;
237*4882a593Smuzhiyun dev->param.initialise_flash_fn = nandmtd_InitialiseNAND;
238*4882a593Smuzhiyun dev->param.bad_block_fn = nandmtd2_MarkNANDBlockBad;
239*4882a593Smuzhiyun dev->param.query_block_fn = nandmtd2_QueryNANDBlock;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun yaffs_add_device(dev);
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun printf("Configures yaffs mount %s: dev %d start block %d, end block %d %s\n",
244*4882a593Smuzhiyun mp, flash_dev, start_block, end_block,
245*4882a593Smuzhiyun dev->param.inband_tags ? "using inband tags" : "");
246*4882a593Smuzhiyun return;
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun err:
249*4882a593Smuzhiyun free(dev);
250*4882a593Smuzhiyun free(mp);
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun
cmd_yaffs_dev_ls(void)253*4882a593Smuzhiyun void cmd_yaffs_dev_ls(void)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun struct yaffs_dev *dev;
256*4882a593Smuzhiyun int flash_dev;
257*4882a593Smuzhiyun int free_space;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun yaffs_dev_rewind();
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun while (1) {
262*4882a593Smuzhiyun dev = yaffs_next_dev();
263*4882a593Smuzhiyun if (!dev)
264*4882a593Smuzhiyun return;
265*4882a593Smuzhiyun flash_dev = nand_mtd_to_devnum(dev->driver_context);
266*4882a593Smuzhiyun printf("%-10s %5d 0x%05x 0x%05x %s",
267*4882a593Smuzhiyun dev->param.name, flash_dev,
268*4882a593Smuzhiyun dev->param.start_block, dev->param.end_block,
269*4882a593Smuzhiyun dev->param.inband_tags ? "using inband tags, " : "");
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun free_space = yaffs_freespace(dev->param.name);
272*4882a593Smuzhiyun if (free_space < 0)
273*4882a593Smuzhiyun printf("not mounted\n");
274*4882a593Smuzhiyun else
275*4882a593Smuzhiyun printf("free 0x%x\n", free_space);
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
make_a_file(char * yaffsName,char bval,int sizeOfFile)280*4882a593Smuzhiyun void make_a_file(char *yaffsName, char bval, int sizeOfFile)
281*4882a593Smuzhiyun {
282*4882a593Smuzhiyun int outh;
283*4882a593Smuzhiyun int i;
284*4882a593Smuzhiyun unsigned char buffer[100];
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun outh = yaffs_open(yaffsName,
287*4882a593Smuzhiyun O_CREAT | O_RDWR | O_TRUNC,
288*4882a593Smuzhiyun S_IREAD | S_IWRITE);
289*4882a593Smuzhiyun if (outh < 0) {
290*4882a593Smuzhiyun printf("Error opening file: %d. %s\n", outh, yaffs_error_str());
291*4882a593Smuzhiyun return;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun memset(buffer, bval, 100);
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun do {
297*4882a593Smuzhiyun i = sizeOfFile;
298*4882a593Smuzhiyun if (i > 100)
299*4882a593Smuzhiyun i = 100;
300*4882a593Smuzhiyun sizeOfFile -= i;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun yaffs_write(outh, buffer, i);
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun } while (sizeOfFile > 0);
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun yaffs_close(outh);
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun
read_a_file(char * fn)310*4882a593Smuzhiyun void read_a_file(char *fn)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun int h;
313*4882a593Smuzhiyun int i = 0;
314*4882a593Smuzhiyun unsigned char b;
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun h = yaffs_open(fn, O_RDWR, 0);
317*4882a593Smuzhiyun if (h < 0) {
318*4882a593Smuzhiyun printf("File not found\n");
319*4882a593Smuzhiyun return;
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun while (yaffs_read(h, &b, 1) > 0) {
323*4882a593Smuzhiyun printf("%02x ", b);
324*4882a593Smuzhiyun i++;
325*4882a593Smuzhiyun if (i > 32) {
326*4882a593Smuzhiyun printf("\n");
327*4882a593Smuzhiyun i = 0;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun printf("\n");
331*4882a593Smuzhiyun yaffs_close(h);
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
cmd_yaffs_mount(char * mp)334*4882a593Smuzhiyun void cmd_yaffs_mount(char *mp)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun int retval = yaffs_mount(mp);
337*4882a593Smuzhiyun if (retval < 0)
338*4882a593Smuzhiyun printf("Error mounting %s, return value: %d, %s\n", mp,
339*4882a593Smuzhiyun yaffsfs_GetError(), yaffs_error_str());
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun
cmd_yaffs_umount(char * mp)343*4882a593Smuzhiyun void cmd_yaffs_umount(char *mp)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun if (yaffs_unmount(mp) == -1)
346*4882a593Smuzhiyun printf("Error umounting %s, return value: %d, %s\n", mp,
347*4882a593Smuzhiyun yaffsfs_GetError(), yaffs_error_str());
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun
cmd_yaffs_write_file(char * yaffsName,char bval,int sizeOfFile)350*4882a593Smuzhiyun void cmd_yaffs_write_file(char *yaffsName, char bval, int sizeOfFile)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun make_a_file(yaffsName, bval, sizeOfFile);
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun
cmd_yaffs_read_file(char * fn)356*4882a593Smuzhiyun void cmd_yaffs_read_file(char *fn)
357*4882a593Smuzhiyun {
358*4882a593Smuzhiyun read_a_file(fn);
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun
cmd_yaffs_mread_file(char * fn,char * addr)362*4882a593Smuzhiyun void cmd_yaffs_mread_file(char *fn, char *addr)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun int h;
365*4882a593Smuzhiyun struct yaffs_stat s;
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun yaffs_stat(fn, &s);
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun printf("Copy %s to 0x%p... ", fn, addr);
370*4882a593Smuzhiyun h = yaffs_open(fn, O_RDWR, 0);
371*4882a593Smuzhiyun if (h < 0) {
372*4882a593Smuzhiyun printf("File not found\n");
373*4882a593Smuzhiyun return;
374*4882a593Smuzhiyun }
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun yaffs_read(h, addr, (int)s.st_size);
377*4882a593Smuzhiyun printf("\t[DONE]\n");
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun yaffs_close(h);
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun
cmd_yaffs_mwrite_file(char * fn,char * addr,int size)383*4882a593Smuzhiyun void cmd_yaffs_mwrite_file(char *fn, char *addr, int size)
384*4882a593Smuzhiyun {
385*4882a593Smuzhiyun int outh;
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun outh = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
388*4882a593Smuzhiyun if (outh < 0)
389*4882a593Smuzhiyun printf("Error opening file: %d, %s\n", outh, yaffs_error_str());
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun yaffs_write(outh, addr, size);
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun yaffs_close(outh);
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun
cmd_yaffs_ls(const char * mountpt,int longlist)397*4882a593Smuzhiyun void cmd_yaffs_ls(const char *mountpt, int longlist)
398*4882a593Smuzhiyun {
399*4882a593Smuzhiyun int i;
400*4882a593Smuzhiyun yaffs_DIR *d;
401*4882a593Smuzhiyun struct yaffs_dirent *de;
402*4882a593Smuzhiyun struct yaffs_stat stat;
403*4882a593Smuzhiyun char tempstr[255];
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun d = yaffs_opendir(mountpt);
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun if (!d) {
408*4882a593Smuzhiyun printf("opendir failed, %s\n", yaffs_error_str());
409*4882a593Smuzhiyun return;
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun for (i = 0; (de = yaffs_readdir(d)) != NULL; i++) {
413*4882a593Smuzhiyun if (longlist) {
414*4882a593Smuzhiyun sprintf(tempstr, "%s/%s", mountpt, de->d_name);
415*4882a593Smuzhiyun yaffs_lstat(tempstr, &stat);
416*4882a593Smuzhiyun printf("%-25s\t%7ld",
417*4882a593Smuzhiyun de->d_name,
418*4882a593Smuzhiyun (long)stat.st_size);
419*4882a593Smuzhiyun printf(" %5d %s\n",
420*4882a593Smuzhiyun stat.st_ino,
421*4882a593Smuzhiyun yaffs_file_type_str(&stat));
422*4882a593Smuzhiyun } else {
423*4882a593Smuzhiyun printf("%s\n", de->d_name);
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun yaffs_closedir(d);
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun
cmd_yaffs_mkdir(const char * dir)431*4882a593Smuzhiyun void cmd_yaffs_mkdir(const char *dir)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun int retval = yaffs_mkdir(dir, 0);
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun if (retval < 0)
436*4882a593Smuzhiyun printf("yaffs_mkdir returning error: %d, %s\n",
437*4882a593Smuzhiyun retval, yaffs_error_str());
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun
cmd_yaffs_rmdir(const char * dir)440*4882a593Smuzhiyun void cmd_yaffs_rmdir(const char *dir)
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun int retval = yaffs_rmdir(dir);
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun if (retval < 0)
445*4882a593Smuzhiyun printf("yaffs_rmdir returning error: %d, %s\n",
446*4882a593Smuzhiyun retval, yaffs_error_str());
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun
cmd_yaffs_rm(const char * path)449*4882a593Smuzhiyun void cmd_yaffs_rm(const char *path)
450*4882a593Smuzhiyun {
451*4882a593Smuzhiyun int retval = yaffs_unlink(path);
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun if (retval < 0)
454*4882a593Smuzhiyun printf("yaffs_unlink returning error: %d, %s\n",
455*4882a593Smuzhiyun retval, yaffs_error_str());
456*4882a593Smuzhiyun }
457*4882a593Smuzhiyun
cmd_yaffs_mv(const char * oldPath,const char * newPath)458*4882a593Smuzhiyun void cmd_yaffs_mv(const char *oldPath, const char *newPath)
459*4882a593Smuzhiyun {
460*4882a593Smuzhiyun int retval = yaffs_rename(newPath, oldPath);
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun if (retval < 0)
463*4882a593Smuzhiyun printf("yaffs_unlink returning error: %d, %s\n",
464*4882a593Smuzhiyun retval, yaffs_error_str());
465*4882a593Smuzhiyun }
466