4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering#pragma once
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering/***
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering This file is part of systemd.
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering Copyright 2010 Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering systemd is free software; you can redistribute it and/or modify it
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering under the terms of the GNU Lesser General Public License as published by
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering (at your option) any later version.
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering systemd is distributed in the hope that it will be useful, but
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering Lesser General Public License for more details.
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering You should have received a copy of the GNU Lesser General Public License
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering***/
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering#include <inttypes.h>
11c3a36649e5e5e77db499c92f3cdcbd619efd3aThomas Hindoe Paaboel Andersen#include <stddef.h>
11c3a36649e5e5e77db499c92f3cdcbd619efd3aThomas Hindoe Paaboel Andersen#include <stdint.h>
71d35b6b5563817dfbe757ab9e3b9f018b2db491Thomas Hindoe Paaboel Andersen#include <sys/types.h>
c932fb71cc90461b88ecdffe47c071d001d78fb4Shawn Landden#include <uchar.h>
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
11c3a36649e5e5e77db499c92f3cdcbd619efd3aThomas Hindoe Paaboel Andersen#include "string-util.h"
c932fb71cc90461b88ecdffe47c071d001d78fb4Shawn Landden#include "missing.h"
11c3a36649e5e5e77db499c92f3cdcbd619efd3aThomas Hindoe Paaboel Andersen
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering/* What characters are special in the shell? */
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering/* must be escaped outside and inside double-quotes */
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering#define SHELL_NEED_ESCAPE "\"\\`$"
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering/* can be escaped or double-quoted */
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering#define SHELL_NEED_QUOTES SHELL_NEED_ESCAPE GLOB_CHARS "'()<>|&;"
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringtypedef enum UnescapeFlags {
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering UNESCAPE_RELAX = 1,
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering} UnescapeFlags;
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringchar *cescape(const char *s);
a5ef363808b100856783784654de9b6bf2110173Lennart Poetteringchar *cescape_length(const char *s, size_t n);
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringsize_t cescape_char(char c, char *buf);
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringint cunescape(const char *s, UnescapeFlags flags, char **ret);
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringint cunescape_length(const char *s, size_t length, UnescapeFlags flags, char **ret);
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringint cunescape_length_with_prefix(const char *s, size_t length, const char *prefix, UnescapeFlags flags, char **ret);
c932fb71cc90461b88ecdffe47c071d001d78fb4Shawn Landdenint cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit);
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringchar *xescape(const char *s, const char *bad);
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringchar *shell_escape(const char *s, const char *bad);
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poetteringchar *shell_maybe_quote(const char *s);