Changeset 7ab7075f in mainline for uspace/lib/c/generic/io/io.c


Ignore:
Timestamp:
2018-08-06T18:40:12Z (6 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1dcba91
Parents:
7afd12e5
Message:

Add support for 'x' fopen file mode modifier from C11.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/io.c

    r7afd12e5 r7ab7075f  
    185185}
    186186
    187 static bool parse_mode(const char *fmode, int *mode, bool *create, bool *truncate)
     187static bool parse_mode(const char *fmode, int *mode, bool *create, bool *excl,
     188    bool *truncate)
    188189{
    189190        /* Parse mode except first character. */
    190191        const char *mp = fmode;
    191         if (*mp++ == 0) {
     192
     193        if (*mp++ == '\0') {
    192194                errno = EINVAL;
    193195                return false;
     
    201203                mp++;
    202204                plus = true;
    203         } else
     205        } else {
    204206                plus = false;
    205 
    206         if (*mp != 0) {
     207        }
     208
     209        bool ex;
     210        if (*mp == 'x') {
     211                mp++;
     212                ex = true;
     213        } else {
     214                ex = false;
     215        }
     216
     217        if (*mp != '\0') {
    207218                errno = EINVAL;
    208219                return false;
     
    211222        *create = false;
    212223        *truncate = false;
     224        *excl = false;
    213225
    214226        /* Parse first character of fmode and determine mode for vfs_open(). */
     
    216228        case 'r':
    217229                *mode = plus ? MODE_READ | MODE_WRITE : MODE_READ;
     230                if (ex) {
     231                        errno = EINVAL;
     232                        return false;
     233                }
    218234                break;
    219235        case 'w':
    220236                *mode = plus ? MODE_READ | MODE_WRITE : MODE_WRITE;
    221237                *create = true;
     238                *excl = ex;
    222239                if (!plus)
    223240                        *truncate = true;
     
    227244                if (plus) {
    228245                        errno = ENOTSUP;
     246                        return false;
     247                }
     248
     249                if (ex) {
     250                        errno = EINVAL;
    229251                        return false;
    230252                }
     
    307329 *
    308330 * @param path Path of the file to open.
    309  * @param mode Mode string, (r|w|a)[b|t][+].
     331 * @param mode Mode string, (r|w|a)[b|t][+][x].
    310332 *
    311333 */
     
    314336        int mode;
    315337        bool create;
     338        bool excl;
    316339        bool truncate;
    317340
    318         if (!parse_mode(fmode, &mode, &create, &truncate))
     341        if (!parse_mode(fmode, &mode, &create, &excl, &truncate))
    319342                return NULL;
    320343
     
    327350
    328351        int flags = WALK_REGULAR;
    329         if (create)
     352        if (create && excl)
     353                flags |= WALK_MUST_CREATE;
     354        else if (create)
    330355                flags |= WALK_MAY_CREATE;
    331356        int file;
Note: See TracChangeset for help on using the changeset viewer.