Changeset fe0f24e in rtems


Ignore:
Timestamp:
Nov 21, 2012, 2:27:43 PM (7 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, master
Children:
0268adb3
Parents:
ad5e070
git-author:
Sebastian Huber <sebastian.huber@…> (11/21/12 14:27:43)
git-committer:
Sebastian Huber <sebastian.huber@…> (11/21/12 15:38:34)
Message:

ftpfs: Use SIZE command

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libnetworking/lib/ftpfs.c

    rad5e070 rfe0f24e  
    9898
    9999  bool write;
     100
     101  /**
     102   * Indicates if we should do a SIZE command.
     103   *
     104   * The first call to the rtems_ftpfs_fstat() handler is issued by the path
     105   * evaluation to check for access permission.  For this case we avoid the
     106   * SIZE command.
     107   */
     108  bool do_size_command;
    100109
    101110  ino_t ino;
     
    12261235}
    12271236
     1237typedef enum {
     1238  RTEMS_FTPFS_SIZE_START = 0,
     1239  RTEMS_FTPFS_SIZE_SPACE,
     1240  RTEMS_FTPFS_SIZE_NUMBER,
     1241  RTEMS_FTPFS_SIZE_NL
     1242} rtems_ftpfs_size_state;
     1243
     1244typedef struct {
     1245  rtems_ftpfs_size_state state;
     1246  size_t index;
     1247  off_t size;
     1248} rtems_ftpfs_size_entry;
     1249
     1250static void rtems_ftpfs_size_parser(
     1251  const char* buf,
     1252  size_t len,
     1253  void *arg
     1254)
     1255{
     1256  rtems_ftpfs_size_entry *se = arg;
     1257  size_t i = 0;
     1258
     1259  for (i = 0; se->size >= 0 && i < len; ++i, ++se->index) {
     1260    int c = buf [i];
     1261
     1262    switch (se->state) {
     1263      case RTEMS_FTPFS_SIZE_START:
     1264        if (se->index == 2) {
     1265          se->state = RTEMS_FTPFS_SIZE_SPACE;
     1266        }
     1267        break;
     1268      case RTEMS_FTPFS_SIZE_SPACE:
     1269        if (c == ' ') {
     1270          se->state = RTEMS_FTPFS_SIZE_NUMBER;
     1271        } else {
     1272          se->size = -1;
     1273        }
     1274        break;
     1275      case RTEMS_FTPFS_SIZE_NUMBER:
     1276        if (isdigit(c)) {
     1277          se->size = 10 * se->size + c - '0';
     1278        } else if (c == '\r') {
     1279          se->state = RTEMS_FTPFS_SIZE_NL;
     1280        } else {
     1281          se->size = -1;
     1282        }
     1283        break;
     1284      case RTEMS_FTPFS_SIZE_NL:
     1285        if (c != '\n') {
     1286          se->size = -1;
     1287        }
     1288        break;
     1289      default:
     1290        se->size = -1;
     1291        break;
     1292    }
     1293  }
     1294}
     1295
    12281296/*
    12291297 * The stat() support is intended only for the cp shell command.  Each request
     
    12371305)
    12381306{
     1307  int eno = 0;
    12391308  rtems_ftpfs_entry *e = loc->node_access;
    12401309
     
    12451314  st->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
    12461315
    1247   return 0;
     1316  if (e->do_size_command) {
     1317    const rtems_ftpfs_mount_entry *me = loc->mt_entry->fs_info;
     1318    rtems_ftpfs_size_entry se;
     1319    rtems_ftpfs_reply reply = RTEMS_FTPFS_REPLY_ERROR;
     1320
     1321    memset(&se, 0, sizeof(se));
     1322
     1323    reply = rtems_ftpfs_send_command_with_parser(
     1324      e,
     1325      "SIZE ",
     1326      e->filename,
     1327      rtems_ftpfs_size_parser,
     1328      &se,
     1329      me->verbose
     1330    );
     1331    if (reply == RTEMS_FTPFS_REPLY_2 && se.size >= 0) {
     1332      st->st_size = se.size;
     1333    } else {
     1334      eno = EIO;
     1335    }
     1336  } else {
     1337    e->do_size_command = true;
     1338  }
     1339
     1340  if (eno == 0) {
     1341    return 0;
     1342  } else {
     1343    rtems_set_errno_and_return_minus_one(eno);
     1344  }
    12481345}
    12491346
  • testsuites/libtests/ftp01/ftp01.scn

    rad5e070 rfe0f24e  
    4949QUIT
    5050221 Goodbye.
     51220 RTEMS FTP server (Version 1.1-JWJ) ready.
     52USER anonymous
     53230 User logged in.
     54TYPE I
     55200 Type set to I.
     56SIZE a.txt
     57213 1102
     58QUIT
     59221 Goodbye.
     60220 RTEMS FTP server (Version 1.1-JWJ) ready.
     61USER anonymous
     62230 User logged in.
     63TYPE I
     64200 Type set to I.
     65SIZE b.txt
     66213 1102
     67QUIT
     68221 Goodbye.
    5169*** END OF TEST FTP 1 ***
  • testsuites/libtests/ftp01/init.c

    rad5e070 rfe0f24e  
    143143}
    144144
     145static void check_file_size(const char *path, size_t size)
     146{
     147  struct stat st;
     148  int rv = lstat(path, &st);
     149
     150  rtems_test_assert(rv == 0);
     151  rtems_test_assert(st.st_size == (off_t) size);
     152}
     153
    145154static void check_file(const char *path)
    146155{
     
    184193  copy_file(file_a, file_b);
    185194  check_file(file_b);
     195  check_file_size(file_a, sizeof(content));
     196  check_file_size(file_b, sizeof(content));
    186197}
    187198
Note: See TracChangeset for help on using the changeset viewer.