Changeset ff381a7 in mainline for uspace/lib/c/generic/vfs/vfs.c


Ignore:
Timestamp:
2015-11-02T20:54:19Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d8513177
Parents:
3feeab2 (diff), 5265eea4 (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/lib/c/generic/vfs/vfs.c

    r3feeab2 rff381a7  
    7575       
    7676        while (vfs_sess == NULL)
    77                 vfs_sess = service_connect_blocking(EXCHANGE_PARALLEL, SERVICE_VFS,
    78                     0, 0);
     77                vfs_sess = service_connect_blocking(SERVICE_VFS, INTERFACE_VFS,
     78                    0);
    7979       
    8080        fibril_mutex_unlock(&vfs_mutex);
     
    9393}
    9494
    95 char *absolutize(const char *path, size_t *retlen)
     95char *vfs_absolutize(const char *path, size_t *retlen)
    9696{
    9797        char *ncwd_path;
     
    101101        size_t size = str_size(path);
    102102        if (*path != '/') {
    103                 if (!cwd_path) {
     103                if (cwd_path == NULL) {
    104104                        fibril_mutex_unlock(&cwd_mutex);
    105105                        return NULL;
    106106                }
    107107                ncwd_path_nc = malloc(cwd_size + 1 + size + 1);
    108                 if (!ncwd_path_nc) {
     108                if (ncwd_path_nc == NULL) {
    109109                        fibril_mutex_unlock(&cwd_mutex);
    110110                        return NULL;
     
    115115        } else {
    116116                ncwd_path_nc = malloc(size + 1);
    117                 if (!ncwd_path_nc) {
     117                if (ncwd_path_nc == NULL) {
    118118                        fibril_mutex_unlock(&cwd_mutex);
    119119                        return NULL;
     
    123123        str_append(ncwd_path_nc, cwd_size + 1 + size + 1, path);
    124124        ncwd_path = canonify(ncwd_path_nc, retlen);
    125         if (!ncwd_path) {
     125        if (ncwd_path == NULL) {
    126126                fibril_mutex_unlock(&cwd_mutex);
    127127                free(ncwd_path_nc);
     
    135135        ncwd_path = str_dup(ncwd_path);
    136136        free(ncwd_path_nc);
    137         if (!ncwd_path) {
     137        if (ncwd_path == NULL) {
    138138                fibril_mutex_unlock(&cwd_mutex);
    139139                return NULL;
     
    143143}
    144144
    145 int mount(const char *fs_name, const char *mp, const char *fqsn,
     145int vfs_mount(const char *fs_name, const char *mp, const char *fqsn,
    146146    const char *opts, unsigned int flags, unsigned int instance)
    147147{
     
    171171       
    172172        size_t mpa_size;
    173         char *mpa = absolutize(mp, &mpa_size);
    174         if (!mpa) {
     173        char *mpa = vfs_absolutize(mp, &mpa_size);
     174        if (mpa == NULL) {
    175175                if (null_id != -1)
    176176                        loc_null_destroy(null_id);
     
    255255}
    256256
    257 int unmount(const char *mp)
     257int vfs_unmount(const char *mp)
    258258{
    259259        sysarg_t rc;
     
    263263        char *mpa;
    264264       
    265         mpa = absolutize(mp, &mpa_size);
    266         if (!mpa)
     265        mpa = vfs_absolutize(mp, &mpa_size);
     266        if (mpa == NULL)
    267267                return ENOMEM;
    268268       
     
    289289}
    290290
    291 static int open_internal(const char *abs, size_t abs_size, int lflag, int oflag)
     291/** Open file (internal).
     292 *
     293 * @param abs Absolute path to file
     294 * @param abs_size Size of @a abs string
     295 * @param lflag L_xxx flags
     296 * @param oflag O_xxx flags
     297 * @param fd Place to store new file descriptor
     298 *
     299 * @return EOK on success, non-zero error code on error
     300 */
     301static int open_internal(const char *abs, size_t abs_size, int lflag, int oflag,
     302    int *fd)
    292303{
    293304        async_exch_t *exch = vfs_exchange_begin();
     
    315326            return (int) rc;
    316327       
    317         return (int) IPC_GET_ARG1(answer);
    318 }
    319 
     328        *fd = (int) IPC_GET_ARG1(answer);
     329        return EOK;
     330}
     331
     332/** Open file.
     333 *
     334 * @param path File path
     335 * @param oflag O_xxx flags
     336 * @param mode File mode (only with O_CREAT)
     337 *
     338 * @return Nonnegative file descriptor on success. On error -1 is returned
     339 *         and errno is set.
     340 */
    320341int open(const char *path, int oflag, ...)
    321342{
    322343        size_t abs_size;
    323         char *abs = absolutize(path, &abs_size);
    324         if (!abs)
    325                 return ENOMEM;
    326        
    327         int ret = open_internal(abs, abs_size, L_FILE, oflag);
     344        char *abs = vfs_absolutize(path, &abs_size);
     345        int fd = -1;
     346       
     347        if (abs == NULL) {
     348                errno = ENOMEM;
     349                return -1;
     350        }
     351       
     352        int rc = open_internal(abs, abs_size, L_FILE, oflag, &fd);
    328353        free(abs);
    329354       
    330         return ret;
    331 }
    332 
     355        if (rc != EOK) {
     356                errno = rc;
     357                return -1;
     358        }
     359       
     360        return fd;
     361}
     362
     363/** Close file.
     364 *
     365 * @param fildes File descriptor
     366 * @return Zero on success. On error -1 is returned and errno is set.
     367 */
    333368int close(int fildes)
    334369{
     
    339374        vfs_exchange_end(exch);
    340375       
    341         return (int) rc;
    342 }
    343 
    344 ssize_t read(int fildes, void *buf, size_t nbyte)
     376        if (rc != EOK) {
     377                errno = rc;
     378                return -1;
     379        }
     380       
     381        return 0;
     382}
     383
     384/** Read bytes from file.
     385 *
     386 * Read up to @a nbyte bytes from file. The actual number of bytes read
     387 * may be lower, but greater than zero if there are any bytes available.
     388 * If there are no bytes available for reading, then the function will
     389 * return success with zero bytes read.
     390 *
     391 * @param fildes File descriptor
     392 * @param buf Buffer
     393 * @param nbyte Maximum number of bytes to read
     394 * @param nread Place to store actual number of bytes read (0 or more)
     395 *
     396 * @return EOK on success, non-zero error code on error.
     397 */
     398static int _read_short(int fildes, void *buf, size_t nbyte, ssize_t *nread)
    345399{
    346400        sysarg_t rc;
     
    357411        if (rc != EOK) {
    358412                vfs_exchange_end(exch);
    359 
     413               
    360414                sysarg_t rc_orig;
    361415                async_wait_for(req, &rc_orig);
    362 
     416               
    363417                if (rc_orig == EOK)
    364                         return (ssize_t) rc;
     418                        return rc;
    365419                else
    366                         return (ssize_t) rc_orig;
    367         }
     420                        return rc_orig;
     421        }
     422       
    368423        vfs_exchange_end(exch);
    369424        async_wait_for(req, &rc);
    370         if (rc == EOK)
    371                 return (ssize_t) IPC_GET_ARG1(answer);
    372         else
     425       
     426        if (rc != EOK)
    373427                return rc;
    374 }
    375 
    376 ssize_t write(int fildes, const void *buf, size_t nbyte)
     428       
     429        *nread = (ssize_t) IPC_GET_ARG1(answer);
     430        return EOK;
     431}
     432
     433/** Write bytes to file.
     434 *
     435 * Write up to @a nbyte bytes from file. The actual number of bytes written
     436 * may be lower, but greater than zero.
     437 *
     438 * @param fildes File descriptor
     439 * @param buf Buffer
     440 * @param nbyte Maximum number of bytes to write
     441 * @param nread Place to store actual number of bytes written (0 or more)
     442 *
     443 * @return EOK on success, non-zero error code on error.
     444 */
     445static int _write_short(int fildes, const void *buf, size_t nbyte,
     446    ssize_t *nwritten)
    377447{
    378448        sysarg_t rc;
     
    389459        if (rc != EOK) {
    390460                vfs_exchange_end(exch);
    391 
     461               
    392462                sysarg_t rc_orig;
    393463                async_wait_for(req, &rc_orig);
    394 
     464               
    395465                if (rc_orig == EOK)
    396                         return (ssize_t) rc;
     466                        return rc;
    397467                else
    398                         return (ssize_t) rc_orig;
    399         }
     468                        return rc_orig;
     469        }
     470       
    400471        vfs_exchange_end(exch);
    401472        async_wait_for(req, &rc);
    402         if (rc == EOK)
    403                 return (ssize_t) IPC_GET_ARG1(answer);
    404         else
    405                 return -1;
    406 }
    407 
    408 /** Read entire buffer.
    409  *
    410  * In face of short reads this function continues reading until either
    411  * the entire buffer is read or no more data is available (at end of file).
     473       
     474        if (rc != EOK)
     475                return rc;
     476       
     477        *nwritten = (ssize_t) IPC_GET_ARG1(answer);
     478        return EOK;
     479}
     480
     481/** Read data.
     482 *
     483 * Read up to @a nbytes bytes from file if available. This function always reads
     484 * all the available bytes up to @a nbytes.
    412485 *
    413486 * @param fildes        File descriptor
     
    415488 * @param nbytes        Number of bytes to read
    416489 *
    417  * @return              On success, positive number of bytes read.
    418  *                      On failure, negative error code from read().
    419  */
    420 ssize_t read_all(int fildes, void *buf, size_t nbyte)
     490 * @return              On success, nonnegative number of bytes read.
     491 *                      On failure, -1 and sets errno.
     492 */
     493ssize_t read(int fildes, void *buf, size_t nbyte)
    421494{
    422495        ssize_t cnt = 0;
    423496        size_t nread = 0;
    424497        uint8_t *bp = (uint8_t *) buf;
    425 
     498        int rc;
     499       
    426500        do {
    427501                bp += cnt;
    428502                nread += cnt;
    429                 cnt = read(fildes, bp, nbyte - nread);
    430         } while (cnt > 0 && (nbyte - nread - cnt) > 0);
    431 
    432         if (cnt < 0)
    433                 return cnt;
    434 
     503                rc = _read_short(fildes, bp, nbyte - nread, &cnt);
     504        } while (rc == EOK && cnt > 0 && (nbyte - nread - cnt) > 0);
     505       
     506        if (rc != EOK) {
     507                errno = rc;
     508                return -1;
     509        }
     510       
    435511        return nread + cnt;
    436512}
    437513
    438 /** Write entire buffer.
     514/** Write data.
    439515 *
    440516 * This function fails if it cannot write exactly @a len bytes to the file.
     
    444520 * @param nbytes        Number of bytes to write
    445521 *
    446  * @return              EOK on error, return value from write() if writing
    447  *                      failed.
    448  */
    449 ssize_t write_all(int fildes, const void *buf, size_t nbyte)
     522 * @return              On success, nonnegative number of bytes written.
     523 *                      On failure, -1 and sets errno.
     524 */
     525ssize_t write(int fildes, const void *buf, size_t nbyte)
    450526{
    451527        ssize_t cnt = 0;
    452528        ssize_t nwritten = 0;
    453529        const uint8_t *bp = (uint8_t *) buf;
     530        int rc;
    454531
    455532        do {
    456533                bp += cnt;
    457534                nwritten += cnt;
    458                 cnt = write(fildes, bp, nbyte - nwritten);
    459         } while (cnt > 0 && ((ssize_t )nbyte - nwritten - cnt) > 0);
    460 
    461         if (cnt < 0)
    462                 return cnt;
    463 
    464         if ((ssize_t)nbyte - nwritten - cnt > 0)
    465                 return EIO;
     535                rc = _write_short(fildes, bp, nbyte - nwritten, &cnt);
     536        } while (rc == EOK && ((ssize_t )nbyte - nwritten - cnt) > 0);
     537
     538        if (rc != EOK) {
     539                errno = rc;
     540                return -1;
     541        }
    466542
    467543        return nbyte;
    468544}
    469545
     546/** Synchronize file.
     547 *
     548 * @param fildes File descriptor
     549 * @return 0 on success. On error returns -1 and sets errno.
     550 */
    470551int fsync(int fildes)
    471552{
     
    474555        vfs_exchange_end(exch);
    475556       
    476         return (int) rc;
    477 }
    478 
     557        if (rc != EOK) {
     558                errno = rc;
     559                return -1;
     560        }
     561       
     562        return 0;
     563}
     564
     565/** Seek to a position.
     566 *
     567 * @param fildes File descriptor
     568 * @param offset Offset
     569 * @param whence SEEK_SET, SEEK_CUR or SEEK_END
     570 *
     571 * @return On success the nonnegative offset from start of file. On error
     572 *         returns (off64_t)-1 and sets errno.
     573 */
    479574off64_t lseek(int fildes, off64_t offset, int whence)
    480575{
     
    489584        vfs_exchange_end(exch);
    490585       
    491         if (rc != EOK)
     586        if (rc != EOK) {
     587                errno = rc;
    492588                return (off64_t) -1;
     589        }
    493590       
    494591        return (off64_t) MERGE_LOUP32(newoff_lo, newoff_hi);
    495592}
    496593
     594/** Truncate file to a specified length.
     595 *
     596 * Truncate file so that its size is exactly @a length
     597 *
     598 * @param fildes File descriptor
     599 * @param length Length
     600 *
     601 * @return 0 on success, -1 on error and sets errno.
     602 */
    497603int ftruncate(int fildes, aoff64_t length)
    498604{
     
    504610        vfs_exchange_end(exch);
    505611       
    506         return (int) rc;
    507 }
    508 
     612        if (rc != EOK) {
     613                errno = rc;
     614                return -1;
     615        }
     616       
     617        return 0;
     618}
     619
     620/** Get file status.
     621 *
     622 * @param fildes File descriptor
     623 * @param stat Place to store file information
     624 *
     625 * @return 0 on success, -1 on error and sets errno.
     626 */
    509627int fstat(int fildes, struct stat *stat)
    510628{
     
    518636        if (rc != EOK) {
    519637                vfs_exchange_end(exch);
    520 
     638               
    521639                sysarg_t rc_orig;
    522640                async_wait_for(req, &rc_orig);
    523 
    524                 if (rc_orig == EOK)
    525                         return (ssize_t) rc;
    526                 else
    527                         return (ssize_t) rc_orig;
    528         }
     641               
     642                if (rc_orig != EOK)
     643                        rc = rc_orig;
     644                if (rc != EOK) {
     645                        errno = rc;
     646                        return -1;
     647                }
     648               
     649                return 0;
     650        }
     651       
    529652        vfs_exchange_end(exch);
    530653        async_wait_for(req, &rc);
    531 
    532         return rc;
    533 }
    534 
     654       
     655        if (rc != EOK) {
     656                errno = rc;
     657                return -1;
     658        }
     659       
     660        return 0;
     661}
     662
     663/** Get file status.
     664 *
     665 * @param path Path to file
     666 * @param stat Place to store file information
     667 *
     668 * @return 0 on success, -1 on error and sets errno.
     669 */
    535670int stat(const char *path, struct stat *stat)
    536671{
     
    540675       
    541676        size_t pa_size;
    542         char *pa = absolutize(path, &pa_size);
    543         if (!pa)
    544                 return ENOMEM;
     677        char *pa = vfs_absolutize(path, &pa_size);
     678        if (pa == NULL) {
     679                errno = ENOMEM;
     680                return -1;
     681        }
    545682       
    546683        async_exch_t *exch = vfs_exchange_begin();
     
    552689                free(pa);
    553690                async_wait_for(req, &rc_orig);
     691                if (rc_orig != EOK)
     692                        rc = rc_orig;
     693                if (rc != EOK) {
     694                        errno = rc;
     695                        return -1;
     696                }
     697        }
     698        rc = async_data_read_start(exch, stat, sizeof(struct stat));
     699        if (rc != EOK) {
     700                vfs_exchange_end(exch);
     701                free(pa);
     702                async_wait_for(req, &rc_orig);
     703                if (rc_orig != EOK)
     704                        rc = rc_orig;
     705                if (rc != EOK) {
     706                        errno = rc;
     707                        return -1;
     708                }
     709        }
     710        vfs_exchange_end(exch);
     711        free(pa);
     712        async_wait_for(req, &rc);
     713        if (rc != EOK) {
     714                errno = rc;
     715                return -1;
     716        }
     717        return 0;
     718}
     719
     720/** Open directory.
     721 *
     722 * @param dirname Directory pathname
     723 *
     724 * @return Non-NULL pointer on success. On error returns @c NULL and sets errno.
     725 */
     726DIR *opendir(const char *dirname)
     727{
     728        DIR *dirp = malloc(sizeof(DIR));
     729        int fd = -1;
     730       
     731        if (dirp == NULL) {
     732                errno = ENOMEM;
     733                return NULL;
     734        }
     735       
     736        size_t abs_size;
     737        char *abs = vfs_absolutize(dirname, &abs_size);
     738        if (abs == NULL) {
     739                free(dirp);
     740                errno = ENOMEM;
     741                return NULL;
     742        }
     743       
     744        int rc = open_internal(abs, abs_size, L_DIRECTORY, 0, &fd);
     745        free(abs);
     746       
     747        if (rc != EOK) {
     748                free(dirp);
     749                errno = rc;
     750                return NULL;
     751        }
     752       
     753        dirp->fd = fd;
     754        return dirp;
     755}
     756
     757/** Read directory entry.
     758 *
     759 * @param dirp Open directory
     760 * @return Non-NULL pointer to directory entry on success. On error returns
     761 *         @c NULL and sets errno.
     762 */
     763struct dirent *readdir(DIR *dirp)
     764{
     765        int rc;
     766        ssize_t len;
     767       
     768        rc = _read_short(dirp->fd, &dirp->res.d_name[0], NAME_MAX + 1, &len);
     769        if (rc != EOK) {
     770                errno = rc;
     771                return NULL;
     772        }
     773       
     774        (void) len;
     775        return &dirp->res;
     776}
     777
     778/** Rewind directory position to the beginning.
     779 *
     780 * @param dirp Open directory
     781 */
     782void rewinddir(DIR *dirp)
     783{
     784        (void) lseek(dirp->fd, 0, SEEK_SET);
     785}
     786
     787/** Close directory.
     788 *
     789 * @param dirp Open directory
     790 * @return 0 on success. On error returns -1 and sets errno.
     791 */
     792int closedir(DIR *dirp)
     793{
     794        int rc;
     795       
     796        rc = close(dirp->fd);
     797        free(dirp);
     798
     799        /* On error errno was set by close() */
     800        return rc;
     801}
     802
     803/** Create directory.
     804 *
     805 * @param path Path
     806 * @param mode File mode
     807 * @return 0 on success. On error returns -1 and sets errno.
     808 */
     809int mkdir(const char *path, mode_t mode)
     810{
     811        sysarg_t rc;
     812        aid_t req;
     813       
     814        size_t pa_size;
     815        char *pa = vfs_absolutize(path, &pa_size);
     816        if (pa == NULL) {
     817                errno = ENOMEM;
     818                return -1;
     819        }
     820       
     821        async_exch_t *exch = vfs_exchange_begin();
     822       
     823        req = async_send_1(exch, VFS_IN_MKDIR, mode, NULL);
     824        rc = async_data_write_start(exch, pa, pa_size);
     825        if (rc != EOK) {
     826                vfs_exchange_end(exch);
     827                free(pa);
     828               
     829                sysarg_t rc_orig;
     830                async_wait_for(req, &rc_orig);
     831               
     832                if (rc_orig != EOK)
     833                        rc = rc_orig;
     834               
     835                if (rc != EOK) {
     836                        errno = rc;
     837                        return -1;
     838                }
     839               
     840                return 0;
     841        }
     842       
     843        vfs_exchange_end(exch);
     844        free(pa);
     845        async_wait_for(req, &rc);
     846       
     847        if (rc != EOK) {
     848                errno = rc;
     849                return -1;
     850        }
     851       
     852        return 0;
     853}
     854
     855/** Unlink a file or directory.
     856 *
     857 * @param path Path to file or empty directory
     858 * @param lflag L_xxx flag (L_NONE, L_FILE or L_DIRECTORY)
     859 * @return EOK on success, non-zero error code on error
     860 */
     861static int _unlink(const char *path, int lflag)
     862{
     863        sysarg_t rc;
     864        aid_t req;
     865       
     866        size_t pa_size;
     867        char *pa = vfs_absolutize(path, &pa_size);
     868        if (pa == NULL)
     869                return ENOMEM;
     870       
     871        async_exch_t *exch = vfs_exchange_begin();
     872       
     873        req = async_send_1(exch, VFS_IN_UNLINK, lflag, NULL);
     874        rc = async_data_write_start(exch, pa, pa_size);
     875        if (rc != EOK) {
     876                vfs_exchange_end(exch);
     877                free(pa);
     878
     879                sysarg_t rc_orig;
     880                async_wait_for(req, &rc_orig);
     881
    554882                if (rc_orig == EOK)
    555883                        return (int) rc;
     
    557885                        return (int) rc_orig;
    558886        }
    559         rc = async_data_read_start(exch, stat, sizeof(struct stat));
    560         if (rc != EOK) {
    561                 vfs_exchange_end(exch);
    562                 free(pa);
    563                 async_wait_for(req, &rc_orig);
    564                 if (rc_orig == EOK)
    565                         return (int) rc;
    566                 else
    567                         return (int) rc_orig;
    568         }
    569887        vfs_exchange_end(exch);
    570888        free(pa);
     
    573891}
    574892
    575 DIR *opendir(const char *dirname)
    576 {
    577         DIR *dirp = malloc(sizeof(DIR));
    578         if (!dirp)
    579                 return NULL;
    580        
    581         size_t abs_size;
    582         char *abs = absolutize(dirname, &abs_size);
    583         if (!abs) {
    584                 free(dirp);
    585                 return NULL;
    586         }
    587        
    588         int ret = open_internal(abs, abs_size, L_DIRECTORY, 0);
    589         free(abs);
    590        
    591         if (ret < 0) {
    592                 free(dirp);
    593                 return NULL;
    594         }
    595        
    596         dirp->fd = ret;
    597         return dirp;
    598 }
    599 
    600 struct dirent *readdir(DIR *dirp)
    601 {
    602         ssize_t len = read(dirp->fd, &dirp->res.d_name[0], NAME_MAX + 1);
    603         if (len <= 0)
    604                 return NULL;
    605         return &dirp->res;
    606 }
    607 
    608 void rewinddir(DIR *dirp)
    609 {
    610         (void) lseek(dirp->fd, 0, SEEK_SET);
    611 }
    612 
    613 int closedir(DIR *dirp)
    614 {
    615         (void) close(dirp->fd);
    616         free(dirp);
     893/** Unlink file or directory.
     894 *
     895 * @param path Path
     896 * @return EOk on success, error code on error
     897 */
     898int unlink(const char *path)
     899{
     900        int rc;
     901
     902        rc = _unlink(path, L_NONE);
     903        if (rc != EOK) {
     904                errno = rc;
     905                return -1;
     906        }
     907
    617908        return 0;
    618909}
    619910
    620 int mkdir(const char *path, mode_t mode)
    621 {
    622         sysarg_t rc;
    623         aid_t req;
    624        
    625         size_t pa_size;
    626         char *pa = absolutize(path, &pa_size);
    627         if (!pa)
    628                 return ENOMEM;
    629        
    630         async_exch_t *exch = vfs_exchange_begin();
    631        
    632         req = async_send_1(exch, VFS_IN_MKDIR, mode, NULL);
    633         rc = async_data_write_start(exch, pa, pa_size);
    634         if (rc != EOK) {
    635                 vfs_exchange_end(exch);
    636                 free(pa);
    637 
    638                 sysarg_t rc_orig;
    639                 async_wait_for(req, &rc_orig);
    640 
    641                 if (rc_orig == EOK)
    642                         return (int) rc;
    643                 else
    644                         return (int) rc_orig;
    645         }
    646         vfs_exchange_end(exch);
    647         free(pa);
    648         async_wait_for(req, &rc);
    649         return rc;
    650 }
    651 
    652 static int _unlink(const char *path, int lflag)
    653 {
    654         sysarg_t rc;
    655         aid_t req;
    656        
    657         size_t pa_size;
    658         char *pa = absolutize(path, &pa_size);
    659         if (!pa)
    660                 return ENOMEM;
    661        
    662         async_exch_t *exch = vfs_exchange_begin();
    663        
    664         req = async_send_1(exch, VFS_IN_UNLINK, lflag, NULL);
    665         rc = async_data_write_start(exch, pa, pa_size);
    666         if (rc != EOK) {
    667                 vfs_exchange_end(exch);
    668                 free(pa);
    669 
    670                 sysarg_t rc_orig;
    671                 async_wait_for(req, &rc_orig);
    672 
    673                 if (rc_orig == EOK)
    674                         return (int) rc;
    675                 else
    676                         return (int) rc_orig;
    677         }
    678         vfs_exchange_end(exch);
    679         free(pa);
    680         async_wait_for(req, &rc);
    681         return rc;
    682 }
    683 
    684 int unlink(const char *path)
    685 {
    686         return _unlink(path, L_NONE);
    687 }
    688 
     911/** Remove empty directory.
     912 *
     913 * @param path Path
     914 * @return 0 on success. On error returns -1 and sets errno.
     915 */
    689916int rmdir(const char *path)
    690917{
    691         return _unlink(path, L_DIRECTORY);
    692 }
    693 
     918        int rc;
     919
     920        rc = _unlink(path, L_DIRECTORY);
     921        if (rc != EOK) {
     922                errno = rc;
     923                return -1;
     924        }
     925
     926        return 0;
     927}
     928
     929/** Rename directory entry.
     930 *
     931 * @param old Old name
     932 * @param new New name
     933 *
     934 * @return 0 on success. On error returns -1 and sets errno.
     935 */
    694936int rename(const char *old, const char *new)
    695937{
     
    699941       
    700942        size_t olda_size;
    701         char *olda = absolutize(old, &olda_size);
    702         if (!olda)
    703                 return ENOMEM;
     943        char *olda = vfs_absolutize(old, &olda_size);
     944        if (olda == NULL) {
     945                errno = ENOMEM;
     946                return -1;
     947        }
    704948
    705949        size_t newa_size;
    706         char *newa = absolutize(new, &newa_size);
    707         if (!newa) {
     950        char *newa = vfs_absolutize(new, &newa_size);
     951        if (newa == NULL) {
    708952                free(olda);
    709                 return ENOMEM;
     953                errno = ENOMEM;
     954                return -1;
    710955        }
    711956       
     
    719964                free(newa);
    720965                async_wait_for(req, &rc_orig);
    721                 if (rc_orig == EOK)
    722                         return (int) rc;
    723                 else
    724                         return (int) rc_orig;
     966                if (rc_orig != EOK)
     967                        rc = rc_orig;
     968                if (rc != EOK) {
     969                        errno = rc;
     970                        return -1;
     971                }
     972                return 0;
    725973        }
    726974        rc = async_data_write_start(exch, newa, newa_size);
     
    730978                free(newa);
    731979                async_wait_for(req, &rc_orig);
    732                 if (rc_orig == EOK)
    733                         return (int) rc;
    734                 else
    735                         return (int) rc_orig;
     980                if (rc_orig != EOK)
     981                        rc = rc_orig;
     982                if (rc != EOK) {
     983                        errno = rc;
     984                        return -1;
     985                }
     986                return 0;
    736987        }
    737988        vfs_exchange_end(exch);
     
    739990        free(newa);
    740991        async_wait_for(req, &rc);
    741         return rc;
    742 }
    743 
     992
     993        if (rc != EOK) {
     994                errno = rc;
     995                return -1;
     996        }
     997
     998        return 0;
     999}
     1000
     1001/** Remove directory entry.
     1002 *
     1003 * @param path Path
     1004 * @return 0 on success. On error returns -1 and sets errno.
     1005 */
    7441006int remove(const char *path)
    7451007{
     
    7471009}
    7481010
     1011/** Change working directory.
     1012 *
     1013 * @param path Path
     1014 * @return 0 on success. On error returns -1 and sets errno.
     1015 */
    7491016int chdir(const char *path)
    7501017{
    7511018        size_t abs_size;
    752         char *abs = absolutize(path, &abs_size);
    753         if (!abs)
    754                 return ENOMEM;
    755        
    756         int fd = open_internal(abs, abs_size, L_DIRECTORY, O_DESC);
    757        
    758         if (fd < 0) {
     1019        char *abs = vfs_absolutize(path, &abs_size);
     1020        int fd = -1;
     1021       
     1022        if (abs == NULL) {
     1023                errno = ENOMEM;
     1024                return -1;
     1025        }
     1026       
     1027        int rc = open_internal(abs, abs_size, L_DIRECTORY, O_DESC, &fd);
     1028       
     1029        if (rc != EOK) {
    7591030                free(abs);
    760                 return ENOENT;
     1031                errno = rc;
     1032                return -1;
    7611033        }
    7621034       
     
    7651037        if (cwd_fd >= 0)
    7661038                close(cwd_fd);
    767        
    7681039       
    7691040        if (cwd_path)
     
    7751046       
    7761047        fibril_mutex_unlock(&cwd_mutex);
    777         return EOK;
    778 }
    779 
     1048        return 0;
     1049}
     1050
     1051/** Get current working directory path.
     1052 *
     1053 * @param buf Buffer
     1054 * @param size Size of @a buf
     1055 * @return On success returns @a buf. On failure returns @c NULL and sets errno.
     1056 */
    7801057char *getcwd(char *buf, size_t size)
    7811058{
    782         if (size == 0)
     1059        if (size == 0) {
     1060                errno = EINVAL;
    7831061                return NULL;
     1062        }
    7841063       
    7851064        fibril_mutex_lock(&cwd_mutex);
     
    7871066        if ((cwd_size == 0) || (size < cwd_size + 1)) {
    7881067                fibril_mutex_unlock(&cwd_mutex);
     1068                errno = ERANGE;
    7891069                return NULL;
    7901070        }
     
    7961076}
    7971077
    798 async_sess_t *fd_session(exch_mgmt_t mgmt, int fildes)
     1078/** Open session to service represented by a special file.
     1079 *
     1080 * Given that the file referred to by @a fildes represents a service,
     1081 * open a session to that service.
     1082 *
     1083 * @param fildes File descriptor
     1084 * @param iface Interface to connect to (XXX Should be automatic)
     1085 * @return On success returns session pointer. On error returns @c NULL.
     1086 */
     1087async_sess_t *vfs_fd_session(int fildes, iface_t iface)
    7991088{
    8001089        struct stat stat;
    8011090        int rc = fstat(fildes, &stat);
    802         if (rc != 0) {
    803                 errno = rc;
     1091        if (rc != 0)
    8041092                return NULL;
    805         }
    806        
    807         if (!stat.service) {
    808                 errno = ENOENT;
     1093       
     1094        if (stat.service == 0)
    8091095                return NULL;
    810         }
    811        
    812         return loc_service_connect(mgmt, stat.service, 0);
    813 }
    814 
     1096       
     1097        return loc_service_connect(stat.service, iface, 0);
     1098}
     1099
     1100/** Duplicate open file.
     1101 *
     1102 * Duplicate open file under a new file descriptor.
     1103 *
     1104 * @param oldfd Old file descriptor
     1105 * @param newfd New file descriptor
     1106 * @return 0 on success. On error -1 is returned and errno is set
     1107 */
    8151108int dup2(int oldfd, int newfd)
    8161109{
     
    8231116       
    8241117        if (rc == EOK)
    825                 return (int) ret;
    826        
    827         return (int) rc;
    828 }
    829 
    830 int fd_wait(void)
     1118                rc = ret;
     1119       
     1120        if (rc != EOK) {
     1121                errno = rc;
     1122                return -1;
     1123        }
     1124       
     1125        return 0;
     1126}
     1127
     1128int vfs_fd_wait(void)
    8311129{
    8321130        async_exch_t *exch = vfs_exchange_begin();
     
    8431141}
    8441142
    845 int get_mtab_list(list_t *mtab_list)
     1143int vfs_get_mtab_list(list_t *mtab_list)
    8461144{
    8471145        sysarg_t rc;
     
    8631161
    8641162                mtab_ent = malloc(sizeof(mtab_ent_t));
    865                 if (!mtab_ent) {
     1163                if (mtab_ent == NULL) {
    8661164                        rc = ENOMEM;
    8671165                        goto exit;
     
    9041202}
    9051203
     1204/** Get filesystem statistics.
     1205 *
     1206 * @param path Mount point path
     1207 * @param st Buffer for storing information
     1208 * @return 0 on success. On error -1 is returned and errno is set.
     1209 */
    9061210int statfs(const char *path, struct statfs *st)
    9071211{
     
    9101214        size_t pa_size;
    9111215
    912         char *pa = absolutize(path, &pa_size);
    913         if (!pa)
    914                 return ENOMEM;
     1216        char *pa = vfs_absolutize(path, &pa_size);
     1217        if (pa == NULL) {
     1218                errno = ENOMEM;
     1219                return -1;
     1220        }
    9151221
    9161222        async_exch_t *exch = vfs_exchange_begin();
     
    9271233        free(pa);
    9281234        async_wait_for(req, &rc_orig);
    929         return (int) (rc_orig != EOK ? rc_orig : rc);
     1235        rc = (rc_orig != EOK ? rc_orig : rc);
     1236
     1237        if (rc != EOK) {
     1238                errno = rc;
     1239                return -1;
     1240        }
     1241
     1242        return 0;
    9301243}
    9311244
Note: See TracChangeset for help on using the changeset viewer.