1 #include <u.h> 2 #include <libc.h> 3 #include "flashfs.h" 4 5 int 6 convJ2M(Jrec *j, uchar *buff) 7 { 8 int m, n; 9 10 switch(j->type) { 11 case FT_create: 12 if(j->mode & (1 << 8)) { 13 if(j->mode & DMDIR) 14 j->type = FT_DCREATE1; 15 else 16 j->type = FT_FCREATE1; 17 } 18 else { 19 if(j->mode & DMDIR) 20 j->type = FT_DCREATE0; 21 else 22 j->type = FT_FCREATE0; 23 } 24 case FT_FCREATE0: 25 case FT_FCREATE1: 26 case FT_DCREATE0: 27 case FT_DCREATE1: 28 n = putc3(&buff[0], j->fnum); 29 goto create; 30 case FT_chmod: 31 if(j->mode & (1 << 8)) 32 j->type = FT_CHMOD1; 33 else 34 j->type = FT_CHMOD0; 35 case FT_CHMOD0: 36 case FT_CHMOD1: 37 n = putc3(&buff[0], j->fnum); 38 buff[n++] = j->mode; 39 return n + putc3(&buff[n], j->mnum); 40 case FT_REMOVE: 41 return putc3(&buff[0], j->fnum); 42 case FT_WRITE: 43 n = putc3(&buff[0], j->fnum); 44 n += putc3(&buff[n], j->mtime); 45 n += putc3(&buff[n], j->offset); 46 return n + putc3(&buff[n], j->size - 1); 47 case FT_AWRITE: 48 n = putc3(&buff[0], j->fnum); 49 n += putc3(&buff[n], j->offset); 50 return n + putc3(&buff[n], j->size - 1); 51 case FT_trunc: 52 if(j->mode & (1 << 8)) 53 j->type = FT_TRUNC1; 54 else 55 j->type = FT_TRUNC0; 56 case FT_TRUNC0: 57 case FT_TRUNC1: 58 n = putc3(&buff[0], j->fnum); 59 n += putc3(&buff[n], j->tnum); 60 goto create; 61 case FT_SUMMARY: 62 case FT_SUMBEG: 63 return putc3(&buff[0], j->seq); 64 case FT_SUMEND: 65 return 0; 66 create: 67 buff[n++] = j->mode; 68 n += putc3(&buff[n], j->mtime); 69 n += putc3(&buff[n], j->parent); 70 m = strlen(j->name); 71 memmove(&buff[n], j->name, m); 72 n += m; 73 buff[n++] = '\0'; 74 return n; 75 } 76 return -1; 77 } 78 79 int 80 convM2J(Jrec *j, uchar *buff) 81 { 82 int m, n; 83 84 j->type = buff[0]; 85 86 switch(j->type) { 87 case FT_FCREATE0: 88 case FT_FCREATE1: 89 case FT_DCREATE0: 90 case FT_DCREATE1: 91 n = 1 + getc3(&buff[1], &j->fnum); 92 j->mode = buff[n++]; 93 switch(j->type) { 94 case FT_FCREATE0: 95 break; 96 case FT_FCREATE1: 97 j->mode |= 1 << 8; 98 break; 99 case FT_DCREATE0: 100 j->mode |= DMDIR; 101 break; 102 case FT_DCREATE1: 103 j->mode |= DMDIR | (1 << 8); 104 break; 105 } 106 j->type = FT_create; 107 goto create; 108 case FT_CHMOD0: 109 case FT_CHMOD1: 110 n = 1 + getc3(&buff[1], &j->fnum); 111 j->mode = buff[n++]; 112 switch(j->type) { 113 case FT_CHMOD0: 114 break; 115 case FT_CHMOD1: 116 j->mode |= 1 << 8; 117 break; 118 } 119 j->type = FT_chmod; 120 return n + getc3(&buff[n], &j->mnum); 121 case FT_REMOVE: 122 return 1 + getc3(&buff[1], &j->fnum); 123 case FT_WRITE: 124 n = 1 + getc3(&buff[1], &j->fnum); 125 n += getc3(&buff[n], &j->mtime); 126 n += getc3(&buff[n], &j->offset); 127 n += getc3(&buff[n], &j->size); 128 j->size++; 129 return n; 130 case FT_AWRITE: 131 n = 1 + getc3(&buff[1], &j->fnum); 132 n += getc3(&buff[n], &j->offset); 133 n += getc3(&buff[n], &j->size); 134 j->size++; 135 return n; 136 case FT_TRUNC0: 137 case FT_TRUNC1: 138 n = 1 + getc3(&buff[1], &j->fnum); 139 n += getc3(&buff[n], &j->tnum); 140 j->mode = buff[n++]; 141 switch(j->type) { 142 case FT_TRUNC0: 143 break; 144 case FT_TRUNC1: 145 j->mode |= 1 << 8; 146 break; 147 } 148 j->type = FT_trunc; 149 goto create; 150 case FT_SUMMARY: 151 case FT_SUMBEG: 152 return 1 + getc3(&buff[1], &j->seq); 153 case FT_SUMEND: 154 return 1; 155 create: 156 n += getc3(&buff[n], &j->mtime); 157 n += getc3(&buff[n], &j->parent); 158 memmove(j->name, &buff[n], MAXNSIZE+1); 159 j->name[MAXNSIZE+1] = '\0'; 160 m = strlen(j->name); 161 if(m > MAXNSIZE) 162 return -1; 163 return n + m + 1; 164 } 165 return -1; 166 } 167 168 int 169 Jconv(Fmt *fp) 170 { 171 Jrec *j; 172 173 j = va_arg(fp->args, Jrec *); 174 switch(j->type) { 175 case FT_create: 176 case FT_FCREATE0: 177 case FT_FCREATE1: 178 case FT_DCREATE0: 179 case FT_DCREATE1: 180 return fmtprint(fp, "create f %ld p %ld t %lud m %ulo %s", 181 j->fnum, j->parent, j->mtime, j->mode, j->name); 182 case FT_chmod: 183 case FT_CHMOD0: 184 case FT_CHMOD1: 185 return fmtprint(fp, "chmod f %ld m %ulo #%ld", 186 j->fnum, j->mode, j->mnum); 187 case FT_REMOVE: 188 return fmtprint(fp, "remove f %ld", j->fnum); 189 case FT_WRITE: 190 return fmtprint(fp, "write f %ld z %ld o %ld t %uld", 191 j->fnum, j->size, j->offset, j->mtime); 192 case FT_AWRITE: 193 return fmtprint(fp, "awrite f %ld z %ld o %ld", 194 j->fnum, j->size, j->offset); 195 case FT_trunc: 196 case FT_TRUNC0: 197 case FT_TRUNC1: 198 return fmtprint(fp, "trunc f %ld o %ld p %ld t %ld m %ulo %s", 199 j->fnum, j->tnum, j->parent, j->mtime, j->mode, j->name); 200 case FT_SUMMARY: 201 return fmtprint(fp, "summary %ld", 202 j->seq); 203 case FT_SUMBEG: 204 return fmtprint(fp, "sumbeg %ld", 205 j->seq); 206 case FT_SUMEND: 207 return fmtprint(fp, "end"); 208 default: 209 return fmtprint(fp, "?type %d", j->type); 210 } 211 } 212