static int local_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,

                       int flags, FsCred *credp)

{

    char *path;

    int fd = -1;

    int err = -1;

    int serrno = 0;

    V9fsString fullname;

    char buffer[PATH_MAX];



    v9fs_string_init(&fullname);

    v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);

    path = fullname.data;



    /* Determine the security model */

    if (fs_ctx->fs_sm == SM_MAPPED) {

        fd = open(rpath(fs_ctx, path, buffer), flags, SM_LOCAL_MODE_BITS);

        if (fd == -1) {

            err = fd;

            goto out;

        }

        credp->fc_mode = credp->fc_mode|S_IFREG;

        /* Set cleint credentials in xattr */

        err = local_set_xattr(rpath(fs_ctx, path, buffer), credp);

        if (err == -1) {

            serrno = errno;

            goto err_end;

        }

    } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) ||

               (fs_ctx->fs_sm == SM_NONE)) {

        fd = open(rpath(fs_ctx, path, buffer), flags, credp->fc_mode);

        if (fd == -1) {

            err = fd;

            goto out;

        }

        err = local_post_create_passthrough(fs_ctx, path, credp);

        if (err == -1) {

            serrno = errno;

            goto err_end;

        }

    }

    err = fd;

    goto out;



err_end:

    close(fd);

    remove(rpath(fs_ctx, path, buffer));

    errno = serrno;

out:

    v9fs_string_free(&fullname);

    return err;

}

static int local_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,

                       int flags, FsCred *credp)

{

    char *path;

    int fd = -1;

    int err = -1;

    int serrno = 0;

    V9fsString fullname;

    char buffer[PATH_MAX];



    v9fs_string_init(&fullname);

    v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);

    path = fullname.data;



    

    if (fs_ctx->fs_sm == SM_MAPPED) {

        fd = open(rpath(fs_ctx, path, buffer), flags, SM_LOCAL_MODE_BITS);

        if (fd == -1) {

            err = fd;

            goto out;

        }

        credp->fc_mode = credp->fc_mode|S_IFREG;

        

        err = local_set_xattr(rpath(fs_ctx, path, buffer), credp);

        if (err == -1) {

            serrno = errno;

            goto err_end;

        }

    } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) ||

               (fs_ctx->fs_sm == SM_NONE)) {

        fd = open(rpath(fs_ctx, path, buffer), flags, credp->fc_mode);

        if (fd == -1) {

            err = fd;

            goto out;

        }

        err = local_post_create_passthrough(fs_ctx, path, credp);

        if (err == -1) {

            serrno = errno;

            goto err_end;

        }

    }

    err = fd;

    goto out;



err_end:

    close(fd);

    remove(rpath(fs_ctx, path, buffer));

    errno = serrno;

out:

    v9fs_string_free(&fullname);

    return err;

}

static int FUNC_0(FsContext *VAR_0, V9fsPath *VAR_1, const char *VAR_2,

                       int VAR_3, FsCred *VAR_4)

{

    char *VAR_5;

    int VAR_6 = -1;

    int VAR_7 = -1;

    int VAR_8 = 0;

    V9fsString fullname;

    char VAR_9[PATH_MAX];



    v9fs_string_init(&fullname);

    v9fs_string_sprintf(&fullname, "%s/%s", VAR_1->data, VAR_2);

    VAR_5 = fullname.data;



    

    if (VAR_0->fs_sm == SM_MAPPED) {

        VAR_6 = open(rpath(VAR_0, VAR_5, VAR_9), VAR_3, SM_LOCAL_MODE_BITS);

        if (VAR_6 == -1) {

            VAR_7 = VAR_6;

            goto out;

        }

        VAR_4->fc_mode = VAR_4->fc_mode|S_IFREG;

        

        VAR_7 = local_set_xattr(rpath(VAR_0, VAR_5, VAR_9), VAR_4);

        if (VAR_7 == -1) {

            VAR_8 = errno;

            goto err_end;

        }

    } else if ((VAR_0->fs_sm == SM_PASSTHROUGH) ||

               (VAR_0->fs_sm == SM_NONE)) {

        VAR_6 = open(rpath(VAR_0, VAR_5, VAR_9), VAR_3, VAR_4->fc_mode);

        if (VAR_6 == -1) {

            VAR_7 = VAR_6;

            goto out;

        }

        VAR_7 = local_post_create_passthrough(VAR_0, VAR_5, VAR_4);

        if (VAR_7 == -1) {

            VAR_8 = errno;

            goto err_end;

        }

    }

    VAR_7 = VAR_6;

    goto out;



err_end:

    close(VAR_6);

    remove(rpath(VAR_0, VAR_5, VAR_9));

    errno = VAR_8;

out:

    v9fs_string_free(&fullname);

    return VAR_7;

}

static int FUNC_0(FsContext *VAR_0, V9fsPath *VAR_1, const char *VAR_2,
int VAR_3, FsCred *VAR_4)
{ char *VAR_5; int VAR_6 = -1; int VAR_7 = -1; int VAR_8 = 0; V9fsString fullname; char VAR_9[PATH_MAX]; v9fs_string_init(&fullname); v9fs_string_sprintf(&fullname, "%s/%s", VAR_1->data, VAR_2); VAR_5 = fullname.data; if (VAR_0->fs_sm == SM_MAPPED) { VAR_6 = open(rpath(VAR_0, VAR_5, VAR_9), VAR_3, SM_LOCAL_MODE_BITS); if (VAR_6 == -1) { VAR_7 = VAR_6; goto out; } VAR_4->fc_mode = VAR_4->fc_mode|S_IFREG; VAR_7 = local_set_xattr(rpath(VAR_0, VAR_5, VAR_9), VAR_4); if (VAR_7 == -1) { VAR_8 = errno; goto err_end; } } else if ((VAR_0->fs_sm == SM_PASSTHROUGH) || (VAR_0->fs_sm == SM_NONE)) { VAR_6 = open(rpath(VAR_0, VAR_5, VAR_9), VAR_3, VAR_4->fc_mode); if (VAR_6 == -1) { VAR_7 = VAR_6; goto out; } VAR_7 = local_post_create_passthrough(VAR_0, VAR_5, VAR_4); if (VAR_7 == -1) { VAR_8 = errno; goto err_end; } } VAR_7 = VAR_6; goto out; err_end:
close(VAR_6); remove(rpath(VAR_0, VAR_5, VAR_9)); errno = VAR_8; out:
v9fs_string_free(&fullname); return VAR_7; }