Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs_ops.c

    r19f857a rb4cbef1  
    3838#include "vfs.h"
    3939#include <ipc/ipc.h>
    40 #include <macros.h>
    41 #include <limits.h>
    4240#include <async.h>
    4341#include <errno.h>
    4442#include <stdio.h>
    4543#include <stdlib.h>
    46 #include <str.h>
     44#include <string.h>
    4745#include <bool.h>
    4846#include <fibril_synch.h>
     
    5553
    5654/* Forward declarations of static functions. */
    57 static int vfs_truncate_internal(fs_handle_t, dev_handle_t, fs_index_t, aoff64_t);
     55static int vfs_truncate_internal(fs_handle_t, dev_handle_t, fs_index_t, size_t);
    5856
    5957/**
     
    269267        /* We want the client to send us the mount point. */
    270268        char *mp;
    271         int rc = async_data_write_accept((void **) &mp, true, 0, MAX_PATH_LEN,
    272             0, NULL);
     269        int rc = async_string_receive(&mp, MAX_PATH_LEN, NULL);
    273270        if (rc != EOK) {
    274271                ipc_answer_0(rid, rc);
     
    278275        /* Now we expect to receive the mount options. */
    279276        char *opts;
    280         rc = async_data_write_accept((void **) &opts, true, 0, MAX_MNTOPTS_LEN,
    281             0, NULL);
     277        rc = async_string_receive(&opts, MAX_MNTOPTS_LEN, NULL);
    282278        if (rc != EOK) {
    283279                free(mp);
     
    291287         */
    292288        char *fs_name;
    293         rc = async_data_write_accept((void **) &fs_name, true, 0, FS_NAME_MAXLEN,
    294             0, NULL);
     289        rc = async_string_receive(&fs_name, FS_NAME_MAXLEN, NULL);
    295290        if (rc != EOK) {
    296291                free(mp);
     
    355350        vfs_lookup_res_t mp_res;
    356351        vfs_lookup_res_t mr_res;
     352        vfs_node_t *mp_node;
    357353        vfs_node_t *mr_node;
    358354        int phone;
     
    361357         * Receive the mount point path.
    362358         */
    363         rc = async_data_write_accept((void **) &mp, true, 0, MAX_PATH_LEN,
    364             0, NULL);
     359        rc = async_string_receive(&mp, MAX_PATH_LEN, NULL);
    365360        if (rc != EOK)
    366361                ipc_answer_0(rid, rc);
     
    504499        int oflag = IPC_GET_ARG2(*request);
    505500        int mode = IPC_GET_ARG3(*request);
     501        size_t len;
    506502
    507503        /* Ignore mode for now. */
     
    526522       
    527523        char *path;
    528         int rc = async_data_write_accept((void **) &path, true, 0, 0, 0, NULL);
     524        int rc = async_string_receive(&path, 0, NULL);
    529525        if (rc != EOK) {
    530526                ipc_answer_0(rid, rc);
     
    840836                    &answer);
    841837        } else {
    842                 rc = async_data_write_forward_3_1(fs_phone, VFS_OUT_WRITE,
     838                rc = async_data_forward_3_1(fs_phone, VFS_OUT_WRITE,
    843839                    file->node->dev_handle, file->node->index, file->pos,
    844840                    &answer);
     
    887883{
    888884        int fd = (int) IPC_GET_ARG1(*request);
    889         off64_t off =
    890             (off64_t) MERGE_LOUP32(IPC_GET_ARG2(*request), IPC_GET_ARG3(*request));
    891         int whence = (int) IPC_GET_ARG4(*request);
    892        
     885        off_t off = (off_t) IPC_GET_ARG2(*request);
     886        int whence = (int) IPC_GET_ARG3(*request);
     887
     888
    893889        /* Lookup the file structure corresponding to the file descriptor. */
    894890        vfs_file_t *file = vfs_file_get(fd);
     
    897893                return;
    898894        }
    899        
     895
     896        off_t newpos;
    900897        fibril_mutex_lock(&file->lock);
    901        
    902         off64_t newoff;
    903         switch (whence) {
    904                 case SEEK_SET:
    905                         if (off >= 0) {
    906                                 file->pos = (aoff64_t) off;
    907                                 fibril_mutex_unlock(&file->lock);
    908                                 ipc_answer_1(rid, EOK, off);
    909                                 return;
    910                         }
    911                         break;
    912                 case SEEK_CUR:
    913                         if ((off >= 0) && (file->pos + off < file->pos)) {
    914                                 fibril_mutex_unlock(&file->lock);
    915                                 ipc_answer_0(rid, EOVERFLOW);
    916                                 return;
    917                         }
    918                        
    919                         if ((off < 0) && (file->pos < (aoff64_t) -off)) {
    920                                 fibril_mutex_unlock(&file->lock);
    921                                 ipc_answer_0(rid, EOVERFLOW);
    922                                 return;
    923                         }
    924                        
    925                         file->pos += off;
    926                         newoff = (file->pos > OFF64_MAX) ? OFF64_MAX : file->pos;
    927                        
     898        if (whence == SEEK_SET) {
     899                file->pos = off;
     900                fibril_mutex_unlock(&file->lock);
     901                ipc_answer_1(rid, EOK, off);
     902                return;
     903        }
     904        if (whence == SEEK_CUR) {
     905                if (file->pos + off < file->pos) {
    928906                        fibril_mutex_unlock(&file->lock);
    929                         ipc_answer_2(rid, EOK, LOWER32(newoff), UPPER32(newoff));
     907                        ipc_answer_0(rid, EOVERFLOW);
    930908                        return;
    931                 case SEEK_END:
    932                         fibril_rwlock_read_lock(&file->node->contents_rwlock);
    933                         aoff64_t size = file->node->size;
    934                        
    935                         if ((off >= 0) && (size + off < size)) {
    936                                 fibril_rwlock_read_unlock(&file->node->contents_rwlock);
    937                                 fibril_mutex_unlock(&file->lock);
    938                                 ipc_answer_0(rid, EOVERFLOW);
    939                                 return;
    940                         }
    941                        
    942                         if ((off < 0) && (size < (aoff64_t) -off)) {
    943                                 fibril_rwlock_read_unlock(&file->node->contents_rwlock);
    944                                 fibril_mutex_unlock(&file->lock);
    945                                 ipc_answer_0(rid, EOVERFLOW);
    946                                 return;
    947                         }
    948                        
    949                         file->pos = size + off;
    950                         newoff = (file->pos > OFF64_MAX) ? OFF64_MAX : file->pos;
    951                        
    952                         fibril_rwlock_read_unlock(&file->node->contents_rwlock);
     909                }
     910                file->pos += off;
     911                newpos = file->pos;
     912                fibril_mutex_unlock(&file->lock);
     913                ipc_answer_1(rid, EOK, newpos);
     914                return;
     915        }
     916        if (whence == SEEK_END) {
     917                fibril_rwlock_read_lock(&file->node->contents_rwlock);
     918                size_t size = file->node->size;
     919                fibril_rwlock_read_unlock(&file->node->contents_rwlock);
     920                if (size + off < size) {
    953921                        fibril_mutex_unlock(&file->lock);
    954                         ipc_answer_2(rid, EOK, LOWER32(newoff), UPPER32(newoff));
     922                        ipc_answer_0(rid, EOVERFLOW);
    955923                        return;
    956         }
    957        
     924                }
     925                newpos = size + off;
     926                file->pos = newpos;
     927                fibril_mutex_unlock(&file->lock);
     928                ipc_answer_1(rid, EOK, newpos);
     929                return;
     930        }
    958931        fibril_mutex_unlock(&file->lock);
    959932        ipc_answer_0(rid, EINVAL);
    960933}
    961934
    962 int vfs_truncate_internal(fs_handle_t fs_handle, dev_handle_t dev_handle,
    963     fs_index_t index, aoff64_t size)
     935int
     936vfs_truncate_internal(fs_handle_t fs_handle, dev_handle_t dev_handle,
     937    fs_index_t index, size_t size)
    964938{
    965939        ipcarg_t rc;
     
    967941       
    968942        fs_phone = vfs_grab_phone(fs_handle);
    969         rc = async_req_4_0(fs_phone, VFS_OUT_TRUNCATE, (ipcarg_t) dev_handle,
    970             (ipcarg_t) index, LOWER32(size), UPPER32(size));
     943        rc = async_req_3_0(fs_phone, VFS_OUT_TRUNCATE, (ipcarg_t)dev_handle,
     944            (ipcarg_t)index, (ipcarg_t)size);
    971945        vfs_release_phone(fs_phone);
    972946        return (int)rc;
     
    976950{
    977951        int fd = IPC_GET_ARG1(*request);
    978         aoff64_t size =
    979             (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(*request), IPC_GET_ARG3(*request));
     952        size_t size = IPC_GET_ARG2(*request);
    980953        int rc;
    981954
     
    10341007{
    10351008        char *path;
    1036         int rc = async_data_write_accept((void **) &path, true, 0, 0, 0, NULL);
     1009        int rc = async_string_receive(&path, 0, NULL);
    10371010        if (rc != EOK) {
    10381011                ipc_answer_0(rid, rc);
     
    10881061       
    10891062        char *path;
    1090         int rc = async_data_write_accept((void **) &path, true, 0, 0, 0, NULL);
     1063        int rc = async_string_receive(&path, 0, NULL);
    10911064        if (rc != EOK) {
    10921065                ipc_answer_0(rid, rc);
     
    11101083       
    11111084        char *path;
    1112         int rc = async_data_write_accept((void **) &path, true, 0, 0, 0, NULL);
     1085        int rc = async_string_receive(&path, 0, NULL);
    11131086        if (rc != EOK) {
    11141087                ipc_answer_0(rid, rc);
     
    11451118        /* Retrieve the old path. */
    11461119        char *old;
    1147         int rc = async_data_write_accept((void **) &old, true, 0, 0, 0, NULL);
     1120        int rc = async_string_receive(&old, 0, NULL);
    11481121        if (rc != EOK) {
    11491122                ipc_answer_0(rid, rc);
     
    11531126        /* Retrieve the new path. */
    11541127        char *new;
    1155         rc = async_data_write_accept((void **) &new, true, 0, 0, 0, NULL);
     1128        rc = async_string_receive(&new, 0, NULL);
    11561129        if (rc != EOK) {
    11571130                free(old);
Note: See TracChangeset for help on using the changeset viewer.