Changeset 8e3498b in mainline for uspace/app/bdsh/cmds/modules/mkfile


Ignore:
Timestamp:
2017-12-04T18:44:24Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bde5c04
Parents:
40feeac
Message:

vfs_read/write() should return error code separately from number of bytes transferred.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/cmds/modules/mkfile/mkfile.c

    r40feeac r8e3498b  
    8585 *
    8686 * @param str   String containing the size specification.
    87  * @return      Non-negative size in bytes on success, -1 on failure.
     87 * @param rsize Place to store size in bytes
     88 * @return      EOK on success or error code
    8889 */
    89 static ssize_t read_size(const char *str)
     90static int read_size(const char *str, size_t *rsize)
    9091{
    91         ssize_t number, unit;
     92        size_t number, unit;
    9293        char *ep;
    9394
    9495        number = strtol(str, &ep, 10);
    95         if (ep[0] == '\0')
    96                 return number;
     96        if (ep[0] == '\0') {
     97                *rsize = number;
     98                return EOK;
     99        }
    97100
    98101        if (ep[1] != '\0')
    99                     return -1;
     102                    return EINVAL;
    100103
    101104        switch (tolower(ep[0])) {
     
    103106        case 'm': unit = 1024*1024; break;
    104107        case 'g': unit = 1024*1024*1024; break;
    105         default: return -1;
    106         }
    107 
    108         return number * unit;
     108        default: return EINVAL;
     109        }
     110
     111        *rsize = number * unit;
     112        return EOK;
    109113}
    110114
     
    114118        int c, opt_ind;
    115119        int fd;
    116         ssize_t file_size;
    117         ssize_t total_written;
    118         ssize_t to_write, rc, rc2 = 0;
     120        size_t file_size;
     121        size_t total_written;
     122        size_t to_write;
     123        size_t nwritten;
     124        int rc;
    119125        char *file_name;
    120126        void *buffer;
     
    136142                        break;
    137143                case 's':
    138                         file_size = read_size(optarg);
    139                         if (file_size < 0) {
     144                        rc = read_size(optarg, &file_size);
     145                        if (rc != EOK) {
    140146                                printf("%s: Invalid file size specification.\n",
    141147                                    cmdname);
     
    166172               
    167173                pos = file_size - 1;
    168                 rc2 = vfs_write(fd, &pos, &byte, sizeof(char));
    169                 if (rc2 < 0) {
     174                rc = vfs_write(fd, &pos, &byte, sizeof(char), &nwritten);
     175                if (rc != EOK) {
    170176                        vfs_put(fd);
    171177                        goto error;
     
    183189        while (total_written < file_size) {
    184190                to_write = min(file_size - total_written, BUFFER_SIZE);
    185                 rc = vfs_write(fd, &pos, buffer, to_write);
    186                 if (rc <= 0) {
     191                rc = vfs_write(fd, &pos, buffer, to_write, &nwritten);
     192                if (rc != EOK) {
    187193                        printf("%s: Error writing file (%d).\n", cmdname, errno);
    188194                        vfs_put(fd);
     
    190196                        return CMD_FAILURE;
    191197                }
    192                 total_written += rc;
     198                total_written += nwritten;
    193199        }
    194200
Note: See TracChangeset for help on using the changeset viewer.