00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00066 #include <fs/phatfs.h>
00067 #include <fs/phatvol.h>
00068 #include <fs/phatdir.h>
00069 #include <fs/phatutil.h>
00070
00071 #include <stdlib.h>
00072 #include <string.h>
00073 #include <time.h>
00074 #include <ctype.h>
00075 #include <errno.h>
00076
00077 #if 0
00078
00079 #define NUTDEBUG
00080 #include <stdio.h>
00081 #include <fs/phatdbg.h>
00082 #endif
00083
00088
00095 void GetDosTimeStamp(u_short * dostim, u_short * dosdat)
00096 {
00097 time_t now;
00098 struct _tm *gmt;
00099
00100 time(&now);
00101 gmt = localtime(&now);
00102
00103 if (dosdat) {
00104 *dosdat = (u_short) (gmt->tm_mday | ((gmt->tm_mon + 1) << 5) | ((gmt->tm_year - 80) << 9));
00105 }
00106 if (dostim) {
00107 *dostim = (u_short) ((gmt->tm_sec / 2) | (gmt->tm_min << 5) | (gmt->tm_hour << 11));
00108 }
00109 }
00110
00120 int MakePhatName(CONST char *src, u_char * dst)
00121 {
00122 int rc = 0;
00123 int i;
00124
00125
00126 memset(dst, ' ', 11);
00127
00128
00129 for (i = 0; src[i] == '.'; i++);
00130
00131 if (src[i] == 0 && (i == 1 || i == 2)) {
00132 while (i--) {
00133 *dst++ = '.';
00134 }
00135 return 0;
00136 }
00137
00138
00139 if (*src == (char)PHAT_REM_DIRENT) {
00140 dst[0] = PHAT_REM_NAMENT;
00141 src++;
00142 } else {
00143 dst[0] = toupper(*src);
00144 src++;
00145 }
00146
00147
00148 for (i = 1; i < 8 && *src && *src != '.'; i++, src++) {
00149 dst[i] = toupper(*src);
00150 }
00151
00152
00153 if (*src) {
00154
00155 if (*src != '.') {
00156 return -1;
00157 }
00158
00159 src++;
00160 for (i = 8; i < 11 && *src; i++, src++) {
00161 dst[i] = toupper(*src);
00162 }
00163
00164 if (*src) {
00165 return -1;
00166 }
00167 }
00168
00169
00170 for (i = 0; i < 11; i++) {
00171
00172 if (dst[i] < ' ') {
00173 return -1;
00174 }
00175
00176 if (strchr("\"+,./:;<=>[\\]^", dst[i])) {
00177 return -1;
00178 }
00179
00180 if (dst[i] == '?') {
00181 rc = 1;
00182 } else if (dst[i] == '*') {
00183 rc = 1;
00184
00185
00186 if (i < 8) {
00187 memset(&dst[i], '?', 8 - i);
00188 } else {
00189 memset(&dst[i], '?', 11 - i);
00190 }
00191 }
00192 }
00193 return rc;
00194 }
00195
00205 void MakeVisibleName(CONST u_char * src, char *dst)
00206 {
00207 int i;
00208
00209
00210 if (src[0] == PHAT_REM_NAMENT) {
00211 *dst++ = PHAT_REM_DIRENT;
00212 } else {
00213 *dst++ = src[0];
00214 }
00215
00216
00217 for (i = 1; i < 8 && src[i] != ' '; i++) {
00218 *dst++ = src[i];
00219 }
00220
00221
00222 for (i = 8; i < 11 && src[i] != ' '; i++) {
00223 if (i == 8) {
00224 *dst++ = '.';
00225 }
00226 *dst++ = src[i];
00227 }
00228 *dst = 0;
00229 }
00230
00242 char *GetParentPath(CONST char *path, CONST char **comp)
00243 {
00244 char *parent;
00245 int len;
00246
00247 if ((*comp = strrchr(path, '/')) == NULL) {
00248 errno = EINVAL;
00249 return NULL;
00250 }
00251
00252 (*comp)++;
00253 len = strlen(path) - strlen(*comp);
00254 if (len < 2) {
00255 len = 2;
00256 }
00257 if ((parent = malloc(len)) == NULL) {
00258 return NULL;
00259 }
00260 memcpy(parent, (void *)path, len - 1);
00261 parent[len - 1] = 0;
00262
00263 return parent;
00264 }
00265
00273 int IsFixedRootDir(NUTFILE * ndp)
00274 {
00275 NUTDEVICE *dev = ndp->nf_dev;
00276 PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00277 PHATFILE *fcb;
00278
00279
00280 if (vol->vol_type == 32) {
00281 return 0;
00282 }
00283
00284
00285 fcb = ndp->nf_fcb;
00286 if (fcb->f_de_sect || fcb->f_dirent.dent_clusthi || fcb->f_dirent.dent_clust) {
00287 return 0;
00288 }
00289 return 1;
00290 }
00291
00297 void PhatFilePosRewind(PHATFILE * fcb)
00298 {
00299
00300 fcb->f_pos = 0;
00301
00302 fcb->f_clust = fcb->f_dirent.dent_clusthi;
00303 fcb->f_clust <<= 16;
00304 fcb->f_clust += fcb->f_dirent.dent_clust;
00305
00306 fcb->f_clust_pos = 0;
00307
00308 fcb->f_sect_pos = 0;
00309 }
00310
00322 int PhatFilePosSet(NUTFILE * nfp, u_long pos)
00323 {
00324 u_long dist;
00325 u_long step;
00326 u_long clust;
00327 PHATFILE *fcb = nfp->nf_fcb;
00328 NUTDEVICE *dev = nfp->nf_dev;
00329 PHATVOL *vol = (PHATVOL *) dev->dev_dcb;
00330
00331
00332 if (pos == 0) {
00333 PhatFilePosRewind(fcb);
00334 return 0;
00335 }
00336
00337
00338 if ((fcb->f_dirent.dent_attr & PHAT_FATTR_DIR) == 0 && pos > fcb->f_dirent.dent_fsize) {
00339 return -1;
00340 }
00341
00342
00343
00344
00345
00346
00347 if (pos < fcb->f_pos) {
00348 PhatFilePosRewind(fcb);
00349 dist = pos;
00350 } else {
00351 dist = pos - fcb->f_pos;
00352 }
00353
00354 for (;;) {
00355 if (fcb->f_sect_pos >= vol->vol_sectsz) {
00356 if (IsFixedRootDir(nfp)) {
00357 if (fcb->f_clust_pos + 1 >= vol->vol_rootsz) {
00358
00359 break;
00360 }
00361 fcb->f_clust_pos++;
00362 }
00363 else {
00364
00365
00366
00367
00368
00369 if (fcb->f_clust_pos + 1 >= vol->vol_clustsz) {
00370
00371
00372
00373
00374 if (vol->vol_type == 32) {
00375 if (Phat32GetClusterLink(dev, fcb->f_clust, &clust)) {
00376 break;
00377 }
00378 if (clust >= (PHATEOC & PHAT32CMASK)) {
00379 break;
00380 }
00381 } else if (vol->vol_type == 16) {
00382 if (Phat16GetClusterLink(dev, fcb->f_clust, &clust)) {
00383 break;
00384 }
00385 if (clust >= (PHATEOC & PHAT16CMASK)) {
00386 break;
00387 }
00388 } else if (Phat12GetClusterLink(dev, fcb->f_clust, &clust)) {
00389 break;
00390 }
00391 else if (clust >= (PHATEOC & PHAT12CMASK)) {
00392 break;
00393 }
00394 fcb->f_clust_pos = 0;
00395 fcb->f_clust_prv = fcb->f_clust;
00396 fcb->f_clust = clust;
00397 } else {
00398 fcb->f_clust_pos++;
00399 }
00400 }
00401 fcb->f_sect_pos = 0;
00402 }
00403 if (dist == 0) {
00404 break;
00405 }
00406
00407
00408 step = vol->vol_sectsz - fcb->f_sect_pos;
00409 if (step > dist) {
00410 step = dist;
00411 }
00412 fcb->f_sect_pos += step;
00413 fcb->f_pos += step;
00414 dist -= step;
00415 }
00416 return fcb->f_pos == pos ? 0 : -1;
00417 }
00418