Implement missing fuse_opt_add_opt(3) and fuse_opt_add_opt_escaped(3)
This commit is contained in:
parent
7768b99586
commit
111da591d5
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: fuse_opt.h,v 1.6 2016/01/22 22:39:29 dholland Exp $ */
|
||||
/* $NetBSD: fuse_opt.h,v 1.7 2016/11/14 17:19:29 pho Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Alistair Crooks. All rights reserved.
|
||||
|
@ -61,6 +61,7 @@ struct fuse_args *fuse_opt_deep_copy_args(int, char **);
|
|||
void fuse_opt_free_args(struct fuse_args *);
|
||||
int fuse_opt_insert_arg(struct fuse_args *, int, const char *);
|
||||
int fuse_opt_add_opt(char **, const char *);
|
||||
int fuse_opt_add_opt_escaped(char **, const char *);
|
||||
int fuse_opt_parse(struct fuse_args *, void *,
|
||||
const struct fuse_opt *, fuse_opt_proc_t);
|
||||
int fuse_opt_match(const struct fuse_opt *, const char *);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: refuse.3,v 1.9 2014/03/18 18:20:38 riastradh Exp $
|
||||
.\" $NetBSD: refuse.3,v 1.10 2016/11/14 17:19:29 pho Exp $
|
||||
.\"
|
||||
.\" Copyright © 2007 Alistair Crooks. All rights reserved.
|
||||
.\"
|
||||
|
@ -26,7 +26,7 @@
|
|||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
.\" SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd April 30, 2007
|
||||
.Dd November 15, 2016
|
||||
.Dt REFUSE 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
@ -40,11 +40,31 @@
|
|||
.Fo fuse_main
|
||||
.Fa "int argc" "char **argv" "const struct fuse_operations *"
|
||||
.Fc
|
||||
.Ft struct fuse_args
|
||||
.Fo FUSE_ARGS_INIT
|
||||
.Fa "int argc" "char **argv"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo fuse_opt_add_arg
|
||||
.Fa "struct fuse_args *args" "const char *arg"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo fuse_opt_add_opt
|
||||
.Fa "char **opts" "const char *opt"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo fuse_opt_add_opt_escaped
|
||||
.Fa "char **opts" "const char *opt"
|
||||
.Fc
|
||||
.Ft void
|
||||
.Fo fuse_opt_free_args
|
||||
.Fa "struct fuse_args *args"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo fuse_opt_insert_arg
|
||||
.Fa "struct fuse_args *args" "int pos" "const char *arg"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo fuse_opt_parse
|
||||
.Fa "struct fuse_args *args" "void *userdata"
|
||||
.Fa "const struct fuse_opt *descriptions" "fuse_opt_proc_t processingfunc"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: refuse_opt.c,v 1.15 2011/03/01 11:23:42 soda Exp $ */
|
||||
/* $NetBSD: refuse_opt.c,v 1.16 2016/11/14 17:19:29 pho Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2007 Juan Romero Pardines.
|
||||
|
@ -39,6 +39,7 @@
|
|||
#include <err.h>
|
||||
#include <fuse.h>
|
||||
#include <fuse_opt.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@ -64,22 +65,8 @@ struct fuse_opt_option {
|
|||
|
||||
static int fuse_opt_popt(struct fuse_opt_option *, const struct fuse_opt *);
|
||||
|
||||
/*
|
||||
/*
|
||||
* Public API.
|
||||
*
|
||||
* The following functions always return 0:
|
||||
*
|
||||
* int fuse_opt_add_opt(char **, const char *);
|
||||
*
|
||||
* We implement the next ones:
|
||||
*
|
||||
* int fuse_opt_add_arg(struct fuse_args *, const char *);
|
||||
* void fuse_opt_free_args(struct fuse_args *);
|
||||
* int fuse_opt_insert_arg(struct fuse_args *, const char *);
|
||||
* int fuse_opt_match(const struct fuse_opt *, const char *);
|
||||
* int fuse_opt_parse(struct fuse_args *, void *,
|
||||
* const struct fuse_opt *, fuse_opt_proc_t);
|
||||
*
|
||||
*/
|
||||
|
||||
/* ARGSUSED */
|
||||
|
@ -180,12 +167,44 @@ fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static int add_opt(char **opts, const char *opt, bool escape)
|
||||
{
|
||||
const size_t orig_len = *opts == NULL ? 0 : strlen(*opts);
|
||||
char* buf = realloc(*opts, orig_len + 1 + strlen(opt) * 2 + 1);
|
||||
|
||||
if (buf == NULL) {
|
||||
return -1;
|
||||
}
|
||||
*opts = buf;
|
||||
|
||||
if (orig_len > 0) {
|
||||
buf += orig_len;
|
||||
*buf++ = ',';
|
||||
}
|
||||
|
||||
for (; *opt; opt++) {
|
||||
if (escape && (*opt == ',' || *opt == '\\')) {
|
||||
*buf++ = '\\';
|
||||
}
|
||||
*buf++ = *opt;
|
||||
}
|
||||
*buf = '\0';
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fuse_opt_add_opt(char **opts, const char *opt)
|
||||
{
|
||||
DPRINTF(("%s: arguments passed: [opts=%s] [opt=%s]\n",
|
||||
__func__, *opts, opt));
|
||||
return 0;
|
||||
return add_opt(opts, opt, false);
|
||||
}
|
||||
|
||||
int fuse_opt_add_opt_escaped(char **opts, const char *opt)
|
||||
{
|
||||
DPRINTF(("%s: arguments passed: [opts=%s] [opt=%s]\n",
|
||||
__func__, *opts, opt));
|
||||
return add_opt(opts, opt, true);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
/* $NetBSD: t_refuse_opt.c,v 1.1 2016/11/14 16:10:31 pho Exp $ */
|
||||
/* $NetBSD: t_refuse_opt.c,v 1.2 2016/11/14 17:19:29 pho Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2011 The NetBSD Foundation, Inc.
|
||||
* Copyright (c) 2016 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Jukka Ruohonen.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
|
@ -29,7 +26,7 @@
|
|||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: t_refuse_opt.c,v 1.1 2016/11/14 16:10:31 pho Exp $");
|
||||
__RCSID("$NetBSD: t_refuse_opt.c,v 1.2 2016/11/14 17:19:29 pho Exp $");
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
|
@ -85,13 +82,28 @@ ATF_TC_BODY(efuse_opt_add_opt, tc)
|
|||
{
|
||||
char* opt = NULL;
|
||||
|
||||
atf_tc_expect_death("fuse_opt_add_opt(3) is not implemented yet");
|
||||
RZ(fuse_opt_add_opt(&opt, "fo\\o"));
|
||||
ATF_CHECK_STREQ(opt, "fo\\o");
|
||||
|
||||
RZ(fuse_opt_add_opt(&opt, "foo"));
|
||||
ATF_CHECK_STREQ(opt, "foo");
|
||||
RZ(fuse_opt_add_opt(&opt, "ba,r"));
|
||||
ATF_CHECK_STREQ(opt, "fo\\o,ba,r");
|
||||
}
|
||||
|
||||
RZ(fuse_opt_add_opt(&opt, "b\\a,r"));
|
||||
ATF_CHECK_STREQ(opt, "foo,b\\a,r");
|
||||
ATF_TC(efuse_opt_add_opt_escaped);
|
||||
ATF_TC_HEAD(efuse_opt_add_opt_escaped, tc)
|
||||
{
|
||||
atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_add_opt_escaped(3) works");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(efuse_opt_add_opt_escaped, tc)
|
||||
{
|
||||
char* opt = NULL;
|
||||
|
||||
RZ(fuse_opt_add_opt_escaped(&opt, "fo\\o"));
|
||||
ATF_CHECK_STREQ(opt, "fo\\\\o");
|
||||
|
||||
RZ(fuse_opt_add_opt_escaped(&opt, "ba,r"));
|
||||
ATF_CHECK_STREQ(opt, "fo\\\\o,ba\\,r");
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
|
@ -99,6 +111,7 @@ ATF_TP_ADD_TCS(tp)
|
|||
ATF_TP_ADD_TC(tp, efuse_opt_add_arg);
|
||||
ATF_TP_ADD_TC(tp, efuse_opt_insert_arg);
|
||||
ATF_TP_ADD_TC(tp, efuse_opt_add_opt);
|
||||
ATF_TP_ADD_TC(tp, efuse_opt_add_opt_escaped);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue