Changeset b5e68c8 in mainline for uspace/srv/bd/file_bd/file_bd.c


Ignore:
Timestamp:
2011-05-12T16:49:44Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f36787d7
Parents:
e80329d6 (diff), 750636a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/file_bd/file_bd.c

    re80329d6 rb5e68c8  
    4141#include <stdio.h>
    4242#include <unistd.h>
    43 #include <ipc/ipc.h>
    4443#include <ipc/bd.h>
    4544#include <async.h>
     
    5655#define NAME "file_bd"
    5756
    58 static const size_t block_size = 512;
     57#define DEFAULT_BLOCK_SIZE 512
     58
     59static size_t block_size;
    5960static aoff64_t num_blocks;
    6061static FILE *img;
    6162
    62 static dev_handle_t dev_handle;
     63static devmap_handle_t devmap_handle;
    6364static fibril_mutex_t dev_lock;
    6465
     66static void print_usage(void);
    6567static int file_bd_init(const char *fname);
    6668static void file_bd_connection(ipc_callid_t iid, ipc_call_t *icall);
     
    7173{
    7274        int rc;
     75        char *image_name;
     76        char *device_name;
    7377
    7478        printf(NAME ": File-backed block device driver\n");
    7579
    76         if (argc != 3) {
    77                 printf("Expected two arguments (image name, device name).\n");
     80        block_size = DEFAULT_BLOCK_SIZE;
     81
     82        ++argv; --argc;
     83        while (*argv != NULL && (*argv)[0] == '-') {
     84                /* Option */
     85                if (str_cmp(*argv, "-b") == 0) {
     86                        if (argc < 2) {
     87                                printf("Argument missing.\n");
     88                                print_usage();
     89                                return -1;
     90                        }
     91
     92                        rc = str_size_t(argv[1], NULL, 10, true, &block_size);
     93                        if (rc != EOK || block_size == 0) {
     94                                printf("Invalid block size '%s'.\n", argv[1]);
     95                                print_usage();
     96                                return -1;
     97                        }
     98                        ++argv; --argc;
     99                } else {
     100                        printf("Invalid option '%s'.\n", *argv);
     101                        print_usage();
     102                        return -1;
     103                }
     104                ++argv; --argc;
     105        }
     106
     107        if (argc < 2) {
     108                printf("Missing arguments.\n");
     109                print_usage();
    78110                return -1;
    79111        }
    80112
    81         if (file_bd_init(argv[1]) != EOK)
     113        image_name = argv[0];
     114        device_name = argv[1];
     115
     116        if (file_bd_init(image_name) != EOK)
    82117                return -1;
    83118
    84         rc = devmap_device_register(argv[2], &dev_handle);
     119        rc = devmap_device_register(device_name, &devmap_handle);
    85120        if (rc != EOK) {
    86                 devmap_hangup_phone(DEVMAP_DRIVER);
    87                 printf(NAME ": Unable to register device %s.\n",
    88                         argv[2]);
     121                printf(NAME ": Unable to register device '%s'.\n",
     122                        device_name);
    89123                return rc;
    90124        }
     
    96130        /* Not reached */
    97131        return 0;
     132}
     133
     134static void print_usage(void)
     135{
     136        printf("Usage: " NAME " [-b <block_size>] <image_file> <device_name>\n");
    98137}
    99138
     
    136175        ipc_callid_t callid;
    137176        ipc_call_t call;
    138         ipcarg_t method;
     177        sysarg_t method;
    139178        size_t comm_size;
    140         int flags;
     179        unsigned int flags;
    141180        int retval;
    142181        uint64_t ba;
     
    144183
    145184        /* Answer the IPC_M_CONNECT_ME_TO call. */
    146         ipc_answer_0(iid, EOK);
     185        async_answer_0(iid, EOK);
    147186
    148187        if (!async_share_out_receive(&callid, &comm_size, &flags)) {
    149                 ipc_answer_0(callid, EHANGUP);
     188                async_answer_0(callid, EHANGUP);
    150189                return;
    151190        }
     
    153192        fs_va = as_get_mappable_page(comm_size);
    154193        if (fs_va == NULL) {
    155                 ipc_answer_0(callid, EHANGUP);
     194                async_answer_0(callid, EHANGUP);
    156195                return;
    157196        }
     
    161200        while (1) {
    162201                callid = async_get_call(&call);
    163                 method = IPC_GET_METHOD(call);
     202                method = IPC_GET_IMETHOD(call);
    164203                switch (method) {
    165204                case IPC_M_PHONE_HUNGUP:
    166205                        /* The other side has hung up. */
    167                         ipc_answer_0(callid, EOK);
     206                        async_answer_0(callid, EOK);
    168207                        return;
    169208                case BD_READ_BLOCKS:
     
    188227                        break;
    189228                case BD_GET_BLOCK_SIZE:
    190                         ipc_answer_1(callid, EOK, block_size);
     229                        async_answer_1(callid, EOK, block_size);
    191230                        continue;
    192231                case BD_GET_NUM_BLOCKS:
    193                         ipc_answer_2(callid, EOK, LOWER32(num_blocks),
     232                        async_answer_2(callid, EOK, LOWER32(num_blocks),
    194233                            UPPER32(num_blocks));
    195234                        continue;
     
    198237                        break;
    199238                }
    200                 ipc_answer_0(callid, retval);
     239                async_answer_0(callid, retval);
    201240        }
    202241}
Note: See TracChangeset for help on using the changeset viewer.