Changeset 7ab7075f in mainline


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.

Location:
uspace
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/tester/stdio/stdio2.c

    r7afd12e5 r7ab7075f  
    3737{
    3838        FILE *file;
    39         const char *file_name = "/test";
     39        const char *file_name = "/tmp/test";
    4040
    4141        TPRINTF("Open file \"%s\" for writing...", file_name);
    4242        errno = 0;
    43         file = fopen(file_name, "wt");
     43        file = fopen(file_name, "wtx");
    4444        if (file == NULL) {
    4545                TPRINTF("errno = %s\n", str_error_name(errno));
  • 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;
  • uspace/lib/c/test/stdio.c

    r7afd12e5 r7ab7075f  
    6262        PCUT_ASSERT_TRUE(rc != 0);
    6363
    64         f = fopen(buf, "w");
     64        f = fopen(buf, "wx");
    6565        PCUT_ASSERT_NOT_NULL(f);
    6666        fclose(f);
     
    9292        PCUT_ASSERT_NOT_NULL(p);
    9393
    94         f = fopen(buf1, "w");
     94        f = fopen(buf1, "wx");
    9595        PCUT_ASSERT_NOT_NULL(f);
    9696        fclose(f);
     
    142142        PCUT_ASSERT_NOT_NULL(p);
    143143
    144         f = fopen(p, "w+");
     144        f = fopen(p, "w+x");
    145145        PCUT_ASSERT_NOT_NULL(f);
    146146        (void) remove(p);
     
    174174        PCUT_ASSERT_NOT_NULL(p);
    175175
    176         f = fopen(p, "w+");
     176        f = fopen(p, "w+x");
    177177        PCUT_ASSERT_NOT_NULL(f);
    178178        (void) remove(p);
  • uspace/lib/posix/test/stdio.c

    r7afd12e5 r7ab7075f  
    4747            str_length("/tmp/tmp.")) == 0);
    4848
    49         f = fopen(p, "w+");
     49        f = fopen(p, "w+x");
    5050        PCUT_ASSERT_NOT_NULL(f);
    5151
     
    6666            str_length("/tmp/tmp.")) == 0);
    6767
    68         f = fopen(p, "w+");
     68        f = fopen(p, "w+x");
    6969        PCUT_ASSERT_NOT_NULL(f);
    7070
     
    8585            str_length(P_tmpdir "/tmp.")) == 0);
    8686
    87         f = fopen(p, "w+");
     87        f = fopen(p, "w+x");
    8888        PCUT_ASSERT_NOT_NULL(f);
    8989
  • uspace/lib/sif/src/sif.c

    r7afd12e5 r7ab7075f  
    203203        }
    204204
    205         f = fopen(fname, "w");
     205        f = fopen(fname, "wx");
    206206        if (f == NULL) {
    207207                rc = EIO;
Note: See TracChangeset for help on using the changeset viewer.