2
0
mirror of https://gitlab.com/apparmor/apparmor synced 2025-09-01 23:05:11 +00:00

Compare commits

..

1 Commits

Author SHA1 Message Date
John Johansen
6e0b7ca20a parser: change priority so that it accumulates based on permissions
The current behavior of priority rules can be non-intuitive with
higher priority rules completely overriding lower priority rules even in
permissions not held in common. This behavior does have use cases but
its can be very confusing, and does not normal policy behavior

Eg.
  priority=0 allow r /**,
  priority=1 deny  w /**,

will result in no allowed permissions even though the deny rule is
only removing the w permission, beause the higher priority rule
completely over ride lower priority permissions sets (including
none shared permissions).

Instead move to tracking the priority at a per permission level. This
allows the w permission to still override at priority 1, while the
read permission is allowed at priority 0.

The final constructed state will still drop priority for the final
permission set on the state.

Note: this patch updates the equality tests for the cases where
the complete override behavior was being tested for.

The complete override behavior will be reintroduced in a future
patch with a keyword extension, enabling that behavior to be used
for ordered blocks etc.

Signed-off-by: John Johansen <john.johansen@canonical.com>
2025-02-06 12:24:04 -08:00
961 changed files with 5575 additions and 18061 deletions

3
.gitignore vendored
View File

@@ -237,7 +237,6 @@ tests/regression/apparmor/dbus_message
tests/regression/apparmor/dbus_service
tests/regression/apparmor/dbus_unrequested_reply
tests/regression/apparmor/deleted
tests/regression/apparmor/disconnected_mount_complain
tests/regression/apparmor/env_check
tests/regression/apparmor/environ
tests/regression/apparmor/exec
@@ -250,12 +249,10 @@ tests/regression/apparmor/fchown
tests/regression/apparmor/fd_inheritance
tests/regression/apparmor/fd_inheritor
tests/regression/apparmor/fork
tests/regression/apparmor/getcon_verify
tests/regression/apparmor/introspect
tests/regression/apparmor/io_uring
tests/regression/apparmor/link
tests/regression/apparmor/link_subset
tests/regression/apparmor/linkat_tmpfile
tests/regression/apparmor/mkdir
tests/regression/apparmor/mmap
tests/regression/apparmor/mount

View File

@@ -1,9 +1,3 @@
spec:
inputs:
build-test-images:
default: false
type: boolean
description: Explicitly build virtual machine images used by integration tests.
---
image: ubuntu:latest
@@ -19,10 +13,8 @@ workflow:
stages:
- build
- test
- spread
.ubuntu-common:
interruptible: true
before_script:
# Install build-dependencies by loading the package list from the ubuntu/debian cloud-init profile.
- printf '\e[0K%s:%s:%s[collapsed=true]\r\e[0K%s\n' section_start "$(date +%s)" install_deps "Installing dependencies..."
@@ -134,6 +126,19 @@ test-profiles:
- make -C profiles check-abstractions.d
- make -C profiles check-local
# Build the regression tests (don't run them because that needs kernel access)
test-build-regression:
stage: test
needs: ["build-all"]
extends:
- .ubuntu-common
script:
# Additional dependencies required by regression tests
- printf '\e[0K%s:%s:%s[collapsed=true]\r\e[0K%s\n' section_start "$(date +%s)" install_extra_deps "Installing additional dependencies..."
- apt-get install --no-install-recommends -y attr fuse-overlayfs libdbus-1-dev liburing-dev
- printf '\e[0K%s:%s:%s\r\e[0K\n' section_end "$(date +%s)" install_extra_deps
- make -C tests/regression/apparmor -j $(nproc)
shellcheck:
stage: test
needs: []
@@ -170,7 +175,6 @@ variables:
coverity:
stage: .post
interruptible: true
extends:
- .ubuntu-common
script:
@@ -192,146 +196,3 @@ coverity:
- "apparmor-*.tar.gz"
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PROJECT_PATH == "apparmor/apparmor"
.image-garden-x86_64:
stage: spread
interruptible: true
# TODO: use tagged release once container tagging is improved upstream.
image: registry.gitlab.com/zygoon/image-garden:latest
tags:
- linux
- x86_64
- kvm
variables:
ARCH: x86_64
GARDEN_DL_DIR: dl
CACHE_POLICY: pull-push
CACHE_COMPRESSION_LEVEL: fastest
before_script:
# Restore the mtime of the .image-garden.mk file. This helps make determine
# if there's actually something to do correctly. Git does not preserve the
# mtime of files during checkout.
- git restore-mtime .image-garden.mk
# Prepare the image in dry-run mode. This helps in debugging cache misses
# when files are not cached correctly by the runner, causing the build section
# below to always do hevy-duty work.
- printf '\e[0K%s:%s:%s[collapsed=true]\r\e[0K%s\n' section_start "$(date +%s)" prepare_image_dry_run "Prepare image (dry run)"
- image-garden make --dry-run --debug "$GARDEN_SYSTEM.$ARCH.run" "$GARDEN_SYSTEM.$ARCH.qcow2" "$GARDEN_SYSTEM.seed.iso" "$GARDEN_SYSTEM.user-data" "$GARDEN_SYSTEM.meta-data"
- printf '\e[0K%s:%s:%s\r\e[0K\n' section_end "$(date +%s)" prepare_image_dry_run
script:
# Prepare the image, for real.
- printf '\e[0K%s:%s:%s[collapsed=true]\r\e[0K%s\n' section_start "$(date +%s)" prepare_image "Prepare image"
# If there's nothing to do then remove all the files that we would normally
# cache so that GitLab skips the cache upload step. This saves significant
# time required to re-compress and upload unchanged content.
# The idea for how to do is is documented at
# https://olex.biz/2025/04/gitlab-ci-prevent-cache-reupload-without-changes/
# The GitLab issue requesting a proper feature is
# https://gitlab.com/gitlab-org/gitlab/-/issues/226068
- |
if image-garden make --question "$GARDEN_SYSTEM.$ARCH.run" "$GARDEN_SYSTEM.$ARCH.qcow2" "$GARDEN_SYSTEM.seed.iso" "$GARDEN_SYSTEM.user-data" "$GARDEN_SYSTEM.meta-data"; then
rm -f "$GARDEN_SYSTEM".* efi-code.*.img efi-vars.*.img
rm -rf "$GARDEN_DL_DIR"
else
image-garden make "$GARDEN_SYSTEM.$ARCH.run" "$GARDEN_SYSTEM.$ARCH.qcow2" "$GARDEN_SYSTEM.seed.iso" "$GARDEN_SYSTEM.user-data" "$GARDEN_SYSTEM.meta-data"
fi
- printf '\e[0K%s:%s:%s\r\e[0K\n' section_end "$(date +%s)" prepare_image
cache:
# Cache the base image (pre-customization).
- key: image-garden-base-${GARDEN_SYSTEM}.${ARCH}
policy: $CACHE_POLICY
when: always
paths:
- $GARDEN_DL_DIR
# Those are never mutated so they are safe to share.
- efi-code.*.img
- efi-vars.*.img
# Cache the customized system. This cache depends on .image-garden.mk file
# so that any customization updates are immediately acted upon.
- key:
prefix: image-garden-custom-${GARDEN_SYSTEM}.${ARCH}-
files:
- .image-garden.mk
policy: $CACHE_POLICY
when: always
paths:
- $GARDEN_SYSTEM.*
- $GARDEN_SYSTEM.seed.iso
- $GARDEN_SYSTEM.meta-data
- $GARDEN_SYSTEM.user-data
# This job builds and caches the image that the job below looks at.
image-ubuntu-cloud-24.04-x86_64:
extends: .image-garden-x86_64
variables:
GARDEN_SYSTEM: ubuntu-cloud-24.04
needs: []
dependencies: []
rules:
- if: $CI_COMMIT_TAG
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
paths:
- .image-garden.mk
- .gitlab-ci.yml
compare_to: "refs/heads/master"
- if: $CI_COMMIT_BRANCH && "$[[ inputs.build-test-images ]]" == "true"
.spread-x86_64:
extends: .image-garden-x86_64
variables:
# GitLab project identifier of zygoon/spread-dist can be seen on
# https://gitlab.com/zygoon/spread-dist, under the three-dot menu on
# top-right.
SPREAD_GITLAB_PROJECT_ID: "65375371"
# Git revision of spread to install.
# This must have been built via spread-dist.
# TODO: switch to upstream 1.0 release when available.
SPREAD_REV: 413817eda7bec07a3885e0717c178b965f8924e1
# Run all the tasks for a given system.
SPREAD_ARGS: "garden:$GARDEN_SYSTEM:"
SPREAD_GOARCH: amd64
before_script:
# Restore the mtime of the .image-garden.mk file. This helps make determine
# if there's actually something to do correctly. Git does not preserve the
# mtime of files during checkout.
- git restore-mtime .image-garden.mk
# Prepare the image in dry-run mode. This helps in debugging cache misses
# when files are not cached correctly by the runner, causing the build section
# below to always do hevy-duty work.
- printf '\e[0K%s:%s:%s[collapsed=true]\r\e[0K%s\n' section_start "$(date +%s)" prepare_image_dry_run "Prepare image (dry run)"
- image-garden make --dry-run --debug "$GARDEN_SYSTEM.$ARCH.run" "$GARDEN_SYSTEM.$ARCH.qcow2" "$GARDEN_SYSTEM.seed.iso" "$GARDEN_SYSTEM.user-data" "$GARDEN_SYSTEM.meta-data"
- stat .image-garden.mk "$GARDEN_SYSTEM".* || true
- printf '\e[0K%s:%s:%s\r\e[0K\n' section_end "$(date +%s)" prepare_image_dry_run
# Install the selected revision of spread.
- printf '\e[0K%s:%s:%s[collapsed=true]\r\e[0K%s\n' section_start "$(date +%s)" install_spread "Installing spread..."
# Install pre-built spread from https://gitlab.com/zygoon/spread-dist generic package repository.
- |
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --location --output spread "${CI_API_V4_URL}/projects/${SPREAD_GITLAB_PROJECT_ID}/packages/generic/spread/${SPREAD_REV}/spread.${SPREAD_GOARCH}"
- chmod +x spread
- printf '\e[0K%s:%s:%s\r\e[0K\n' section_end "$(date +%s)" install_spread
script:
- printf '\e[0K%s:%s:%s\r\e[0K%s\n' section_start "$(date +%s)" run_spread "Running spread for $GARDEN_SYSTEM..."
# TODO: transform to inject ^...$ to properly select jobs to run.
- mkdir -p spread-logs spread-artifacts
- ./spread -list $SPREAD_ARGS |
split --number=l/"${CI_NODE_INDEX:-1}"/"${CI_NODE_TOTAL:-1}" |
xargs --verbose ./spread -v -artifacts ./spread-artifacts -v | tee spread-logs/"$GARDEN_SYSTEM".log
- printf '\e[0K%s:%s:%s\r\e[0K\n' section_end "$(date +%s)" run_spread
artifacts:
paths:
- spread-logs
- spread-artifacts
when: always
spread-ubuntu-cloud-24.04-x86_64:
extends: .spread-x86_64
variables:
GARDEN_SYSTEM: ubuntu-cloud-24.04
SPREAD_ARGS: garden:$GARDEN_SYSTEM:tests/regression/ garden:$GARDEN_SYSTEM:tests/profiles/
CACHE_POLICY: pull
dependencies: []
needs:
- job: image-ubuntu-cloud-24.04-x86_64
optional: true
parallel: 4

View File

@@ -2,11 +2,6 @@
# All the package installation happens through cloud-init profiles defined
# below.
# NOTE: Should the kernel be out of date, just increment this value. Make will
# re-create the image whenever the .image-garden.mk file is more recent than
# the image itself. In reality all you need is touch(1), but this is more apt.
unused=1
# This is the cloud-init user-data profile for all Debian systems. Note that it
# is an extension of the default profile necessary for operation of
# image-garden.
@@ -32,7 +27,6 @@ packages:
- libtool
- liburing-dev
- pkg-config
- proftpd-core
- python3-all-dev
- python3-gi
- python3-notify2
@@ -41,13 +35,7 @@ packages:
- python3-tk
- python3-ttkthemes
- swig
- tinyproxy
# Update all the packages. This allows us to be on the up-to-date kernel
# version that we cannot otherwise easily select with cloud init alone. Note
# that we do not need to reboot the system as image garden shuts down the image
# after first boot. On subsequent boot we will be running the latest kernel.
package_upgrade: true
package_update: true
- toybox
endef
# Ubuntu shares cloud-init profile with Debian.
@@ -90,10 +78,6 @@ packages:
- python311
- python311-devel
- swig
- which
# See above for rationale.
package_upgrade: true
package_update: true
endef
define FEDORA_CLOUD_INIT_USER_DATA_TEMPLATE
@@ -123,7 +107,4 @@ packages:
- python3-notify2
- python3-tkinter
- swig
# See above for rationale.
package_upgrade: true
package_update: true
endef

View File

@@ -54,6 +54,9 @@ snapshot: clean
.PHONY: coverity
coverity: snapshot
cd $(SNAPSHOT_NAME)/libraries/libapparmor && ./configure --with-python
$(foreach dir, libraries/libapparmor utils, \
cov-build --dir $(COVERITY_DIR) --no-command --fs-capture-search $(SNAPSHOT_NAME)/$(dir); \
mv $(COVERITY_DIR)/build-log.txt $(COVERITY_DIR)/build-log-python-$(subst /,.,$(dir)).txt ;)
cov-build --dir $(COVERITY_DIR) -- sh -c \
"$(foreach dir, $(filter-out utils profiles tests, $(DIRS)), \
$(MAKE) -j $$(nproc) -C $(SNAPSHOT_NAME)/$(dir);) "

View File

@@ -214,18 +214,6 @@ in an ephemeral virtual machine. This allows testing in isolation from the
host, as well as testing across different commonly used distributions and their
real kernels.
Image Garden is available as a snap. If you wish to use it this way then snap
then install the snap with:
```sh
sudo snap install image-garden
```
If you need to install snapd first, see https://snapcraft.io/docs/installing-snapd
Alternatively you may build image-garden and spread from source, and install
dependencies manually.
```sh
sudo apt install git golang whois ovmf genisoimage qemu-utils qemu-system
go install github.com/snapcore/spread/cmd/spread@latest
@@ -239,9 +227,8 @@ git clean -xdf
# or ~/go/bin/spread -v garden:ubuntu-cloud-24.04:tests/regression/apparmor:at_secure
```
Running the `run_spread.sh` script, with `image-garden` snap installed or with
`spread` on `PATH` will run all the tests across several supported systems
(Debian, Ubuntu and openSUSE).
Running the `run_spread.sh` script, with `spread` on `PATH` will run all the
tests across several supported systems (Debian, Ubuntu and openSUSE).
If you include a `bzImage` file in the root of the repository then that kernel
will be used in the integration test. Please look at `spread.yaml` for details.

View File

@@ -80,109 +80,6 @@ aa-exec.
=back
=head1 RESTRICTIONS
aa-exec uses I<aa_change_profile(3)> to change application confinement.
The use of I<aa_change_profile(3)> may be restricted by policy in ways
that will cause failure or results different than expected.
Even when using I<aa-exec> from unconfined restrictions in policy can
causes failure or the confinement entered to be different than requested
See the unpriviled unconfined restriction documentation for more detail.
https://gitlab.com/apparmor/apparmor/-/wikis/unprivileged_unconfined_restriction
=head1 STACKING
aa-exec can be used to setup a stack of profiles as confinement. When an
application is confined by a stack, all profiles in the stack are checked
as if they were the profile confining the application. The resulting
mediation is the intersection of what is allowed by each profile in the
stack.
The profiles in a stack are treated independently. Each profile can have
its own flags and profile transitions. During an exec each profile gets
to specify its transition and the results brought together to form a
new canonicalized stack.
The profile separator indicating a stack is the character sequence I<//&>.
Thus a stack can be expressed using
=over 4
$ aa-exec -p "unconfined//&firefox" -- bash
$ ps -Z
LABEL PID TTY TIME CMD
unconfined 30714 pts/12 00:00:00 bash
firefox//&unconfined (unconfined) 31160 pts/12 00:00:00 bash
firefox//&unconfined (unconfined) 31171 pts/12 00:00:00 ps
=back
=head1 NAMESPACES
aa-exec can be used to enter confinement in another policy namespace
if the policy namespaces exists, is visible, and the profile exists in
the namespace. Note applications launched within the namespace will
not be able to exit the namespace, and may be restricted by additional
confinement around namespacing. Files and resources visible to the
parent that launches the application may not be visible in the policy
namespace resulting in access denials.
To enter a policy namespace the profile is prefixed with the namespace's
name, using a I<:> prefix and suffix.
Eg.
=over 4
$ aa-exec -p :ex1:unconfined -- bash
$ ps -Z
LABEL PID TTY TIME CMD
- 30714 pts/12 00:00:00 bash
unconfined 34372 pts/12 00:00:00 bash
unconfined 34379 pts/12 00:00:00 ps
=back
Confinement of processes outside of the namespace may not be visible
in which case the confinement will be represented with a -. If policy
is stacked only part of the confinement might be visible. However
confinement is usually fully visible from the parent policy namespace.
Eg. the confinement of the child can be queried in the parent to see
=over 4
$ ps -Z 34372
LABEL PID TTY STAT TIME COMMAND
:ex1:unconfined 34372 pts/12 S+ 0:00 bash
=back
And in the case of stacking with namespaces
=over 4
$ aa-exec -p "unconfined//&:ex1:unconfined" -- bash
$ ps -Z
LABEL PID TTY TIME CMD
- 30714 pts/12 00:00:00 bash
unconfined 36298 pts/12 00:00:00 bash
unconfined 36305 pts/12 00:00:00 ps
=back
while from the parent namespace the full confinement can be seen
=over 4
$ ps -Z 36298
LABEL PID TTY STAT TIME COMMAND
unconfined//&:ex1:unconfined 36298 pts/12 S+ 0:00 bash
=back
=head1 BUGS
If you find any bugs, please report them at
@@ -190,7 +87,7 @@ L<https://gitlab.com/apparmor/apparmor/-/issues>
=head1 SEE ALSO
apparmor(7), apparmor.d(5), aa_change_profile(3),
aa-stack(8), aa-namespace(8), apparmor(7), apparmor.d(5), aa_change_profile(3),
aa_change_onexec(3) and L<https://wiki.apparmor.net>.
=cut

View File

@@ -117,13 +117,13 @@ display only counts for selected information.
=item --filter.mode=filter
Allows specifying a posix regular expression filter that will be
applied against the displayed processes and profiles apparmor profile
applied against the displayed processess and profiles apparmor profile
mode, reducing the output.
=item --filter.profiles=filter
Allows specifying a posix regular expression filter that will be
applied against the displayed processes and profiles confining
applied against the displayed processess and profiles confining
profile, reducing the output.
=item --filter.pid=filter

View File

@@ -17,7 +17,6 @@
#include <fcntl.h>
#include <string.h>
#include <dirent.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>

View File

@@ -1038,10 +1038,8 @@ int main(int argc, char **argv)
* have policy associated.
*/
ret = get_profiles(fp, &profiles, &nprofiles);
if (ret == AA_EXIT_NO_POLICY) {
eprintf(_("No policy loaded into the kernel\n"));
} else if (ret != 0 && !opt_json) {
eprintf(_("Failed to retrieve profiles from kernel: %d....\n"), ret);
if (ret != 0) {
eprintf(_("Failed to get profiles: %d....\n"), ret);
goto out;
}
@@ -1070,7 +1068,7 @@ int main(int argc, char **argv)
ret = get_processes(profiles, nprofiles, &processes, &nprocesses);
if (ret != 0) {
eprintf(_("Failed to get confinement information from processes: %d....\n"), ret);
eprintf(_("Failed to get processes: %d....\n"), ret);
} else if (opt_count) {
ret = simple_filtered_process_count(outf, &filters, opt_json,
processes, nprocesses);

View File

@@ -1,14 +1,14 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Canonical Ltd
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# Translations for aa_status
# Copyright (C) 2024 Canonical Ltd
# This file is distributed under the same license as the AppArmor package.
# John Johansen <john.johansen@canonical.com>, 2024.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: apparmor@lists.ubuntu.com\n"
"POT-Creation-Date: 2025-04-26 11:12-0700\n"
"POT-Creation-Date: 2024-08-31 17:49-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -42,12 +42,12 @@ msgstr ""
msgid "ERROR: Failed to allocate memory\n"
msgstr ""
#: ../aa_status.c:587 ../aa_status.c:653 ../aa_status.c:603 ../aa_status.c:669
#: ../aa_status.c:587 ../aa_status.c:653
#, c-format
msgid "Error: failed to compile sub filter '%s'\n"
msgstr ""
#: ../aa_status.c:715 ../aa_status.c:731
#: ../aa_status.c:715
#, c-format
msgid ""
"Usage: %s [OPTIONS]\n"
@@ -61,7 +61,7 @@ msgid ""
" --process-mixed --count --ps --mode=mixed\n"
msgstr ""
#: ../aa_status.c:734 ../aa_status.c:750
#: ../aa_status.c:734
#, c-format
msgid ""
"Usage of filters\n"
@@ -77,7 +77,7 @@ msgid ""
" --filter.exe: regular expression to match executable\n"
msgstr ""
#: ../aa_status.c:762 ../aa_status.c:778
#: ../aa_status.c:762
#, c-format
msgid ""
"Usage: %s [OPTIONS]\n"
@@ -103,45 +103,45 @@ msgid ""
" --help[=(legacy|filters)] this message, or info on the specified option\n"
msgstr ""
#: ../aa_status.c:856 ../aa_status.c:872
#: ../aa_status.c:856
#, c-format
msgid "Error: Invalid --help option '%s'.\n"
msgstr ""
#: ../aa_status.c:924 ../aa_status.c:940
#: ../aa_status.c:924
#, c-format
msgid "Error: Invalid --show option '%s'.\n"
msgstr ""
#: ../aa_status.c:946 ../aa_status.c:962
#: ../aa_status.c:946
msgid "Error: Invalid command.\n"
msgstr ""
#: ../aa_status.c:971 ../aa_status.c:987
#: ../aa_status.c:971
msgid "Error: Unknown options.\n"
msgstr ""
#: ../aa_status.c:983 ../aa_status.c:999
#: ../aa_status.c:983
#, c-format
msgid "Error: failed to compile mode filter '%s'\n"
msgstr ""
#: ../aa_status.c:988 ../aa_status.c:1004
#: ../aa_status.c:988
#, c-format
msgid "Error: failed to compile profiles filter '%s'\n"
msgstr ""
#: ../aa_status.c:994 ../aa_status.c:1010
#: ../aa_status.c:994
#, c-format
msgid "Error: failed to compile ps filter '%s'\n"
msgstr ""
#: ../aa_status.c:1000 ../aa_status.c:1016
#: ../aa_status.c:1000
#, c-format
msgid "Error: failed to compile exe filter '%s'\n"
msgstr ""
#: ../aa_status.c:1015 ../aa_status.c:1031
#: ../aa_status.c:1015
#, c-format
msgid "Failed to open memstream: %m\n"
msgstr ""
@@ -156,24 +156,10 @@ msgstr ""
msgid "Failed to get processes: %d....\n"
msgstr ""
#: ../aa_status.c:1076 ../aa_status.c:1099
#: ../aa_status.c:1076
msgid "Failed to parse json output"
msgstr ""
#: ../aa_status.c:1083 ../aa_status.c:1106
#: ../aa_status.c:1083
msgid "Failed to print pretty json"
msgstr ""
#: ../aa_status.c:1044
#, c-format
msgid "Failed to retrieve profiles from kernel: %d....\n"
msgstr ""
#: ../aa_status.c:1073
#, c-format
msgid "Failed to get confinement information from processes: %d....\n"
msgstr ""
#: ../aa_status.c:1042
msgid "No policy loaded into the kernel\n"
msgstr ""

View File

@@ -1,67 +0,0 @@
# Belarusian translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2020-05-05 21:55+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Belarusian <be@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-05-06 05:41+0000\n"
"X-Generator: Launchpad (build fbdff7602bd10fb883bf7e2ddcc7fd5a16f60398)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr ""
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr ""
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr ""
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr ""
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr ""
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr ""

View File

@@ -1,71 +0,0 @@
# Catalan translation for apparmor
# Copyright (c) 2024 Rosetta Contributors and Canonical Ltd 2024
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2024-09-14 10:17+0000\n"
"Last-Translator: Walter Garcia-Fontes <walter.garcia@upf.edu>\n"
"Language-Team: Catalan <ca@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2024-09-15 07:16+0000\n"
"X-Generator: Launchpad (build 1b1ed1ad2dbfc71ee62b5c5491c975135a771bf0)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [opcions]\n"
" opcions:\n"
" -q | --quiet No imprimeixis cap missatge\n"
" -h | --help Imprimeix l'ajuda\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "opcions desconegudes o incompatibles\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "opció desconeguda «%s»\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "Sí\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "No - no esta disponible a aquest sistema\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "No - desactivat a l'inici.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "Potser - la interfície de política no està disponible.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "Potser - permisos insuficient per determinar la disponibilitat.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Error - '%s'\n"

View File

@@ -1,67 +0,0 @@
# Czech translation for apparmor
# Copyright (c) 2022 Rosetta Contributors and Canonical Ltd 2022
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2022-01-09 11:59+0000\n"
"Last-Translator: Marek Hladík <mhladik@seznam.cz>\n"
"Language-Team: Czech <cs@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2022-01-10 06:32+0000\n"
"X-Generator: Launchpad (build 1682fd44eec4f62371f0bed122a83482daf08e23)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "neznámé nebo nekompatibilní volby\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "neznámá volba '%s'\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "Ano\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "Ne - není v tomto systému k dispozici.\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "Ne - zakázáno při startu.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "Možná - rozhraní zásad není k dispozici.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "Možná - nedostatečná oprávnění k určení dostupnosti.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Chyba - '%s'\n"

View File

@@ -1,67 +0,0 @@
# English (Australia) translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2020-11-28 04:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: English (Australia) <en_AU@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-11-29 06:26+0000\n"
"X-Generator: Launchpad (build 12d09381f8e8eee3115395875b132e165fa96574)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr ""
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr ""
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr ""
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr ""
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr ""
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr ""

View File

@@ -1,67 +0,0 @@
# English (Canada) translation for apparmor
# Copyright (c) 2021 Rosetta Contributors and Canonical Ltd 2021
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2021-10-01 04:55+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: English (Canada) <en_CA@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-10-02 06:17+0000\n"
"X-Generator: Launchpad (build 1ce78163f6a09ed42b4201fe7d3f0e3a2eba7d02)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr ""
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr ""
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr ""
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr ""
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr ""
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr ""

View File

@@ -1,71 +0,0 @@
# Estonian translation for apparmor
# Copyright (c) 2023 Rosetta Contributors and Canonical Ltd 2023
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2023-07-04 08:52+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Estonian <et@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2023-07-05 04:31+0000\n"
"X-Generator: Launchpad (build beda0e9dd2b131780db60fe479d4b43618b27243)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [valikud]\n"
" valikud:\n"
" -q | --quiet Ärge printige sõnumeid välja\n"
" -h | --help Prindi abiinfo\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "tundmatud või ühildumatud valikud\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "tundmatu valik '%s'\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "Jah\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "Ei pole selles süsteemis saadaval.\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "Ei käivitamisel keelatud.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "Võib-olla poliisiliides pole saadaval.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "Võib-olla - kättesaadavuse määramiseks pole piisavalt õigusi.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Viga '%s'\n"

View File

@@ -1,67 +0,0 @@
# Galician translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2020-04-21 14:59+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Galician <gl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-04-22 06:10+0000\n"
"X-Generator: Launchpad (build aad6b57d58e2f621954298e262c1cc904860f5d2)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr ""
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr ""
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr ""
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr ""
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr ""
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr ""

View File

@@ -1,71 +0,0 @@
# Hebrew translation for apparmor
# Copyright (c) 2023 Rosetta Contributors and Canonical Ltd 2023
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2023-10-05 05:12+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hebrew <he@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2023-10-06 08:32+0000\n"
"X-Generator: Launchpad (build bd6cfd0cfc024dbe1dcd7d5d91165fb4f6a6c596)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [אפשרויות]\n"
" אפשרויות:\n"
" -q | --quiet לא להציג הודעות\n"
" -h | --help הצגת עזרה\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "אפשרויות לא ידועות או לא נתמכות\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "האפשרות %s לא מוכרת\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "כן\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "לא - לא זמין במערכת הזאת.\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "לא - מושבת בעלייה.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "אולי - מנשק המדיניות לא זמין.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "אולי - אין מספיק הרשאות לקבוע זמינות.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "שגיאה - %s\n"

View File

@@ -1,67 +0,0 @@
# Hindi translation for apparmor
# Copyright (c) 2023 Rosetta Contributors and Canonical Ltd 2023
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2023-01-09 07:39+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hindi <hi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2023-01-10 06:22+0000\n"
"X-Generator: Launchpad (build 87bfee1fd14ea3245297d63eeec1e4c8a1d203a8)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr ""
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr ""
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr ""
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr ""
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr ""
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr ""

View File

@@ -1,71 +0,0 @@
# Croatian translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2021-10-03 10:17+0000\n"
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-10-04 06:23+0000\n"
"X-Generator: Launchpad (build 1ce78163f6a09ed42b4201fe7d3f0e3a2eba7d02)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [mogućnosti]\n"
" options:\n"
" -q | --quiet Ne prikazuj poruke\n"
" -h | --help Prikaži pomoć\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "nepoznata ili nepotpuna mogućnost\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "nepoznata mogućnost '%s'\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "Da\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "Ne - nedostupno na ovom sustavu.\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "Ne - onemogućeno pri pokretanju.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "Možda - pravilo sučelja nedostupno.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "Možda - nedovoljna dozvola za određivanje dostupnosti.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Greška - '%s'\n"

View File

@@ -1,72 +0,0 @@
# Italian translation for apparmor
# Copyright (c) 2022 Rosetta Contributors and Canonical Ltd 2022
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2022-06-30 17:54+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Italian <it@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2022-07-01 04:30+0000\n"
"X-Generator: Launchpad (build f48158886a49da429840bcd298f0c7ed60f9ad7b)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [opzioni]\n"
" opzioni:\n"
" -q | --quiet Non stampa nessun messaggio\n"
" -h | --help Stampa la guida\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "opzioni sconosciute o incompatibili\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "opzione sconosciuta '%s'\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "Si\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "No - non disponibile su questo sistema.\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "No - disabilitato all'avvio.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "Forse - interfaccia dei criteri non disponibile.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
"Forse - autorizzazioni insufficienti per determinare la disponibilità.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Errore - '%s'\n"

View File

@@ -1,72 +0,0 @@
# Georgian translation for apparmor
# Copyright (c) 2023 Rosetta Contributors and Canonical Ltd 2023
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2023-06-26 15:06+0000\n"
"Last-Translator: NorwayFun <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <ka@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2023-06-27 04:31+0000\n"
"X-Generator: Launchpad (build aedf8597c50c1abc5fb7f9e871e686dfcb381fde)\n"
"Language: aa\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [პარამეტრები]\n"
" პარამეტრები:\n"
" -q | --quiet შეტყობინებები გამოტანილი არ იქნება\n"
" -h | --help დახმარების გამოტანა\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "უცნობი ან შეუთავსებელი პარამეტრები\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "უცნობი პარამეტრი \"%s\"-სთვის\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "დიახ\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "არა - მიუწვდომელია ამ სისტემაზე\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "არა - გამორთულია ჩატვირთვისას\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "შეიძლება - პოლიტიკის ინტერფეისი ხელმისაწვდომი არაა.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "შეიძლება - არასაკმარისი წვდომები ხელმისაწვდომობის დასადგენად.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "შეცდომა - \"%s\"\n"

View File

@@ -1,67 +0,0 @@
# Kabyle translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2020-04-29 14:31+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Kabyle <kab@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-04-30 05:44+0000\n"
"X-Generator: Launchpad (build fbdff7602bd10fb883bf7e2ddcc7fd5a16f60398)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr ""
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr ""
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr ""
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr ""
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr ""
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr ""

View File

@@ -1,73 +0,0 @@
# Burmese translation for apparmor
# Copyright (c) 2022 Rosetta Contributors and Canonical Ltd 2022
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2022-06-26 11:50+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Burmese <my@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2022-06-27 04:30+0000\n"
"X-Generator: Launchpad (build 51a2e4fa2e9b8e45f00904ad7f53546f45ac48a5)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s- [options]\n"
" ရွေးချယ်စရာများ-\n"
" -q | --quiet မည်သည့်စာတိုကိုမှ ပရင့်မထုတ်ပါနှင့်။\n"
" -h | --help ပရင့်အကူအညီ\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "အမည်မသိ သို့မဟုတ် သဟဇာတမဖြစ်သော ရွေးချယ်စရာများ\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "အမည်မသိရွေးချယ်မှု '%s'\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "ဟုတ်\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "မဟုတ်ပါ - ဤစနစ်တွင် မရနိုင်ပါ။\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "မဟုတ်ပါ - boot တွင် ပိတ်ထားပါသည်။\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "ဖြစ်နိုင်ပါသည် - မူဝါဒ interface ကို မရနိုင်ပါ။\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
"ဖြစ်နိုင်ပါသည် - ရရှိနိုင်မှုကို ဆုံးဖြတ်ရန်အတွက် ခွင့်ပြုချက်များမှာ "
"လုံလောက်မှုမရှိပါ။\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "အမှား- '%s'\n"

View File

@@ -1,67 +0,0 @@
# Occitan (post 1500) translation for apparmor
# Copyright (c) 2021 Rosetta Contributors and Canonical Ltd 2021
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2021-01-14 18:26+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-01-15 07:59+0000\n"
"X-Generator: Launchpad (build 511b4a3b6512aa3d421c5f7d74f3527e78bff26e)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr ""
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr ""
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr ""
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr ""
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr ""
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr ""

View File

@@ -1,71 +0,0 @@
# Polish translation for apparmor
# Copyright (c) 2021 Rosetta Contributors and Canonical Ltd 2021
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2021-07-22 20:10+0000\n"
"Last-Translator: Marek Adamski <Unknown>\n"
"Language-Team: Polish <pl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-07-23 06:03+0000\n"
"X-Generator: Launchpad (build 7edebbcd0516593cf020aaa3c59299732a7c73cc)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [opcje]\n"
" opcje:\n"
" -q | --quiet Nie wyświetlaj żadnych komunikatów\n"
" -h | --help Wyświetl pomoc\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "nieznane lub niekompatybilne opcje\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "nieznana opcja '%s'\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "Tak\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "Nie - nie jest dostępne w tym systemie.\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "Nie - wyłączone podczas rozruchu.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "Może - interfejs zasad nie jest dostępny.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "Może - brak wystarczających uprawnień do określenia dostępności.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Błąd - '%s'\n"

View File

@@ -1,71 +0,0 @@
# Brazilian Portuguese translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2020-04-27 20:32+0000\n"
"Last-Translator: Rodrigo Farias <Unknown>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-04-28 05:52+0000\n"
"X-Generator: Launchpad (build d1105341713c5be348effe2a5142c4a210ce4cde)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [options]\n"
" opções:\n"
" -q | --quiet Não imprimir nenhum mensagem\n"
" -h | --help Assistente de impressão\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "opções incompatíveis ou desconhecidas\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "opção desconhecida '%s'\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "Sim\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "Não - não disponível neste sistema.\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "Não - desabilitado na inicialização.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "Talvez - interface de política não disponível.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "Talvez - permissões insuficientes para determinar disponibilidade.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Erro - '%s'\n"

View File

@@ -1,26 +1,21 @@
# Romanian translation for apparmor, "apparmor-binutils" component.
# Mesajele în limba română pentru pachetul „apparmor”, componenta „apparmor-binutils”.
# Copyright © 2020 Rosetta Contributors and Canonical Ltd.
# Copyright © 2024 Canonical Ltd.
# Romanian translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
#
# Daniel Slavu <Unknown>, feb-2020.
# Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>, sep-2024.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor-binutils\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2024-09-23 22:45+0000\n"
"Last-Translator: Remus-Gabriel Chelu <Unknown>\n"
"Language-Team: Romanian <debian-l10n-romanian@lists.debian.org>\n"
"PO-Revision-Date: 2020-02-20 21:47+0000\n"
"Last-Translator: Daniel Slavu <Unknown>\n"
"Language-Team: Romanian <ro@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2024-09-25 04:33+0000\n"
"X-Generator: Launchpad (build 1b1ed1ad2dbfc71ee62b5c5491c975135a771bf0)\n"
"Language: ro\n"
"X-Launchpad-Export-Date: 2020-02-21 05:39+0000\n"
"X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n"
#: ../aa_enabled.c:26
#, c-format
@@ -32,8 +27,8 @@ msgid ""
msgstr ""
"%s: [opțiuni]\n"
" opțiuni:\n"
" -q | --quiet nu afișează niciun mesaj\n"
" -h | --help imprimă ajutorul\n"
" -q | --calm Nu imprima niciun mesaj\n"
" -h | - ajutor Imprimare ajutor\n"
#: ../aa_enabled.c:45
#, c-format
@@ -43,7 +38,7 @@ msgstr "opțiuni necunoscute sau incompatibile\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "opțiune necunoscută %s\n"
msgstr "opțiune necunoscută '%s'\n"
#: ../aa_enabled.c:64
#, c-format
@@ -63,8 +58,7 @@ msgstr "Nu - dezactivat la pornire.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
"Poate - interfața politică (de directive politice) nu este disponibilă.\n"
msgstr "Poate - interfața politică nu este disponibilă.\n"
#: ../aa_enabled.c:81
#, c-format
@@ -75,4 +69,4 @@ msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Eroare - %s\n"
msgstr "Eroare - '%s'\n"

View File

@@ -1,67 +0,0 @@
# Serbian translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2020-11-23 18:06+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-11-24 05:55+0000\n"
"X-Generator: Launchpad (build c35ff22711d15549e2303ae18ae521fd91f6bf00)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr ""
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr ""
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr ""
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr ""
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr ""
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr ""
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr ""
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr ""

View File

@@ -1,71 +0,0 @@
# Ukrainian translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2020-05-19 21:48+0000\n"
"Last-Translator: Nazarii Ritter <nazariy.ritter@gmail.com>\n"
"Language-Team: Ukrainian <uk@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-05-20 05:42+0000\n"
"X-Generator: Launchpad (build 0385b538081bc4718df6fb844a3afc89729c94ce)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [опції]\n"
" опції:\n"
" -q | --quiet Не виводити жодних повідомлень\n"
" -h | --help Вивести довідку\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "невідомі або несумісні опції\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "невідомий параметр «%s»\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "Так\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "Ні недоступно на цій системі.\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "Ні вимкнено під час завантаження.\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "Можливо інтерфейс політики недоступний.\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "Можливо недостатньо дозволів для визначення наявності.\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "Помилка - '%s'\n"

View File

@@ -1,71 +0,0 @@
# Chinese (Simplified) translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2015-11-28 10:23-0800\n"
"PO-Revision-Date: 2020-05-14 09:16+0000\n"
"Last-Translator: 玉堂白鹤 <yjwork@qq.com>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-05-15 05:51+0000\n"
"X-Generator: Launchpad (build 0385b538081bc4718df6fb844a3afc89729c94ce)\n"
#: ../aa_enabled.c:26
#, c-format
msgid ""
"%s: [options]\n"
" options:\n"
" -q | --quiet Don't print out any messages\n"
" -h | --help Print help\n"
msgstr ""
"%s: [选项]\n"
" 选项:\n"
" -q | --quiet 不要打印任何消息\n"
" -h | --help 打印帮助\n"
#: ../aa_enabled.c:45
#, c-format
msgid "unknown or incompatible options\n"
msgstr "未知或不兼容的选项\n"
#: ../aa_enabled.c:55
#, c-format
msgid "unknown option '%s'\n"
msgstr "未知选项 '%s'\n"
#: ../aa_enabled.c:64
#, c-format
msgid "Yes\n"
msgstr "是\n"
#: ../aa_enabled.c:71
#, c-format
msgid "No - not available on this system.\n"
msgstr "否 - 在此系统上不可用。\n"
#: ../aa_enabled.c:74
#, c-format
msgid "No - disabled at boot.\n"
msgstr "否 - 引导时被禁用。\n"
#: ../aa_enabled.c:77
#, c-format
msgid "Maybe - policy interface not available.\n"
msgstr "也许 - 策略界面不可用\n"
#: ../aa_enabled.c:81
#, c-format
msgid "Maybe - insufficient permissions to determine availability.\n"
msgstr "也许 - 没有足够的权限确定可用性。\n"
#: ../aa_enabled.c:84
#, c-format
msgid "Error - '%s'\n"
msgstr "错误 - '%s'\n"

View File

@@ -35,14 +35,14 @@ VERSION=$(shell cat $(COMMONDIR)/Version)
pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH)))))
map = $(foreach a,$(2),$(call $(1),$(a)))
AWK?=$(or $(shell which awk),$(error awk utility required for build but not available))
AWK?=$(or $(shell command -v awk),$(error awk utility required for build but not available))
define nl
endef
REPO_VERSION_CMD=[ -x /usr/bin/git ] && /usr/bin/git describe --tags --long --abbrev=16 --match 'v*' 2> /dev/null || $(AWK) '{ print $2 }' common/.stamp_rev
REPO_VERSION_CMD=[ -x /usr/bin/git ] && /usr/bin/git describe --tags --long --abbrev=16 --match 'v*' 2> /dev/null || awk '{ print $2 }' common/.stamp_rev
ifndef PYTHON_VERSIONS
PYTHON_VERSIONS = $(call map, pathsearch, python3)

View File

@@ -1 +1 @@
5.0.0~alpha1
4.1.0~beta1

View File

@@ -152,16 +152,16 @@ extern int aa_features_new_from_kernel(aa_features **features);
extern aa_features *aa_features_ref(aa_features *features);
extern void aa_features_unref(aa_features *features);
extern int aa_features_write_to_fd(const aa_features *features, int fd);
extern int aa_features_write_to_file(const aa_features *features,
extern int aa_features_write_to_fd(aa_features *features, int fd);
extern int aa_features_write_to_file(aa_features *features,
int dirfd, const char *path);
extern bool aa_features_is_equal(const aa_features *features1,
const aa_features *features2);
extern bool aa_features_is_equal(aa_features *features1,
aa_features *features2);
extern int aa_features_check(int dirfd, const char *path,
aa_features *features);
extern bool aa_features_supports(const aa_features *features, const char *str);
extern char *aa_features_id(const aa_features *features);
extern char *aa_features_value(const aa_features *features, const char *str, size_t *len);
extern bool aa_features_supports(aa_features *features, const char *str);
extern char *aa_features_id(aa_features *features);
extern char *aa_features_value(aa_features *features, const char *str, size_t *len);
typedef struct aa_kernel_interface aa_kernel_interface;
extern int aa_kernel_interface_new(aa_kernel_interface **kernel_interface,

View File

@@ -32,10 +32,10 @@ INCLUDES = $(all_includes)
#
# After changing the AA_LIB_* variables, also update EXPECTED_SO_NAME.
AA_LIB_CURRENT = 25
AA_LIB_REVISION = 2
AA_LIB_AGE = 24
EXPECTED_SO_NAME = libapparmor.so.1.24.2
AA_LIB_CURRENT = 20
AA_LIB_REVISION = 0
AA_LIB_AGE = 19
EXPECTED_SO_NAME = libapparmor.so.1.19.0
SUFFIXES = .pc.in .pc

View File

@@ -399,10 +399,6 @@ static bool walk_one(const char **str, const struct component *component,
i = 0;
cur++;
/* Partial match, continue to search */
if (i == component->len && !isbrace_space_or_nul(*cur))
i = 0;
}
/* Return false if a full match was not found */
@@ -608,11 +604,11 @@ void aa_features_unref(aa_features *features)
*
* Returns: 0 on success, -1 on error with errno set
*/
int aa_features_write_to_fd(const aa_features *features, int fd)
int aa_features_write_to_fd(aa_features *features, int fd)
{
size_t size;
ssize_t retval;
const char *string;
char *string;
string = features->string;
size = strlen(string);
@@ -636,7 +632,7 @@ int aa_features_write_to_fd(const aa_features *features, int fd)
*
* Returns: 0 on success, -1 on error with errno set
*/
int aa_features_write_to_file(const aa_features *features,
int aa_features_write_to_file(aa_features *features,
int dirfd, const char *path)
{
autoclose int fd = -1;
@@ -657,7 +653,7 @@ int aa_features_write_to_file(const aa_features *features,
*
* Returns: true if they're equal, false if they're not or either are NULL
*/
bool aa_features_is_equal(const aa_features *features1, const aa_features *features2)
bool aa_features_is_equal(aa_features *features1, aa_features *features2)
{
return features1 && features2 &&
strcmp(features1->string, features2->string) == 0;
@@ -701,7 +697,7 @@ int aa_features_check(int dirfd, const char *path,
return 0;
}
static const char *features_lookup(const aa_features *features, const char *str)
static const char *features_lookup(aa_features *features, const char *str)
{
const char *features_string = features->string;
struct component components[32];
@@ -743,7 +739,7 @@ static const char *features_lookup(const aa_features *features, const char *str)
*
* Returns: a bool specifying the support status of @str feature
*/
bool aa_features_supports(const aa_features *features, const char *str)
bool aa_features_supports(aa_features *features, const char *str)
{
const char *value = features_lookup(features, str);
@@ -764,7 +760,7 @@ bool aa_features_supports(const aa_features *features, const char *str)
* EISDIR - @str is not a leaf node in the feature tree
*/
char *aa_features_value(const aa_features *features, const char *str, size_t *len)
char *aa_features_value(aa_features *features, const char *str, size_t *len)
{
const char *start, *cur = features_lookup(features, str);
@@ -807,7 +803,7 @@ char *aa_features_value(const aa_features *features, const char *str, size_t *le
* Returns: a string identifying @features which must be freed by the
* caller or NULL, with errno set, upon error
*/
char *aa_features_id(const aa_features *features)
char *aa_features_id(aa_features *features)
{
return strdup(features->hash);
}

View File

@@ -258,13 +258,7 @@ extern int aa_is_enabled(void);
* allocation uninitialized (0) != SWIG_NEWOBJ
*/
%#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
/*
* Some older versions of SWIG place this right after a goto label
* This would then be a label followed by a declaration, a C23 extension (!)
* To ensure this works for older SWIG versions and older compilers,
* make this a block element with curly braces.
*/
{static_assert(SWIG_NEWOBJ != 0, "SWIG_NEWOBJ is 0");}
static_assert(SWIG_NEWOBJ != 0);
%#endif
if ($1 != NULL && alloc_tracking$argnum != NULL) {
for (Py_ssize_t i=0; i<seq_len$argnum; i++) {
@@ -278,35 +272,6 @@ extern int aa_is_enabled(void);
}
#endif
#ifdef SWIGPERL
// Copied from perl's argcargv.i, which should be good enough for us
%typemap(in) (const char *subprofiles[]) {
int i;
SSize_t len;
AV *av = (AV *)SvRV($input);
if (SvTYPE(av) != SVt_PVAV) {
SWIG_croak("in method '$symname', Expecting reference to argv array");
goto fail;
}
len = av_len(av) + 1;
$1 = (char **) malloc((len+1)*sizeof(char *));
for (i = 0; i < len; i++) {
SV **tv = av_fetch(av, i, 0);
$1[i] = SvPV_nolen(*tv);
}
$1[i] = NULL;
}
%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (const char *subprofiles[]) {
AV *av = (AV *)SvRV($input);
$1 = SvTYPE(av) == SVt_PVAV;
}
%typemap(freearg) (const char *subprofiles[]) {
free((void *)$1);
}
#endif
/* These should not receive the VOID_Object typemap */
extern int aa_change_hat(const char *subprofile, unsigned long magic_token);
extern int aa_change_profile(const char *profile);
@@ -350,17 +315,10 @@ extern int aa_stack_onexec(const char *profile);
* We can't use "typedef int pid_t" because we still support systems
* with 16-bit PIDs and SWIG can't find sys/types.h
*
* Capture the passed-in value as a long because pid_t is guaranteed
* to be a signed integer and because the aalogparse struct uses
* (unsigned) longs to store pid values. While intmax_t would be more
* technically correct, if sizeof(pid_t) > sizeof(long) then aalogparse
* itself would also need fixing.
* Capture the passed-in value as an intmax_t because pid_t is guaranteed
* to be a signed integer
*/
%typemap(in,noblock=1,fragment="SWIG_AsVal_long") pid_t (int conv_pid, long pid_large) {
%#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
static_assert(sizeof(pid_t) <= sizeof(long),
"pid_t type is too large to be stored in a long");
%#endif
%typemap(in,noblock=1,fragment="SWIG_AsVal_long") pid_t (int conv_pid, intmax_t pid_large) {
conv_pid = SWIG_AsVal_long($input, &pid_large);
if (!SWIG_IsOK(conv_pid)) {
%argument_fail(conv_pid, "pid_t", $symname, $argnum);
@@ -370,7 +328,7 @@ extern int aa_stack_onexec(const char *profile);
* Technically this is implementation-defined behaviour but we should be fine
*/
$1 = (pid_t) pid_large;
if ((long) $1 != pid_large) {
if ((intmax_t) $1 != pid_large) {
SWIG_exception_fail(SWIG_OverflowError, "pid_t is too large");
}
}

View File

@@ -15,7 +15,6 @@ PYTHON_DIST_BUILD_PATH = '$(builddir)/../build/$$($(PYTHON) buildpath.py)'
TESTS = test_python.py
TESTS_ENVIRONMENT = \
LD_LIBRARY_PATH='$(top_builddir)/src/.libs:$(PYTHON_DIST_BUILD_PATH)' \
PYTHONPATH='$(PYTHON_DIST_BUILD_PATH)' \
PYTHONDONTWRITEBYTECODE='1'
PYTHONPATH='$(PYTHON_DIST_BUILD_PATH)'
endif

View File

@@ -1,4 +1,2 @@
profile unconfined {
change_profile -> system_tor,
}

View File

@@ -37,7 +37,7 @@ MANPAGES=apparmor.d.5 apparmor.7 apparmor_parser.8 aa-teardown.8 apparmor_xattrs
# default behavior changed in version 3.6
# parse.error=verbose supported from 3.0 so just test on that
# TODO move to autoconf
BISON_MAJOR:=$(shell bison --version | ${AWK} '/^bison/ { print ($$NF) }' | ${AWK} -F. '{print $$1 }')
BISON_MAJOR:=$(shell bison --version | awk '/^bison/ { print ($$NF) }' | awk -F. '{print $$1 }')
USE_PARSE_ERROR:=$(shell test "${BISON_MAJOR}" -ge 3 && echo true)
YACC := bison
@@ -105,12 +105,12 @@ SRCS = parser_common.c parser_include.c parser_interface.c parser_lex.c \
parser_alias.c common_optarg.c lib.c network.cc \
mount.cc dbus.cc profile.cc rule.cc signal.cc ptrace.cc \
af_rule.cc af_unix.cc policy_cache.c default_features.c userns.cc \
mqueue.cc io_uring.cc all_rule.cc cond_expr.cc variable.cc symtab.cc
mqueue.cc io_uring.cc all_rule.cc cond_expr.cc
STATIC_HDRS = af_rule.h af_unix.h capability.h common_optarg.h dbus.h \
file_cache.h immunix.h lib.h mount.h network.h parser.h \
parser_include.h parser_version.h policy_cache.h policydb.h \
profile.h ptrace.h rule.h signal.h userns.h mqueue.h io_uring.h \
common_flags.h bignum.h all_rule.h cond_expr.h variable.h symtab.h
common_flags.h bignum.h all_rule.h cond_expr.h
SPECIAL_HDRS = parser_yacc.h unit_test.h base_cap_names.h
GENERATED_HDRS = af_names.h generated_af_names.h \
@@ -331,13 +331,6 @@ all_rule.o: all_rule.cc $(HDRS)
cond_expr.o: cond_expr.cc $(HDRS)
$(CXX) $(EXTRA_CFLAGS) -c -o $@ $<
variable.o: variable.cc $(HDRS)
$(CXX) $(EXTRA_CFLAGS) -c -o $@ $<
symtab.o: symtab.cc $(HDRS)
$(CXX) $(EXTRA_CFLAGS) -c -o $@ $<
parser_version.h: Makefile
@echo \#define PARSER_VERSION \"$(VERSION)\" > .ver
@mv -f .ver $@
@@ -382,7 +375,7 @@ tst_%: parser_%.c parser.h $(filter-out parser_%.o, ${TEST_OBJECTS})
errnos.h:
echo '#include <errno.h>' > dump.c
$(CC) $(CPPFLAGS) -E -dD dump.c | $(AWK) '/^#define E/ { printf "{ \"%s\", %s },\n", $$2, $$2 }' > errnos.h
$(CC) -E -dD dump.c | awk '/^#define E/ { printf "{ \"%s\", %s },\n", $$2, $$2 }' > errnos.h
rm -f dump.c
.SILENT: check

View File

@@ -53,7 +53,7 @@ public:
sock_type_n(-1), proto(NULL), proto_n(0), label(NULL),
peer_label(NULL) { }
~af_rule() override
virtual ~af_rule()
{
free(sock_type);
free(proto);
@@ -73,12 +73,12 @@ public:
virtual bool has_peer_conds(void) { return peer_label ? true : false; }
virtual ostream &dump_local(ostream &os);
virtual ostream &dump_peer(ostream &os);
ostream &dump(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override = 0;
virtual ostream &dump(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof) = 0;
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const
{
int res = perms_rule_t::cmp(rhs);
if (res)

View File

@@ -30,8 +30,6 @@
#include "profile.h"
#include "af_unix.h"
using namespace std;
/* See unix(7) for autobind address definition */
#define autobind_address_pattern "\\x00[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]";

View File

@@ -41,13 +41,13 @@ public:
unix_rule(unsigned int type_p, audit_t audit_p, rule_mode_t rule_mode_p);
unix_rule(perm32_t perms, struct cond_entry *conds,
struct cond_entry *peer_conds);
~unix_rule() override
virtual ~unix_rule()
{
free(addr);
free(peer_addr);
};
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
// priority is partially supported for unix rules
// rules that get downgraded to just network socket
// won't support them but the fine grained do.
@@ -57,17 +57,17 @@ public:
}
return true;
};
bool has_peer_conds(void) override {
virtual bool has_peer_conds(void) {
return af_rule::has_peer_conds() || peer_addr;
}
ostream &dump_local(ostream &os) override;
ostream &dump_peer(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override;
virtual ostream &dump_local(ostream &os);
virtual ostream &dump_peer(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof);
// inherit is_mergable() from af_rule
int cmp(rule_t const &rhs) const override
virtual int cmp(rule_t const &rhs) const
{
int res = af_rule::cmp(rhs);
if (res)
@@ -80,7 +80,7 @@ public:
};
protected:
void warn_once(const char *name) override;
virtual void warn_once(const char *name) override;
};
#endif /* __AA_AF_UNIX_H */

View File

@@ -31,7 +31,7 @@ class all_rule: public prefix_rule_t {
public:
all_rule(void): prefix_rule_t(RULE_TYPE_ALL) { }
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
if (p.priority != 0) {
error = _("priority prefix not allowed on all rules");
return false;
@@ -43,30 +43,30 @@ public:
return true;
};
int expand_variables(void) override
int expand_variables(void)
{
return 0;
}
ostream &dump(ostream &os) override {
virtual ostream &dump(ostream &os) {
prefix_rule_t::dump(os);
os << "all";
return os;
}
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const
{
return prefix_rule_t::cmp(rhs);
};
void add_implied_rules(Profile &prof) override;
virtual void add_implied_rules(Profile &prof);
int gen_policy_re(Profile &prof unused) override { return RULE_OK; };
virtual int gen_policy_re(Profile &prof unused) { return RULE_OK; };
protected:
void warn_once(const char *name unused, const char *msg unused) override { };
void warn_once(const char *name unused) override { };
virtual void warn_once(const char *name unused, const char *msg unused) { };
virtual void warn_once(const char *name unused) { };
};
#endif /* __AA_ALL_H */

View File

@@ -80,7 +80,7 @@ B<ALIAS RULE> = 'alias' I<ABS PATH> '-E<gt>' I<REWRITTEN ABS PATH> ','
B<INCLUDE> = ( '#include' | 'include' ) [ 'if exists' ] ( I<ABS PATH> | I<MAGIC PATH> )
B<ABI> = ( 'abi' ) ( I<ABS PATH> | I<MAGIC PATH> | '<kernel>' | '<default>' ) ','
B<ABI> = ( 'abi' ) ( I<ABS PATH> | I<MAGIC PATH> ) ','
B<ABS PATH> = '"' path '"' (the path is passed to open(2))
@@ -114,8 +114,7 @@ B<XATTR VALUE FILEGLOB> = I<FILEGLOB>
B<PROFILE FLAG CONDS> = [ 'flags=' ] '(' comma or white space separated list of I<PROFILE FLAGS> ')'
B<PROFILE FLAGS> = I<PROFILE MODE> | I<AUDIT_MODE> | 'mediate_deleted'
| 'attach_disconnected' | 'attach_disconnected.path='I<ABS PATH> | 'chroot_relative'
| 'attach_disconnected.ipc' | 'attach_disconnected.ipc='I<ABS PATH>
| 'attach_disconnected' | 'attach_disconneced.path='I<ABS PATH> | 'chroot_relative'
| 'debug' | 'interruptible' | 'kill.signal='I<SIGNAL> | 'error='I<ERROR CODE>
B<ERROR CODE> = (case insensitive error code name starting with 'E'; see errno(3))
@@ -561,14 +560,6 @@ allowed. Its intent is a debug and policy development tool.
attach disconnected objects to the supplied path instead of the root of
the namespace.
=item B<attach_disconnected.ipc> A subset of attach_disconnected, but specific
for IPC namespaces. It allows attaching disconnected IPC paths without having
to allow attaching all types of files.
=item B<attach_disconnected.ipc>=I<ABS PATH> Like attach_disconnected.ipc, but
attach disconnected posix mqueue to the supplied path instead of the root of
the namespace.
=item B<chroot_relative> This forces file names to be relative to a
chroot and behave as if the chroot is a mount namespace.
@@ -1196,17 +1187,17 @@ using inode access times. Matches only:
=item B<< mount options=(ro, atime) options in (nodev, user) /dev/foo -E<gt> /mnt/, >>
allow mounting /dev/foo on /mnt/ read only and using inode access times, in
addition to allowing some combination of 'nodev' and 'user' to be added on top.
allow mounting /dev/foo on /mmt/ read only and using inode access times or
allow mounting /dev/foo on /mnt/ with some combination of 'nodev' and 'user'.
Matches only:
$ mount -o ro,atime /dev/foo /mnt
$ mount -o ro,atime,nodev /dev/foo /mnt
$ mount -o nodev /dev/foo /mnt
$ mount -o ro,atime,user /dev/foo /mnt
$ mount -o user /dev/foo /mnt
$ mount -o ro,atime,nodev,user /dev/foo /mnt
$ mount -o nodev,user /dev/foo /mnt
=back
@@ -1802,84 +1793,8 @@ site-specific customization of B<@{HOMEDIRS}>,
F</etc/apparmor.d/tunables/multiarch.d> for B<@{multiarch}> and
F</etc/apparmor.d/tunables/xdg-user-dirs.d> for B<@{XDG_*}>.
=head3 Special builtin variables
AppArmor has some builtin variables that are not declared in policy
but are available to be used in policy.
@{profile_name} - the profile name
@{attach_path} - the profile exec attachment path - if one has been defined
@{exec_path} - the executables path
The B<@{profile_name}> variable is set to the profile name and may be
used in all policy. It is only defined when used inside of a profile.
The B<@{attach_path}> variable is only defined if the profile will attach
to an executable. It will be the path attachment specification or
if that is not defined it may be the profile's name if the profile name
is a path.
The B<@{exec_path}> variable like B<@{attach_path}> is only defined if
the profile attaches to an executable. If the kernel supports it as a
kernel variable, it will be set to the specific path that matches the
executable at run time. If the kernel does not support kernel variables
it will have the same value as B<@{attach_path}>.
=head3 Notes on variable expansion and the / character
It is important to note that how AppArmor performs variable expansion
depends on the context where a variable is used. When a variable is
expanded it can result in a string with multiple path characters
next to each other, in a way that is not evident when looking at
policy.
Eg.
=over 4
Given the following variable definition and rule
@{HOME}=/home/*/
file rw @{HOME}/*,
The variable expansion results in a rule of
file rw /home/*//*.
=back
When this occurs in a context where a path is expected, AppArmor will
canonicalize the path by collapsing consecutive / characters into
a single character. For the above example, this would be
file rw /home/*/*,
There is one exception to this rule, when the consecutive / characters
are at the beginning of a path, this indicates a posix namespace
and the characters will not be collapsed.
Eg.
=over 4
@{HOME}=/home/*/
file rw /@{HOME}/*,
will result in an expansion of
file rw //home/*//*,
which is collapsed to
file rw //home/*/*,
Note: that the leading // in the above example is not collapsed to a
single /. However the second // (that was also seen in the first
example) is collapsed.
=back
The special B<@{profile_name}> variable is set to the profile name and may be
used in all policy.
=head2 Alias rules
@@ -2148,8 +2063,6 @@ If the policy abi is specified as B<kernel> then the running kernel's
abi will be used. This should never be used in shipped policy as it
can cause system breakage when a new kernel is installed.
The special abi B<default> is equivalent to not specifying an ABI.
=head3 ABI compatibility with AppArmor 2.x
AppArmor 3 remains compatible with AppArmor 2.x by detecting when a
@@ -2182,8 +2095,9 @@ An example AppArmor profile:
/lib/lib*.so* r,
/proc/[0-9]** r,
/usr/lib/** r,
/tmp/foo.pid wr,
/tmp/foo.* lrw,
@{HOME}/.foo_file rw,
/@{HOME}/.foo_file rw,
/usr/bin/baz Cx -> baz,
# a comment about foo's hat (subprofile), bar.

View File

@@ -18,7 +18,6 @@
#include "cond_expr.h"
#include "parser.h"
#include "symtab.h"
cond_expr::cond_expr(bool result):
result(result)
@@ -27,21 +26,20 @@ cond_expr::cond_expr(bool result):
cond_expr::cond_expr(const char *var, bool defined)
{
variable *ref;
char *var_name = process_var(var);
if (!defined) {
ref = symtab::get_boolean_var(var);
if (!ref) {
int ret = get_boolean_var(var_name);
if (ret < 0) {
/* FIXME check for set var */
free(var_name);
yyerror(_("Unset boolean variable %s used in if-expression"), var);
}
result = ref->boolean;
result = ret;
} else {
ref = symtab::get_set_var(var);
if (!ref) {
result = false;
} else {
PDEBUG("Matched: defined set expr %s value %s\n", var, ref->expanded.begin()->c_str());
result = true;
}
void *set_value = get_set_var(var_name);
PDEBUG("Matched: defined set expr %s value %lx\n", var_name, (long) set_value);
result = !! (long) set_value;
}
free(var_name);
}

View File

@@ -42,7 +42,7 @@ public:
dbus_rule(perm32_t perms_p, struct cond_entry *conds,
struct cond_entry *peer_conds);
~dbus_rule() override {
virtual ~dbus_rule() {
free(bus);
free(name);
free(peer_label);
@@ -50,7 +50,7 @@ public:
free(interface);
free(member);
};
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
if (p.owner != OWNER_UNSPECIFIED) {
error = "owner prefix not allowed on dbus rules";
return false;
@@ -58,12 +58,12 @@ public:
return true;
};
ostream &dump(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override;
virtual ostream &dump(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof);
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const
{
int res = perms_rule_t::cmp(rhs);
if (res)
@@ -89,7 +89,7 @@ public:
protected:
void warn_once(const char *name) override;
virtual void warn_once(const char *name) override;
};
#endif /* __AA_DBUS_H */

View File

@@ -21,12 +21,14 @@
#include <set>
#include <string>
using namespace std;
/* TODO: have includecache be a frontend for file cache, don't just
* store name.
*/
class IncludeCache_t {
public:
std::set<std::string> cache;
set<string> cache;
IncludeCache_t() = default;
virtual ~IncludeCache_t() = default;
@@ -37,7 +39,7 @@ public:
}
bool insert(const char *name) {
std::pair<std::set<std::string>::iterator,bool> res = cache.insert(name);
pair<set<string>::iterator,bool> res = cache.insert(name);
if (res.second == false) {
return false;
}

View File

@@ -32,12 +32,12 @@ public:
char *label;
io_uring_rule(perm32_t perms, struct cond_entry *conds, struct cond_entry *ring_conds);
~io_uring_rule() override
virtual ~io_uring_rule()
{
free(label);
};
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
if (p.owner) {
error = _("owner prefix not allowed on io_uring rules");
return false;
@@ -45,12 +45,12 @@ public:
return true;
};
ostream &dump(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override;
virtual ostream &dump(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof);
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const
{
int res = perms_rule_t::cmp(rhs);
if (res)
@@ -60,7 +60,7 @@ public:
};
protected:
void warn_once(const char *name) override;
virtual void warn_once(const char *name) override;
};
#endif /* __AA_IO_URING_H */

View File

@@ -28,8 +28,6 @@
#include "lib.h"
#include "parser.h"
using namespace std;
int dirat_for_each(int dirfd, const char *name, void *data,
int (* cb)(int, const char *, struct stat *, void *))
{

View File

@@ -34,7 +34,6 @@
#include "chfa.h"
#include "../immunix.h"
using namespace std;
aare_rules::~aare_rules(void)
{
@@ -203,7 +202,7 @@ bool aare_rules::append_rule(const char *rule, bool oob, bool with_perm,
CHFA *aare_rules::create_chfa(int *min_match_len,
vector <aa_perms> &perms_table,
optflags const &opts, bool filedfa,
bool extended_perms)
bool extended_perms, bool prompt)
{
/* finish constructing the expr tree from the different permission
* set nodes */
@@ -315,7 +314,7 @@ CHFA *aare_rules::create_chfa(int *min_match_len,
//cerr << "Checking extended perms " << extended_perms << "\n";
if (extended_perms) {
//cerr << "creating permstable\n";
dfa.compute_perms_table(perms_table);
dfa.compute_perms_table(perms_table, prompt);
// TODO: move perms table to a class
if (opts.dump & DUMP_DFA_TRANS_TABLE && perms_table.size()) {
cerr << "Perms Table size: " << perms_table.size() << "\n";
@@ -329,7 +328,7 @@ CHFA *aare_rules::create_chfa(int *min_match_len,
cerr << "\n";
}
}
chfa = new CHFA(dfa, eq, opts, extended_perms);
chfa = new CHFA(dfa, eq, opts, extended_perms, prompt);
if (opts.dump & DUMP_DFA_TRANS_TABLE)
chfa->dump(cerr);
if (opts.dump & DUMP_DFA_COMPTRESSED_STATES)
@@ -350,14 +349,15 @@ CHFA *aare_rules::create_chfa(int *min_match_len,
void *aare_rules::create_dfablob(size_t *size, int *min_match_len,
vector <aa_perms> &perms_table,
optflags const &opts, bool filedfa,
bool extended_perms)
bool extended_perms, bool prompt)
{
char *buffer = NULL;
stringstream stream;
try {
CHFA *chfa = create_chfa(min_match_len, perms_table,
opts, filedfa, extended_perms);
opts, filedfa, extended_perms,
prompt);
if (!chfa) {
*size = 0;
return NULL;
@@ -382,3 +382,82 @@ void *aare_rules::create_dfablob(size_t *size, int *min_match_len,
return buffer;
}
/* create a dfa from the ruleset
* returns: buffer contain dfa tables, @size set to the size of the tables
* else NULL on failure, @min_match_len set to the shortest string
* that can match the dfa for determining xmatch priority.
*/
void *aare_rules::create_welded_dfablob(aare_rules *file_rules,
size_t *size, int *min_match_len,
size_t *new_start,
vector <aa_perms> &perms_table,
optflags const &opts,
bool extended_perms, bool prompt)
{
int file_min_len;
vector <aa_perms> file_perms;
CHFA *file_chfa;
try {
file_chfa = file_rules->create_chfa(&file_min_len,
file_perms, opts,
true, extended_perms, prompt);
if (!file_chfa) {
*size = 0;
return NULL;
}
}
catch(int error) {
*size = 0;
return NULL;
}
CHFA *policy_chfa;
try {
policy_chfa = create_chfa(min_match_len,
perms_table, opts,
false, extended_perms, prompt);
if (!policy_chfa) {
delete file_chfa;
*size = 0;
return NULL;
}
}
catch(int error) {
delete file_chfa;
*size = 0;
return NULL;
}
stringstream stream;
try {
policy_chfa->weld_file_to_policy(*file_chfa, *new_start,
extended_perms, prompt,
perms_table, file_perms);
policy_chfa->flex_table(stream, opts);
}
catch(int error) {
delete (file_chfa);
delete (policy_chfa);
*size = 0;
return NULL;
}
delete file_chfa;
delete policy_chfa;
/* write blob to buffer */
stringbuf *buf = stream.rdbuf();
buf->pubseekpos(0);
*size = buf->in_avail();
if (file_min_len < *min_match_len)
*min_match_len = file_min_len;
char *buffer = (char *)malloc(*size);
if (!buffer)
return NULL;
buf->sgetn(buffer, *size);
return buffer;
}

View File

@@ -59,7 +59,7 @@ public:
class UniquePermsCache {
public:
typedef std::map<UniquePerm, Node*> UniquePermMap;
typedef map<UniquePerm, Node*> UniquePermMap;
typedef UniquePermMap::iterator iterator;
UniquePermMap nodes;
@@ -89,7 +89,7 @@ public:
node = new ExactMatchFlag(priority, perms, audit);
else
node = new MatchFlag(priority, perms, audit);
std::pair<iterator, bool> val = nodes.insert(std::make_pair(tmp, node));
pair<iterator, bool> val = nodes.insert(make_pair(tmp, node));
if (val.second == false) {
delete node;
return val.first->second;
@@ -121,13 +121,19 @@ class aare_rules {
optflags const &opts, bool oob);
bool append_rule(const char *rule, bool oob, bool with_perm, optflags const &opts);
CHFA *create_chfa(int *min_match_len,
std::vector <aa_perms> &perms_table,
vector <aa_perms> &perms_table,
optflags const &opts, bool filedfa,
bool extended_perms);
bool extended_perms, bool prompt);
void *create_dfablob(size_t *size, int *min_match_len,
std::vector <aa_perms> &perms_table,
vector <aa_perms> &perms_table,
optflags const &opts,
bool filedfa, bool extended_perms);
bool filedfa, bool extended_perms, bool prompt);
void *create_welded_dfablob(aare_rules *file_rules,
size_t *size, int *min_match_len,
size_t *new_start,
vector <aa_perms> &perms_table,
optflags const &opts,
bool extended_perms, bool prompt);
};
#endif /* __LIBAA_RE_RULES_H */

View File

@@ -37,8 +37,6 @@
#include "../policydb.h"
#include "flex-tables.h"
using namespace std;
void CHFA::init_free_list(vector<pair<size_t, size_t> > &free_list,
size_t prev, size_t start)
{
@@ -59,7 +57,7 @@ void CHFA::init_free_list(vector<pair<size_t, size_t> > &free_list,
* permtable index flag
*/
CHFA::CHFA(DFA &dfa, map<transchar, transchar> &eq, optflags const &opts,
bool permindex): eq(eq)
bool permindex, bool prompt): eq(eq)
{
if (opts.dump & DUMP_DFA_TRANS_PROGRESS)
fprintf(stderr, "Compressing HFA:\r");
@@ -118,10 +116,12 @@ CHFA::CHFA(DFA &dfa, map<transchar, transchar> &eq, optflags const &opts,
accept2.resize(max(dfa.states.size(), (size_t) 2));
dfa.nonmatching->map_perms_to_accept(accept[0],
accept2[0],
accept3);
accept3,
prompt);
dfa.start->map_perms_to_accept(accept[1],
accept2[1],
accept3);
accept3,
prompt);
}
next_check.resize(max(optimal, (size_t) dfa.max_range));
free_list.resize(next_check.size());
@@ -145,7 +145,8 @@ CHFA::CHFA(DFA &dfa, map<transchar, transchar> &eq, optflags const &opts,
else
(*i)->map_perms_to_accept(accept[num.size()],
accept2[num.size()],
accept3);
accept3,
prompt);
num.insert(make_pair(*i, num.size()));
}
if (opts.dump & (DUMP_DFA_TRANS_PROGRESS)) {
@@ -167,7 +168,8 @@ CHFA::CHFA(DFA &dfa, map<transchar, transchar> &eq, optflags const &opts,
else
i->second->map_perms_to_accept(accept[num.size()],
accept2[num.size()],
accept3);
accept3,
prompt);
num.insert(make_pair(i->second, num.size()));
}
if (opts.dump & (DUMP_DFA_TRANS_PROGRESS)) {
@@ -515,3 +517,116 @@ void CHFA::flex_table(ostream &os, optflags const &opts) {
flex_table_serialize<uint16_t>(*this, os, (1 << 16) - 1);
}
}
/*
* @file_chfa: chfa to add on to the policy chfa
* @new_start: new start state for where the @file_dfa is in the new chfa
*
* Make a new chfa that is a combination of policy and file chfas. It
* assumes policy is built with AA_CLASS_FILE support transition. The
* resultant chfa will have file states and indexes offset except for
* start and null states.
*
* NOTE:
* - modifies chfa
* requires:
* - no ec
* - policy chfa has transitions state[start].next[AA_CLASS_FILE]
* - policy perms table is build if using permstable
*/
void CHFA::weld_file_to_policy(CHFA &file_chfa, size_t &new_start,
bool accept_idx, bool prompt,
vector <aa_perms> &policy_perms,
vector <aa_perms> &file_perms)
{
// doesn't support remapping eq classes yet
if (eq.size() > 0 || file_chfa.eq.size() > 0)
throw 1;
size_t old_base_size = default_base.size();
size_t old_next_size = next_check.size();
const State *nonmatching = default_base[0].first;
//const State *start = default_base[1].first;
const State *file_nonmatching = file_chfa.default_base[0].first;
// renumber states from file_dfa by appending to policy dfa
num.insert(make_pair(file_nonmatching, 0)); // remap to policy nonmatching
for (map<const State *, size_t>::iterator i = file_chfa.num.begin(); i != file_chfa.num.end() ; i++) {
if (i->first == file_nonmatching)
continue;
num.insert(make_pair(i->first, i->second + old_base_size));
}
// handle default and base table expansion, and setup renumbering
// while we remap file_nonmatch within the table, we still keep its
// slot.
bool first = true;
for (DefaultBase::iterator i = file_chfa.default_base.begin(); i != file_chfa.default_base.end(); i++) {
const State *def;
size_t base;
if (first) {
first = false;
// remap file_nonmatch to nonmatch
def = nonmatching;
base = 0;
} else {
def = i->first;
base = i->second + old_next_size;
}
default_base.push_back(make_pair(def, base));
}
// mapping for these are handled by num[]
for (NextCheck::iterator i = file_chfa.next_check.begin(); i != file_chfa.next_check.end(); i++) {
next_check.push_back(*i);
}
// append file perms to policy perms, and rework permsidx if needed
if (accept_idx) {
// policy idx double
// file + doubled offset
// Requires: policy perms table, so we can double and
// update indexes
// * file perm idx to start on even idx
// * policy perms table size to double and entries
// to repeat
assert(accept.size() == old_base_size);
accept.resize(accept.size() + file_chfa.accept.size());
assert(policy_perms.size() < std::numeric_limits<ssize_t>::max());
ssize_t size = (ssize_t) policy_perms.size();
policy_perms.resize(size*2 + file_perms.size());
// shift and double the policy perms
for (ssize_t i = size - 1; i >= 0; i--) {
policy_perms[i*2] = policy_perms[i];
policy_perms[i*2 + 1] = policy_perms[i];
}
// update policy accept idx for the new shifted perms table
for (size_t i = 0; i < old_base_size; i++) {
accept[i] = accept[i]*2;
}
// copy over file perms
for (size_t i = 0; i < file_perms.size(); i++) {
policy_perms[size*2 + i] = file_perms[i];
}
// shift file accept indexs
for (size_t i = 0; i < file_chfa.accept.size(); i++) {
accept[old_base_size + i] = file_chfa.accept[i] + size*2;
}
} else {
// perms are stored in accept just append the perms
size_t size = accept.size();
accept.resize(size + file_chfa.accept.size());
accept2.resize(size + file_chfa.accept.size());
for (size_t i = 0; i < file_chfa.accept.size(); i++) {
accept[size + i] = file_chfa.accept[i];
accept2[size + i] = file_chfa.accept2[i];
}
}
// Rework transition state[start].next[AA_CLASS_FILE]
next_check[default_base[1].second + AA_CLASS_FILE].first = file_chfa.start;
new_start = num[file_chfa.start];
}

View File

@@ -32,33 +32,39 @@
#define MATCH_FLAG_OOB_TRANSITION 0x20000000
#define base_mask_size(X) ((X) & ~BASE32_FLAGS)
typedef std::vector<std::pair<const State *, size_t> > DefaultBase;
typedef std::vector<std::pair<const State *, const State *> > NextCheck;
using namespace std;
typedef vector<pair<const State *, size_t> > DefaultBase;
typedef vector<pair<const State *, const State *> > NextCheck;
class CHFA {
public:
CHFA(void);
CHFA(DFA &dfa, std::map<transchar, transchar> &eq, optflags const &opts,
bool permindex);
CHFA(DFA &dfa, map<transchar, transchar> &eq, optflags const &opts,
bool permindex, bool prompt);
void dump(ostream & os);
void flex_table(ostream &os, optflags const &opts);
void init_free_list(std::vector<std::pair<size_t, size_t> > &free_list,
void init_free_list(vector<pair<size_t, size_t> > &free_list,
size_t prev, size_t start);
bool fits_in(std::vector<std::pair<size_t, size_t> > &free_list, size_t base,
bool fits_in(vector<pair<size_t, size_t> > &free_list, size_t base,
StateTrans &cases);
void insert_state(std::vector<std::pair<size_t, size_t> > &free_list,
void insert_state(vector<pair<size_t, size_t> > &free_list,
State *state, DFA &dfa);
void weld_file_to_policy(CHFA &file_chfa, size_t &new_start,
bool accept_idx, bool prompt,
vector <aa_perms> &policy_perms,
vector <aa_perms> &file_perms);
// private:
// sigh templates suck, friend declaration does not work so for now
// make these public
std::vector<uint32_t> accept;
std::vector<uint32_t> accept2;
vector<uint32_t> accept;
vector<uint32_t> accept2;
DefaultBase default_base;
NextCheck next_check;
const State *start;
Renumber_Map num;
std::map<transchar, transchar> eq;
map<transchar, transchar> eq;
unsigned int chfaflags;
private:
transchar max_eq;

View File

@@ -38,8 +38,6 @@
#include "expr-tree.h"
#include "apparmor_re.h"
using namespace std;
/* Use a single static EpsNode as it carries no node specific information */
EpsNode epsnode;

View File

@@ -44,6 +44,8 @@
#include "../perms.h"
#include "apparmor_re.h"
using namespace std;
/*
* transchar - representative input character for state transitions
*
@@ -144,9 +146,9 @@ public:
class Chars {
public:
std::set<transchar> chars;
set<transchar> chars;
typedef std::set<transchar>::iterator iterator;
typedef set<transchar>::iterator iterator;
iterator begin() { return chars.begin(); }
iterator end() { return chars.end(); }
@@ -164,11 +166,11 @@ public:
{
return chars.find(key);
}
std::pair<iterator,bool> insert(transchar c)
pair<iterator,bool> insert(transchar c)
{
return chars.insert(c);
}
std::pair<iterator,bool> insert(char c)
pair<iterator,bool> insert(char c)
{
transchar tmp(c);
return chars.insert(tmp);
@@ -179,9 +181,9 @@ public:
ostream &operator<<(ostream &os, transchar c);
/* Compute the union of two sets. */
template<class T> std::set<T> operator+(const std::set<T> &a, const std::set<T> &b)
template<class T> set<T> operator+(const set<T> &a, const set<T> &b)
{
std::set<T> c(a);
set<T> c(a);
c.insert(b.begin(), b.end());
return c;
}
@@ -194,7 +196,7 @@ template<class T> std::set<T> operator+(const std::set<T> &a, const std::set<T>
*/
class Node;
class ImportantNode;
typedef std::set<ImportantNode *> NodeSet;
typedef set<ImportantNode *> NodeSet;
/**
* Text-dump a state (for debugging).
@@ -210,12 +212,12 @@ ostream &operator<<(ostream &os, const NodeSet &state);
* enumerating all the explicit tranitions for default matches.
*/
typedef struct Cases {
typedef std::map<transchar, NodeSet *>::iterator iterator;
typedef map<transchar, NodeSet *>::iterator iterator;
iterator begin() { return cases.begin(); }
iterator end() { return cases.end(); }
Cases(): otherwise(0) { }
std::map<transchar, NodeSet *> cases;
map<transchar, NodeSet *> cases;
NodeSet *otherwise;
} Cases;
@@ -371,13 +373,13 @@ public:
{
type_flags |= NODE_TYPE_TWOCHILD;
};
int normalize_eps(int dir) override;
virtual int normalize_eps(int dir);
};
class LeafNode: public Node {
public:
LeafNode(): Node() { type_flags |= NODE_TYPE_LEAF; };
void normalize(int dir __attribute__((unused))) override { return; }
virtual void normalize(int dir __attribute__((unused))) { return; }
};
/* Match nothing (//). */
@@ -389,22 +391,22 @@ public:
nullable = true;
label = 0;
}
void release(void) override
void release(void)
{
/* don't delete Eps nodes because there is a single static
* instance shared by all trees. Look for epsnode in the code
*/
}
void compute_firstpos() override { }
void compute_lastpos() override { }
int eq(Node *other) override
void compute_firstpos() { }
void compute_lastpos() { }
int eq(Node *other)
{
if (other->is_type(NODE_TYPE_EPS))
return 1;
return 0;
}
ostream &dump(ostream &os) override
ostream &dump(ostream &os)
{
return os << "[]";
}
@@ -418,8 +420,8 @@ public:
class ImportantNode: public LeafNode {
public:
ImportantNode(): LeafNode() { type_flags |= NODE_TYPE_IMPORTANT; }
void compute_firstpos() override { firstpos.insert(this); }
void compute_lastpos() override { lastpos.insert(this); }
void compute_firstpos() { firstpos.insert(this); }
void compute_lastpos() { lastpos.insert(this); }
virtual void follow(Cases &cases) = 0;
virtual int is_accept(void) = 0;
virtual int is_postprocess(void) = 0;
@@ -431,15 +433,15 @@ public:
class CNode: public ImportantNode {
public:
CNode(): ImportantNode() { type_flags |= NODE_TYPE_C; }
int is_accept(void) override { return false; }
int is_postprocess(void) override { return false; }
int is_accept(void) { return false; }
int is_postprocess(void) { return false; }
};
/* Match one specific character (/c/). */
class CharNode: public CNode {
public:
CharNode(transchar c): c(c) { type_flags |= NODE_TYPE_CHAR; }
void follow(Cases &cases) override
void follow(Cases &cases)
{
NodeSet **x = &cases.cases[c];
if (!*x) {
@@ -450,7 +452,7 @@ public:
}
(*x)->insert(followpos.begin(), followpos.end());
}
int eq(Node *other) override
int eq(Node *other)
{
if (other->is_type(NODE_TYPE_CHAR)) {
CharNode *o = static_cast<CharNode *>(other);
@@ -458,12 +460,12 @@ public:
}
return 0;
}
ostream &dump(ostream &os) override
ostream &dump(ostream &os)
{
return os << c;
}
int min_match_len() override
int min_match_len()
{
if (c < 0) {
// oob characters indicates end of string.
@@ -475,7 +477,7 @@ public:
return 1;
}
bool contains_oob() override { return c < 0; }
bool contains_oob() { return c < 0; }
transchar c;
};
@@ -487,7 +489,7 @@ public:
{
type_flags |= NODE_TYPE_CHARSET;
}
void follow(Cases &cases) override
void follow(Cases &cases)
{
for (Chars::iterator i = chars.begin(); i != chars.end(); i++) {
NodeSet **x = &cases.cases[*i];
@@ -500,7 +502,7 @@ public:
(*x)->insert(followpos.begin(), followpos.end());
}
}
int eq(Node *other) override
int eq(Node *other)
{
if (!other->is_type(NODE_TYPE_CHARSET))
return 0;
@@ -516,7 +518,7 @@ public:
}
return 1;
}
ostream &dump(ostream &os) override
ostream &dump(ostream &os)
{
os << '[';
for (Chars::iterator i = chars.begin(); i != chars.end(); i++)
@@ -524,7 +526,7 @@ public:
return os << ']';
}
int min_match_len() override
int min_match_len()
{
if (contains_oob()) {
return 0;
@@ -532,7 +534,7 @@ public:
return 1;
}
bool contains_oob() override
bool contains_oob()
{
for (Chars::iterator i = chars.begin(); i != chars.end(); i++) {
if (*i < 0) {
@@ -552,7 +554,7 @@ public:
{
type_flags |= NODE_TYPE_NOTCHARSET;
}
void follow(Cases &cases) override
void follow(Cases &cases)
{
if (!cases.otherwise)
cases.otherwise = new NodeSet;
@@ -573,7 +575,7 @@ public:
followpos.end());
}
}
int eq(Node *other) override
int eq(Node *other)
{
if (!other->is_type(NODE_TYPE_NOTCHARSET))
return 0;
@@ -589,7 +591,7 @@ public:
}
return 1;
}
ostream &dump(ostream &os) override
ostream &dump(ostream &os)
{
os << "[^";
for (Chars::iterator i = chars.begin(); i != chars.end(); i++)
@@ -597,7 +599,7 @@ public:
return os << ']';
}
int min_match_len() override
int min_match_len()
{
/* Inverse match does not match any oob char at this time
* so only count characters
@@ -605,7 +607,7 @@ public:
return 1;
}
bool contains_oob() override
bool contains_oob()
{
for (Chars::iterator i = chars.begin(); i != chars.end(); i++) {
if (*i < 0) {
@@ -622,7 +624,7 @@ public:
class AnyCharNode: public CNode {
public:
AnyCharNode() { type_flags |= NODE_TYPE_ANYCHAR; }
void follow(Cases &cases) override
void follow(Cases &cases)
{
if (!cases.otherwise)
cases.otherwise = new NodeSet;
@@ -633,13 +635,13 @@ public:
if (i->first.c >= 0)
i->second->insert(followpos.begin(), followpos.end());
}
int eq(Node *other) override
int eq(Node *other)
{
if (other->is_type(NODE_TYPE_ANYCHAR))
return 1;
return 0;
}
ostream &dump(ostream &os) override { return os << "."; }
ostream &dump(ostream &os) { return os << "."; }
};
/* Match a node zero or more times. (This is a unary operator.) */
@@ -650,29 +652,29 @@ public:
type_flags |= NODE_TYPE_STAR;
nullable = true;
}
void compute_firstpos() override { firstpos = child[0]->firstpos; }
void compute_lastpos() override { lastpos = child[0]->lastpos; }
void compute_followpos() override
void compute_firstpos() { firstpos = child[0]->firstpos; }
void compute_lastpos() { lastpos = child[0]->lastpos; }
void compute_followpos()
{
NodeSet from = child[0]->lastpos, to = child[0]->firstpos;
for (NodeSet::iterator i = from.begin(); i != from.end(); i++) {
(*i)->followpos.insert(to.begin(), to.end());
}
}
int eq(Node *other) override
int eq(Node *other)
{
if (other->is_type(NODE_TYPE_STAR))
return child[0]->eq(other->child[0]);
return 0;
}
ostream &dump(ostream &os) override
ostream &dump(ostream &os)
{
os << '(';
child[0]->dump(os);
return os << ")*";
}
bool contains_oob() override { return child[0]->contains_oob(); }
bool contains_oob() { return child[0]->contains_oob(); }
};
/* Match a node zero or one times. */
@@ -683,15 +685,15 @@ public:
type_flags |= NODE_TYPE_OPTIONAL;
nullable = true;
}
void compute_firstpos() override { firstpos = child[0]->firstpos; }
void compute_lastpos() override { lastpos = child[0]->lastpos; }
int eq(Node *other) override
void compute_firstpos() { firstpos = child[0]->firstpos; }
void compute_lastpos() { lastpos = child[0]->lastpos; }
int eq(Node *other)
{
if (other->is_type(NODE_TYPE_OPTIONAL))
return child[0]->eq(other->child[0]);
return 0;
}
ostream &dump(ostream &os) override
ostream &dump(ostream &os)
{
os << '(';
child[0]->dump(os);
@@ -706,28 +708,28 @@ public:
{
type_flags |= NODE_TYPE_PLUS;
}
void compute_nullable() override { nullable = child[0]->nullable; }
void compute_firstpos() override { firstpos = child[0]->firstpos; }
void compute_lastpos() override { lastpos = child[0]->lastpos; }
void compute_followpos() override
void compute_nullable() { nullable = child[0]->nullable; }
void compute_firstpos() { firstpos = child[0]->firstpos; }
void compute_lastpos() { lastpos = child[0]->lastpos; }
void compute_followpos()
{
NodeSet from = child[0]->lastpos, to = child[0]->firstpos;
for (NodeSet::iterator i = from.begin(); i != from.end(); i++) {
(*i)->followpos.insert(to.begin(), to.end());
}
}
int eq(Node *other) override {
int eq(Node *other) {
if (other->is_type(NODE_TYPE_PLUS))
return child[0]->eq(other->child[0]);
return 0;
}
ostream &dump(ostream &os) override {
ostream &dump(ostream &os) {
os << '(';
child[0]->dump(os);
return os << ")+";
}
int min_match_len() override { return child[0]->min_match_len(); }
bool contains_oob() override { return child[0]->contains_oob(); }
int min_match_len() { return child[0]->min_match_len(); }
bool contains_oob() { return child[0]->contains_oob(); }
};
/* Match a pair of consecutive nodes. */
@@ -737,32 +739,32 @@ public:
{
type_flags |= NODE_TYPE_CAT;
}
void compute_nullable() override
void compute_nullable()
{
nullable = child[0]->nullable && child[1]->nullable;
}
void compute_firstpos() override
void compute_firstpos()
{
if (child[0]->nullable)
firstpos = child[0]->firstpos + child[1]->firstpos;
else
firstpos = child[0]->firstpos;
}
void compute_lastpos() override
void compute_lastpos()
{
if (child[1]->nullable)
lastpos = child[0]->lastpos + child[1]->lastpos;
else
lastpos = child[1]->lastpos;
}
void compute_followpos() override
void compute_followpos()
{
NodeSet from = child[0]->lastpos, to = child[1]->firstpos;
for (NodeSet::iterator i = from.begin(); i != from.end(); i++) {
(*i)->followpos.insert(to.begin(), to.end());
}
}
int eq(Node *other) override
int eq(Node *other)
{
if (other->is_type(NODE_TYPE_CAT)) {
if (!child[0]->eq(other->child[0]))
@@ -771,14 +773,14 @@ public:
}
return 0;
}
ostream &dump(ostream &os) override
ostream &dump(ostream &os)
{
child[0]->dump(os);
child[1]->dump(os);
return os;
}
void normalize(int dir) override;
int min_match_len() override
void normalize(int dir);
int min_match_len()
{
int len = child[0]->min_match_len();
if (child[0]->contains_oob()) {
@@ -790,7 +792,7 @@ public:
}
return len + child[1]->min_match_len();
}
bool contains_oob() override
bool contains_oob()
{
return child[0]->contains_oob() || child[1]->contains_oob();
}
@@ -803,19 +805,19 @@ public:
{
type_flags |= NODE_TYPE_ALT;
}
void compute_nullable() override
void compute_nullable()
{
nullable = child[0]->nullable || child[1]->nullable;
}
void compute_lastpos() override
void compute_lastpos()
{
lastpos = child[0]->lastpos + child[1]->lastpos;
}
void compute_firstpos() override
void compute_firstpos()
{
firstpos = child[0]->firstpos + child[1]->firstpos;
}
int eq(Node *other) override
int eq(Node *other)
{
if (other->is_type(NODE_TYPE_ALT)) {
if (!child[0]->eq(other->child[0]))
@@ -824,7 +826,7 @@ public:
}
return 0;
}
ostream &dump(ostream &os) override
ostream &dump(ostream &os)
{
os << '(';
child[0]->dump(os);
@@ -833,8 +835,8 @@ public:
os << ')';
return os;
}
void normalize(int dir) override;
int min_match_len() override
void normalize(int dir);
int min_match_len()
{
int m1, m2;
m1 = child[0]->min_match_len();
@@ -844,7 +846,7 @@ public:
}
return m2;
}
bool contains_oob() override
bool contains_oob()
{
return child[0]->contains_oob() || child[1]->contains_oob();
}
@@ -856,20 +858,20 @@ public:
{
type_flags |= NODE_TYPE_SHARED;
}
void release(void) override
void release(void)
{
/* don't delete SharedNodes via release as they are shared, and
* will be deleted when the table they are stored in is deleted
*/
}
void follow(Cases &cases __attribute__ ((unused))) override
void follow(Cases &cases __attribute__ ((unused)))
{
/* Nothing to follow. */
}
/* requires shared nodes to be common by pointer */
int eq(Node *other) override { return (this == other); }
int eq(Node *other) { return (this == other); }
};
/**
@@ -879,8 +881,8 @@ public:
class AcceptNode: public SharedNode {
public:
AcceptNode() { type_flags |= NODE_TYPE_ACCEPT; }
int is_accept(void) override { return true; }
int is_postprocess(void) override { return false; }
int is_accept(void) { return true; }
int is_postprocess(void) { return false; }
};
class MatchFlag: public AcceptNode {
@@ -889,8 +891,7 @@ public:
{
type_flags |= NODE_TYPE_MATCHFLAG;
}
ostream &dump(ostream &os) override { return os << "< 0x" << std::hex << perms << std::dec << '>'; }
ostream &dump(ostream &os) { return os << "< 0x" << hex << perms << std::dec << '>'; }
int priority;
perm32_t perms;
@@ -924,7 +925,7 @@ public:
/* Traverse the syntax tree depth-first in an iterator-like manner. */
class depth_first_traversal {
std::stack<Node *>pos;
stack<Node *>pos;
void push_left(Node *node) {
pos.push(node);
@@ -1032,7 +1033,6 @@ public:
class CacheStats {
public:
virtual ~CacheStats() {}
unsigned long dup, sum, max;
CacheStats(void): dup(0), sum(0), max(0) { };
@@ -1050,16 +1050,16 @@ struct deref_less_than {
class NodeVecCache: public CacheStats {
public:
std::set<NodeVec *, deref_less_than> cache;
set<NodeVec *, deref_less_than> cache;
NodeVecCache(void): cache() { };
~NodeVecCache() override { clear(); };
~NodeVecCache() { clear(); };
unsigned long size(void) const override { return cache.size(); }
virtual unsigned long size(void) const { return cache.size(); }
void clear()
{
for (std::set<NodeVec *>::iterator i = cache.begin();
for (set<NodeVec *>::iterator i = cache.begin();
i != cache.end(); i++) {
delete *i;
}
@@ -1071,7 +1071,7 @@ public:
{
if (!nodes)
return NULL;
std::pair<std::set<NodeVec *>::iterator,bool> uniq;
pair<set<NodeVec *>::iterator,bool> uniq;
NodeVec *nv = new NodeVec(nodes);
uniq = cache.insert(nv);
if (uniq.second == false) {

View File

@@ -38,8 +38,6 @@
#include "../immunix.h"
#include "../perms.h"
using namespace std;
ostream &operator<<(ostream &os, const CacheStats &cache)
{
/* dump the state label */
@@ -85,12 +83,6 @@ ostream &operator<<(ostream &os, State &state)
return os;
}
ostream &operator<<(ostream &os, perms_t &perms)
{
perms.dump(os);
return os;
}
ostream &operator<<(ostream &os,
const std::pair<State * const, Renumber_Map *> &p)
{
@@ -334,16 +326,7 @@ State *DFA::add_new_state(optflags const &opts, NodeSet *anodes,
ProtoState proto;
proto.init(nnodev, anodev);
State *state;
try {
state = new State(opts, node_map.size(), proto, other, filedfa);
} catch(int error) {
/* this function is called in the DFA object creation,
* and the exception prevents the destructor from
* being called, so call the helper here */
cleanup();
throw error;
}
State *state = new State(opts, node_map.size(), proto, other, filedfa);
pair<NodeMap::iterator,bool> x = node_map.insert(proto, state);
if (x.second == false) {
delete state;
@@ -401,17 +384,7 @@ void DFA::update_state_transitions(optflags const &opts, State *state)
*/
for (Cases::iterator j = cases.begin(); j != cases.end(); j++) {
State *target;
try {
target = add_new_state(opts, j->second, nonmatching);
} catch (int error) {
/* when add_new_state fails, there could still
* be NodeSets in the rest of cases, so clean
* them up before re-throwing the exception */
for (Cases::iterator k = ++j; k != cases.end(); k++) {
delete k->second;
}
throw error;
}
target = add_new_state(opts, j->second, nonmatching);
/* Don't insert transition that the otherwise transition
* already covers
@@ -541,7 +514,11 @@ DFA::DFA(Node *root, optflags const &opts, bool buildfiledfa): root(root), filed
DFA::~DFA()
{
cleanup();
anodes_cache.clear();
nnodes_cache.clear();
for (Partition::iterator i = states.begin(); i != states.end(); i++)
delete *i;
}
State *DFA::match_len(State *state, const char *str, size_t len)
@@ -693,39 +670,6 @@ int DFA::apply_and_clear_deny(void)
return c;
}
ostream &DFA::dump_partition(ostream &os, Partition &p)
{
/* first entry is the representative state */
for (Partition::iterator i = p.begin(); i != p.end(); i++) {
os << **i;
if (i == p.begin())
os << " : ";
else
os << ", ";
}
os << "\n";
return os;
}
ostream &DFA::dump_partitions(ostream &os, const char *description,
list<Partition *> &partitions)
{
size_t j = 0;
os << "Dumping Minimization partition mapping: " << description << "\n";
for (list<Partition *>::iterator p = partitions.begin();
p != partitions.end(); p++) {
os << " [" << j++ << "] ";
os << (*(*p)->begin())->perms << ": ";
(void) dump_partition(os, **p);
os << "\n";
}
os << "\n";
return os;
}
/* minimize the number of dfa states */
void DFA::minimize(optflags const &opts)
@@ -759,9 +703,6 @@ void DFA::minimize(optflags const &opts)
<< " (accept " << accept_count << ")\r";
}
if (opts.dump & DUMP_DFA_MIN_PARTS)
(void) dump_partitions(cerr, "Initial", partitions);
/* perm_map is no longer needed so free the memory it is using.
* Don't remove - doing it manually here helps reduce peak memory usage.
*/
@@ -827,9 +768,6 @@ void DFA::minimize(optflags const &opts)
goto out;
}
if (opts.dump & DUMP_DFA_MIN_PARTS)
(void) dump_partitions(cerr, "Pre-remap", partitions);
/* Remap the dfa so it uses the representative states
* Use the first state of a partition as the representative state
* At this point all states with in a partition have transitions
@@ -1382,12 +1320,13 @@ void DFA::apply_equivalence_classes(map<transchar, transchar> &eq)
}
void DFA::compute_perms_table_ent(State *state, size_t pos,
vector <aa_perms> &perms_table)
vector <aa_perms> &perms_table,
bool prompt)
{
uint32_t accept1, accept2, accept3;
// until front end doesn't map the way it does
state->map_perms_to_accept(accept1, accept2, accept3);
state->map_perms_to_accept(accept1, accept2, accept3, prompt);
if (filedfa) {
state->idx = pos * 2;
perms_table[pos*2] = compute_fperms_user(accept1, accept2, accept3);
@@ -1398,7 +1337,7 @@ void DFA::compute_perms_table_ent(State *state, size_t pos,
}
}
void DFA::compute_perms_table(vector <aa_perms> &perms_table)
void DFA::compute_perms_table(vector <aa_perms> &perms_table, bool prompt)
{
size_t mult = filedfa ? 2 : 1;
size_t pos = 2;
@@ -1407,13 +1346,13 @@ void DFA::compute_perms_table(vector <aa_perms> &perms_table)
perms_table.resize(states.size() * mult);
// nonmatching and start need to be 0 and 1 so handle outside of loop
compute_perms_table_ent(nonmatching, 0, perms_table);
compute_perms_table_ent(start, 1, perms_table);
compute_perms_table_ent(nonmatching, 0, perms_table, prompt);
compute_perms_table_ent(start, 1, perms_table, prompt);
for (Partition::iterator i = states.begin(); i != states.end(); i++) {
if (*i == nonmatching || *i == start)
continue;
compute_perms_table_ent(*i, pos, perms_table);
compute_perms_table_ent(*i, pos, perms_table, prompt);
pos++;
}
}
@@ -1459,31 +1398,9 @@ static int pri_update_perm(optflags const &opts, vector<int> &priority, int i,
MatchFlag *match, perms_t &perms, perms_t &exact,
bool filedfa)
{
// scaling priority *4
int pri = match->priority<<2;
/* use priority to get proper ordering and application of the type
* of match flag.
*
* Note: this is the last use of priority, it is dropped and not
* used in the backend.
*/
if (match->is_type(NODE_TYPE_DENYMATCHFLAG))
pri += 3;
// exact match must be same priority as allow as its audit
// flags has the same priority.
// current no ALLOWMATCHFLAG it is just absence of other flags
// so it has to be second last in this list, using !last
// until this gets fixed
else if (match->is_type(NODE_TYPE_EXACTMATCHFLAG) ||
(!match->is_type(NODE_TYPE_PROMPTMATCHFLAG)))
pri += 2;
else if (match->is_type(NODE_TYPE_PROMPTMATCHFLAG))
pri += 1;
if (priority[i] > pri) {
if (priority[i] > match->priority) {
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " > " << pri << " SKIPPING " << hex << (match->perms) << "/" << (match->audit) << dec << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " > " << match->priority << " SKIPPING " << hex << (match->perms) << "/" << (match->audit) << dec << "\n";
return 0;
}
@@ -1499,8 +1416,8 @@ static int pri_update_perm(optflags const &opts, vector<int> &priority, int i,
if (match->perms & AA_EXEC_INHERIT) {
xmask |= AA_USER_EXEC_MMAP;
//USER_EXEC_MAP = 6
if (priority[6] < pri)
priority[6] = pri;
if (priority[6] < match->priority)
priority[6] = match->priority;
}
amask = mask | xmask;
} else if (mask & AA_OTHER_EXEC) {
@@ -1509,8 +1426,8 @@ static int pri_update_perm(optflags const &opts, vector<int> &priority, int i,
if (match->perms & AA_OTHER_EXEC_INHERIT) {
xmask |= AA_OTHER_EXEC_MMAP;
//OTHER_EXEC_MAP = 20
if (priority[20] < pri)
priority[20] = pri;
if (priority[20] < match->priority)
priority[20] = match->priority;
}
amask = mask | xmask;
} else if (((mask & AA_USER_EXEC_MMAP) &&
@@ -1519,17 +1436,17 @@ static int pri_update_perm(optflags const &opts, vector<int> &priority, int i,
(match->perms & AA_OTHER_EXEC_INHERIT))) {
// if exec && ix we handled mmp above
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << pri << " SKIPPING mmap unmasked " << hex << match->perms << "/" << match->audit << " masked " << (match->perms & amask) << "/" << (match->audit & amask) << " data " << (perms.allow & mask) << "/" << (perms.audit & mask) << " exact " << (exact.allow & mask) << "/" << (exact.audit & mask) << dec << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << match->priority << " SKIPPING mmap unmasked " << hex << match->perms << "/" << match->audit << " masked " << (match->perms & amask) << "/" << (match->audit & amask) << " data " << (perms.allow & mask) << "/" << (perms.audit & mask) << " exact " << (exact.allow & mask) << "/" << (exact.audit & mask) << dec << "\n";
return 0;
}
}
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " vs. " << pri << " mask: " << hex << mask << " xmask: " << xmask << " amask: " << amask << dec << "\n";
if (priority[i] < pri) {
cerr << " " << match << "[" << i << "]=" << priority[i] << " vs. " << match->priority << " mask: " << hex << mask << " xmask: " << xmask << " amask: " << amask << dec << "\n";
if (priority[i] < match->priority) {
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " < " << pri << " clearing " << hex << (perms.allow & amask) << "/" << (perms.audit & amask) << " -> " << dec;
priority[i] = pri;
cerr << " " << match << "[" << i << "]=" << priority[i] << " < " << match->priority << " clearing " << hex << (perms.allow & amask) << "/" << (perms.audit & amask) << " -> " << dec;
priority[i] = match->priority;
perms.clear_bits(amask);
exact.clear_bits(amask);
if (opts.dump & DUMP_DFA_PERMS)
@@ -1539,7 +1456,7 @@ static int pri_update_perm(optflags const &opts, vector<int> &priority, int i,
// the if conditions in order of permission priority
if (match->is_type(NODE_TYPE_DENYMATCHFLAG)) {
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << pri << " deny " << hex << (match->perms & amask) << "/" << (match->audit & amask) << dec << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << match->priority << " deny " << hex << (match->perms & amask) << "/" << (match->audit & amask) << dec << "\n";
perms.deny |= match->perms & amask;
perms.quiet |= match->audit & amask;
@@ -1549,11 +1466,11 @@ static int pri_update_perm(optflags const &opts, vector<int> &priority, int i,
} else if (match->is_type(NODE_TYPE_EXACTMATCHFLAG)) {
/* exact match only asserts dominance on the XTYPE */
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << pri << " exact " << hex << (match->perms & amask) << "/" << (match->audit & amask) << dec << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << match->priority << " exact " << hex << (match->perms & amask) << "/" << (match->audit & amask) << dec << "\n";
if (filedfa &&
!is_merged_x_consistent(exact.allow, match->perms & amask)) {
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << pri << " exact match conflict" << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << match->priority << " exact match conflict" << "\n";
return 1;
}
exact.allow |= match->perms & amask;
@@ -1574,11 +1491,11 @@ static int pri_update_perm(optflags const &opts, vector<int> &priority, int i,
// allow perms, if exact has been encountered will already be set
// if overlaps x here, don't conflict, because exact will override
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << pri << " allow " << hex << (match->perms & amask) << "/" << (match->audit & amask) << dec << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << match->priority << " allow " << hex << (match->perms & amask) << "/" << (match->audit & amask) << dec << "\n";
if (filedfa && !(exact.allow & mask) &&
!is_merged_x_consistent(perms.allow, match->perms & amask)) {
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << pri << " allow match conflict" << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << match->priority << " allow match conflict" << "\n";
return 1;
}
// mask off if XTYPE in xmatch
@@ -1592,11 +1509,11 @@ static int pri_update_perm(optflags const &opts, vector<int> &priority, int i,
}
} else { // if (match->is_type(NODE_TYPE_PROMPTMATCHFLAG)) {
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << pri << " prompt " << hex << (match->perms & amask) << "/" << (match->audit & amask) << dec << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << match->priority << " promt " << hex << (match->perms & amask) << "/" << (match->audit & amask) << dec << "\n";
if (filedfa && !((exact.allow | perms.allow) & mask) &&
!is_merged_x_consistent(perms.allow, match->perms & amask)) {
if (opts.dump & DUMP_DFA_PERMS)
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << pri << " prompt match conflict" << "\n";
cerr << " " << match << "[" << i << "]=" << priority[i] << " <= " << match->priority << " prompt match conflict" << "\n";
return 1;
}
if ((exact.allow | exact.audit | perms.allow | perms.audit) & mask) {
@@ -1622,8 +1539,9 @@ int accept_perms(optflags const &opts, NodeVec *state, perms_t &perms,
{
int error = 0;
perms_t exact;
// scaling priority by *4
std::vector<int> priority(sizeof(perm32_t)*8, MIN_INTERNAL_PRIORITY<<2); // 32 but wan't tied to perm32_t
// size of vector needs to be number of bits in the data type
// being used for the permission set.
std::vector<int> priority(sizeof(perm32_t)*8, MIN_INTERNAL_PRIORITY);
perms.clear();
if (!state)

View File

@@ -42,8 +42,8 @@ extern int prompt_compat_mode;
class State;
typedef std::map<transchar, State *> StateTrans;
typedef std::list<State *> Partition;
typedef map<transchar, State *> StateTrans;
typedef list<State *> Partition;
#include "../immunix.h"
@@ -60,12 +60,11 @@ public:
{
os << "(allow/deny/prompt/audit/quiet)";
}
ostream &dump(ostream &os)
void dump(ostream &os)
{
os << "(0x " << std::hex
os << "(0x " << hex
<< allow << "/" << deny << "/" << "/" << prompt << "/" << audit << "/" << quiet
<< ')' << std::dec;
return os;
<< ')' << dec;
}
void clear(void) {
@@ -289,10 +288,13 @@ public:
int apply_and_clear_deny(void) { return perms.apply_and_clear_deny(); }
void map_perms_to_accept(perm32_t &accept1, perm32_t &accept2,
perm32_t &accept3)
perm32_t &accept3, bool prompt)
{
accept1 = perms.allow;
accept2 = PACK_AUDIT_CTL(perms.audit, perms.quiet);
if (prompt && prompt_compat_mode == PROMPT_COMPAT_DEV)
accept2 = PACK_AUDIT_CTL(perms.prompt, perms.quiet);
else
accept2 = PACK_AUDIT_CTL(perms.audit, perms.quiet);
accept3 = perms.prompt;
}
@@ -314,16 +316,16 @@ public:
class NodeMap: public CacheStats
{
public:
typedef std::map<ProtoState, State *>::iterator iterator;
typedef map<ProtoState, State *>::iterator iterator;
iterator begin() { return cache.begin(); }
iterator end() { return cache.end(); }
std::map<ProtoState, State *> cache;
map<ProtoState, State *> cache;
NodeMap(void): cache() { };
~NodeMap() override { clear(); };
~NodeMap() { clear(); };
unsigned long size(void) const override { return cache.size(); }
virtual unsigned long size(void) const { return cache.size(); }
void clear()
{
@@ -331,10 +333,10 @@ public:
CacheStats::clear();
}
std::pair<iterator,bool> insert(ProtoState &proto, State *state)
pair<iterator,bool> insert(ProtoState &proto, State *state)
{
std::pair<iterator,bool> uniq;
uniq = cache.insert(std::make_pair(proto, state));
pair<iterator,bool> uniq;
uniq = cache.insert(make_pair(proto, state));
if (uniq.second == false) {
dup++;
} else {
@@ -346,7 +348,7 @@ public:
}
};
typedef std::map<const State *, size_t> Renumber_Map;
typedef map<const State *, size_t> Renumber_Map;
/* Transitions in the DFA. */
class DFA {
@@ -357,7 +359,7 @@ class DFA {
NodeSet *nnodes, State *other);
void update_state_transitions(optflags const &opts, State *state);
void process_work_queue(const char *header, optflags const &);
void dump_diff_chain(ostream &os, std::map<State *, Partition> &relmap,
void dump_diff_chain(ostream &os, map<State *, Partition> &relmap,
Partition &chain, State *state,
unsigned int &count, unsigned int &total,
unsigned int &max);
@@ -366,17 +368,8 @@ class DFA {
NodeVecCache anodes_cache;
NodeVecCache nnodes_cache;
NodeMap node_map;
std::list<State *> work_queue;
list<State *> work_queue;
void cleanup(void) {
anodes_cache.clear();
nnodes_cache.clear();
for (Partition::iterator i = states.begin(); i != states.end(); i++) {
delete *i;
}
states.clear();
}
public:
DFA(Node *root, optflags const &flags, bool filedfa);
virtual ~DFA();
@@ -398,15 +391,15 @@ public:
void dump(ostream &os, Renumber_Map *renum);
void dump_dot_graph(ostream &os);
void dump_uniq_perms(const char *s);
ostream &dump_partition(ostream &os, Partition &p);
ostream &dump_partitions(ostream &os, const char *description,
std::list<Partition *> &partitions);
std::map<transchar, transchar> equivalence_classes(optflags const &flags);
void apply_equivalence_classes(std::map<transchar, transchar> &eq);
map<transchar, transchar> equivalence_classes(optflags const &flags);
void apply_equivalence_classes(map<transchar, transchar> &eq);
void compute_perms_table_ent(State *state, size_t pos,
std::vector <aa_perms> &perms_table);
void compute_perms_table(std::vector <aa_perms> &perms_table);
vector <aa_perms> &perms_table,
bool prompt);
void compute_perms_table(vector <aa_perms> &perms_table,
bool prompt);
unsigned int diffcount;
int oob_range;
@@ -419,6 +412,6 @@ public:
bool filedfa;
};
void dump_equivalence_classes(ostream &os, std::map<transchar, transchar> &eq);
void dump_equivalence_classes(ostream &os, map<transchar, transchar> &eq);
#endif /* __LIBAA_RE_HFA_H */

View File

@@ -24,8 +24,6 @@
/* #define DEBUG_TREE */
#include "expr-tree.h"
using namespace std;
%}
%union {
@@ -62,7 +60,7 @@ static inline Chars* insert_char_range(Chars* cset, transchar a, transchar b)
%lex-param {YYLEX_PARAM}
%parse-param {Node **root}
%parse-param {const char *text}
%define api.prefix {regex_}
%name-prefix "regex_"
%token <c> CHAR
%type <c> regex_char cset_char1 cset_char cset_charN

View File

@@ -133,7 +133,8 @@ struct aa_perms compute_fperms_user(uint32_t accept1, uint32_t accept2,
perms.prompt = map_old_perms(dfa_user_allow(accept3));
perms.audit = map_old_perms(dfa_user_audit(accept1, accept2));
perms.quiet = map_old_perms(dfa_user_quiet(accept1, accept2));
perms.xindex = dfa_user_xindex(accept1);
if (prompt_compat_mode != PROMPT_COMPAT_PERMSV1)
perms.xindex = dfa_user_xindex(accept1);
compute_fperms_allow(&perms, accept1);
perms.prompt &= ~(perms.allow | perms.deny);
@@ -149,7 +150,8 @@ struct aa_perms compute_fperms_other(uint32_t accept1, uint32_t accept2,
perms.prompt = map_old_perms(dfa_other_allow(accept3));
perms.audit = map_old_perms(dfa_other_audit(accept1, accept2));
perms.quiet = map_old_perms(dfa_other_quiet(accept1, accept2));
perms.xindex = dfa_other_xindex(accept1);
if (prompt_compat_mode != PROMPT_COMPAT_PERMSV1)
perms.xindex = dfa_other_xindex(accept1);
compute_fperms_allow(&perms, accept1);
perms.prompt &= ~(perms.allow | perms.deny);
@@ -163,6 +165,12 @@ static uint32_t map_other(uint32_t x)
((x & 0x60) << 19); /* SETOPT/GETOPT */
}
static uint32_t map_xbits(uint32_t x)
{
return ((x & 0x1) << 7) |
((x & 0x7e) << 9);
}
struct aa_perms compute_perms_entry(uint32_t accept1, uint32_t accept2,
uint32_t accept3)
// don't need to worry about version internally within the parser

View File

@@ -228,8 +228,6 @@
#include "profile.h"
#include "mount.h"
using namespace std;
struct mnt_keyword_table {
const char *keyword;
unsigned int set;
@@ -290,7 +288,7 @@ static struct mnt_keyword_table mnt_opts_table[] = {
{"make-rshared", MS_RSHARED, 0},
{"relatime", MS_RELATIME, 0},
{"norelatime", 0, MS_RELATIME},
{"norelatime", 0, MS_NORELATIME},
{"iversion", MS_IVERSION, 0},
{"noiversion", 0, MS_IVERSION},
{"strictatime", MS_STRICTATIME, 0},
@@ -570,8 +568,6 @@ ostream &mnt_rule::dump(ostream &os)
{
prefix_rule_t::dump(os);
std::ios::fmtflags fmt(os.flags());
if (perms & AA_MAY_MOUNT)
os << "mount";
else if (perms & AA_MAY_UMOUNT)
@@ -605,7 +601,6 @@ ostream &mnt_rule::dump(ostream &os)
os << " " << "(0x" << hex << perms << "/0x" << (audit != AUDIT_UNSPECIFIED ? perms : 0) << ")";
os << ",\n";
os.flags(fmt);
return os;
}
@@ -849,12 +844,8 @@ int mnt_rule::gen_policy_bind_mount(Profile &prof, int &count,
if (!convert_entry(mntbuf, mnt_point))
goto fail;
vec[0] = mntbuf.c_str();
if (device && strcmp(device, "detached") == 0) {
/* see note in move_mount. match nothing */
devbuf.clear();
} else if (!clear_and_convert_entry(devbuf, device)) {
if (!clear_and_convert_entry(devbuf, device))
goto fail;
}
vec[1] = devbuf.c_str();
/* skip type */
vec[2] = default_match_pattern;
@@ -955,12 +946,8 @@ int mnt_rule::gen_policy_move_mount(Profile &prof, int &count,
if (!convert_entry(mntbuf, mnt_point))
goto fail;
vec[0] = mntbuf.c_str();
if (device && strcmp(device, "detached") == 0) {
/* see note in move_mount. match nothing */
devbuf.clear();
} else if (!clear_and_convert_entry(devbuf, device)) {
if (!clear_and_convert_entry(devbuf, device))
goto fail;
}
vec[1] = devbuf.c_str();
/* skip type */
vec[2] = default_match_pattern;
@@ -1000,12 +987,8 @@ int mnt_rule::gen_policy_new_mount(Profile &prof, int &count,
if (!convert_entry(mntbuf, mnt_point))
goto fail;
vec[0] = mntbuf.c_str();
if (device && strcmp(device, "detached") == 0) {
/* see note in move mount. match nothing */
devbuf.clear();
} else if (!clear_and_convert_entry(devbuf, device)) {
if (!clear_and_convert_entry(devbuf, device))
goto fail;
}
vec[1] = devbuf.c_str();
typebuf.clear();
if (!build_list_val_expr(typebuf, dev_type))
@@ -1166,7 +1149,21 @@ fail:
void mnt_rule::post_parse_profile(Profile &prof)
{
if (trans) {
/* TODO: pivot_root profile transition */
perm32_t perms = 0;
int n = add_entry_to_x_table(&prof, trans);
if (!n) {
PERROR("Profile %s has too many specified profile transitions.\n", prof.name);
exit(1);
}
if (perms & AA_USER_EXEC)
perms |= SHIFT_PERMS(n << 10, AA_USER_SHIFT);
if (perms & AA_OTHER_EXEC)
perms |= SHIFT_PERMS(n << 10, AA_OTHER_SHIFT);
perms = ((perms & ~AA_ALL_EXEC_MODIFIERS) |
(perms & AA_ALL_EXEC_MODIFIERS));
trans = NULL;
}
}

View File

@@ -159,7 +159,7 @@ public:
mnt_rule(struct cond_entry *src_conds, char *device_p,
struct cond_entry *dst_conds unused, char *mnt_point_p,
perm32_t perms_p);
~mnt_rule() override
virtual ~mnt_rule()
{
free_value_list(opts);
free_value_list(dev_type);
@@ -168,25 +168,25 @@ public:
free(trans);
}
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
if (p.owner != OWNER_UNSPECIFIED) {
error = "owner prefix not allowed on mount rules";
return false;
}
return true;
};
ostream &dump(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override;
void post_parse_profile(Profile &prof unused) override;
virtual ostream &dump(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof);
virtual void post_parse_profile(Profile &prof unused);
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override;
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const;
// for now use default merge/dedup
protected:
void warn_once(const char *name) override;
virtual void warn_once(const char *name) override;
};
int is_valid_mnt_cond(const char *name, int src);

View File

@@ -148,8 +148,6 @@ ostream &mqueue_rule::dump(ostream &os)
os << ")";
}
if (label)
os << " label=" << label;
if (qname)
os << " " << qname;
@@ -240,19 +238,6 @@ int mqueue_rule::gen_policy_re(Profile &prof)
audit == AUDIT_FORCE ? map_mqueue_perms(perms) : 0, 1,
vec, parseopts, false))
goto fail;
/* create should be allowed when label is present since the
* queue needs to be created to have a label associated to it
*/
if (perms & AA_MQUEUE_CREATE &&
!prof.policy.rules->add_rule_vec(
priority,
rule_mode,
map_mqueue_perms(perms & AA_MQUEUE_CREATE_PERMS),
audit == AUDIT_FORCE ? map_mqueue_perms(perms & AA_MQUEUE_CREATE_PERMS) : 0, 1,
vec, parseopts, false))
goto fail;
/* also provide label match with perm */
if (!prof.policy.rules->add_rule_vec(priority,
rule_mode,
@@ -297,19 +282,6 @@ int mqueue_rule::gen_policy_re(Profile &prof)
audit == AUDIT_FORCE ? map_mqueue_perms(perms) : 0, 1,
vec, parseopts, false))
goto fail;
/* create should be allowed when label is present since the
* queue needs to be created to have a label associated to it
*/
if (perms & AA_MQUEUE_CREATE &&
!prof.policy.rules->add_rule_vec(
priority,
rule_mode,
map_mqueue_perms(perms & AA_MQUEUE_CREATE_PERMS),
audit == AUDIT_FORCE ? map_mqueue_perms(perms & AA_MQUEUE_CREATE_PERMS) : 0, 1,
vec, parseopts, false))
goto fail;
/* also provide label match with perm */
if (!prof.policy.rules->add_rule_vec(priority,
rule_mode,

View File

@@ -69,12 +69,6 @@
#define AA_VALID_MQUEUE_PERMS (AA_VALID_POSIX_MQ_PERMS | \
AA_VALID_SYSV_MQ_PERMS)
/* read and write needed with create because mq_open can be called
* with O_CREAT | O_RDWR, which all show up in the requested perms at
* the same time during creation
*/
#define AA_MQUEUE_CREATE_PERMS (AA_MQUEUE_CREATE | AA_MQUEUE_READ | \
AA_MQUEUE_WRITE)
// warning getting into overlap area
/* Type of mqueue - can be explicit or implied by rule id/path */
@@ -100,13 +94,13 @@ public:
char *label;
mqueue_rule(perm32_t perms, struct cond_entry *conds, char *qname = NULL);
~mqueue_rule() override
virtual ~mqueue_rule()
{
free(qname);
free(label);
};
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
// not yet, but soon
if (p.owner) {
error = _("owner prefix not allowed on mqueue rules");
@@ -114,12 +108,12 @@ public:
}
return true;
};
ostream &dump(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override;
virtual ostream &dump(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof);
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const
{
int res = perms_rule_t::cmp(rhs);
if (res)
@@ -135,7 +129,7 @@ public:
};
protected:
void warn_once(const char *name) override;
virtual void warn_once(const char *name) override;
void validate_qname(void);
};

View File

@@ -167,7 +167,7 @@ public:
const char *protocol, struct cond_entry *conds,
struct cond_entry *peer_conds);
network_rule(perm32_t perms_p, unsigned int family, unsigned int type);
~network_rule() override
virtual ~network_rule()
{
peer.free_conds();
local.free_conds();
@@ -197,7 +197,7 @@ public:
bool parse_port(ip_conds &entry);
// update TODO: in equality.sh when priority is a valid prefix
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
if (p.priority != 0) {
error = _("priority prefix not allowed on network rules");
return false;
@@ -208,12 +208,12 @@ public:
}
return true;
};
ostream &dump(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override;
virtual ostream &dump(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof);
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override;
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const;
/* array of type masks indexed by AF_FAMILY */
/* allow, audit, deny and quiet are used for compatibility with AA_CLASS_NET */
@@ -225,7 +225,7 @@ public:
bool alloc_net_table(void);
protected:
void warn_once(const char *name) override;
virtual void warn_once(const char *name) override;
};
#endif /* __AA_NETWORK_H */

View File

@@ -41,6 +41,8 @@
#include <string>
using namespace std;
#include <set>
@@ -187,7 +189,7 @@ extern int preprocess_only;
#define PATH_DELEGATE_DELETED 0x20
#define PATH_ATTACH 0x40
#define PATH_NO_ATTACH 0x80
#define PATH_IPC_ATTACH 0x100
#ifdef DEBUG
@@ -294,10 +296,9 @@ do { \
version; \
})
/* The parser fills these variable in automatically */
/* The parser fills this variable in automatically */
#define PROFILE_NAME_VARIABLE "profile_name"
#define PROFILE_ATTACH_VAR "attach_path"
#define PROFILE_EXEC_VAR "exec_path"
/* from parser_common.c */
extern uint32_t policy_version;
@@ -320,7 +321,6 @@ extern int features_supports_inet;
extern int kernel_supports_policydb;
extern int kernel_supports_diff_encode;
extern int features_supports_mount;
extern bool features_supports_detached_mount;
extern int features_supports_dbus;
extern int features_supports_signal;
extern int features_supports_ptrace;
@@ -334,7 +334,6 @@ extern int features_supports_io_uring;
extern int features_supports_flag_interruptible;
extern int features_supports_flag_signal;
extern int features_supports_flag_error;
extern int features_supports_flag_disconnected_ipc;
extern int kernel_supports_oob;
extern int kernel_supports_promptdev;
extern int kernel_supports_permstable32;
@@ -396,7 +395,6 @@ extern const char *basedir;
#define glob_default 0
#define glob_null 1
const char *local_name(const char *name);
extern pattern_t convert_aaregex_to_pcre(const char *aare, int anchor, int glob,
std::string& pcre, int *first_re_pos);
extern bool build_list_val_expr(std::string& buffer, struct value_list *list);
@@ -410,11 +408,12 @@ extern int process_policydb(Profile *prof);
extern int process_policy_ents(Profile *prof);
extern void filter_slashes(char *path);
extern const char *local_name(const char *name);
/* parser_variable.c */
int expand_entry_variables(char **name);
extern int process_variables(Profile *prof);
extern struct var_string *split_out_var(const char *string);
extern void free_var_string(struct var_string *var);
/* parser_misc.c */
extern void warn_uppercase(void);
@@ -456,6 +455,23 @@ bool entry_add_prefix(struct cod_entry *entry, const prefixes &p, const char *&e
#define SECONDS_P_MS (1000LL * 1000LL)
long long convert_time_units(long long value, long long base, const char *units);
/* parser_symtab.c */
struct set_value {
char *val;
struct set_value *next;
};
extern int add_boolean_var(const char *var, int boolean);
extern int get_boolean_var(const char *var);
extern int new_set_var(const char *var, const char *value);
extern int add_set_value(const char *var, const char *value);
extern struct set_value *get_set_var(const char *var);
extern char *get_next_set_value(struct set_value **context);
extern int delete_set_var(const char *var_name);
extern void dump_symtab(void);
extern void dump_expanded_symtab(void);
void free_symtabs(void);
/* parser_alias.c */
extern int new_alias(const char *from, const char *to);
extern int replace_profile_aliases(Profile *prof);

View File

@@ -133,10 +133,8 @@ static void process_entries(const void *nodep, VISIT value, int level unused)
if (entry->link_name &&
strncmp((*t)->from, entry->link_name, len) == 0) {
char *n = do_alias(*t, entry->link_name);
if (!n) {
free_cod_entries(dup);
if (!n)
return;
}
if (!dup)
dup = copy_cod_entry(entry);
free(dup->link_name);

View File

@@ -73,7 +73,6 @@ int features_supports_inet = 0; /* kernel supports inet network rules */
int features_supports_unix = 0; /* kernel supports unix socket rules */
int kernel_supports_policydb = 0; /* kernel supports new policydb */
int features_supports_mount = 0; /* kernel supports mount rules */
bool features_supports_detached_mount = false;
int features_supports_dbus = 0; /* kernel supports dbus rules */
int kernel_supports_diff_encode = 0; /* kernel supports diff_encode */
int features_supports_signal = 0; /* kernel supports signal rules */
@@ -87,7 +86,6 @@ int features_supports_io_uring = 0; /* kernel supports io_uring rules */
int features_supports_flag_interruptible = 0;
int features_supports_flag_signal = 0;
int features_supports_flag_error = 0;
int features_supports_flag_disconnected_ipc = 0; /* kernel supports disconnected paths for ipc ns */
int kernel_supports_oob = 0; /* out of band transitions */
int kernel_supports_promptdev = 0; /* prompt via audit perms */
int kernel_supports_permstable32 = 0; /* extended permissions */
@@ -185,9 +183,19 @@ bool prompt_compat_mode_supported(int mode)
if (mode == PROMPT_COMPAT_PERMSV2 &&
(kernel_supports_permstable32 && !kernel_supports_permstable32_v1))
return true;
/*
else if (mode == PROMPT_COMPAT_DEV &&
kernel_supports_promptdev)
return true;
*/
else if (mode == PROMPT_COMPAT_FLAG &&
kernel_supports_permstable32)
return true;
/*
else if (mode == PROMPT_COMPAT_PERMSV1 &&
(kernel_supports_permstable32_v1))
return true;
*/
else if (mode == PROMPT_COMPAT_IGNORE)
return true;
@@ -198,8 +206,12 @@ int default_prompt_compat_mode()
{
if (prompt_compat_mode_supported(PROMPT_COMPAT_PERMSV2))
return PROMPT_COMPAT_PERMSV2;
if (prompt_compat_mode_supported(PROMPT_COMPAT_DEV))
return PROMPT_COMPAT_DEV;
if (prompt_compat_mode_supported(PROMPT_COMPAT_FLAG))
return PROMPT_COMPAT_FLAG;
if (prompt_compat_mode_supported(PROMPT_COMPAT_PERMSV1))
return PROMPT_COMPAT_PERMSV1;
if (prompt_compat_mode_supported(PROMPT_COMPAT_IGNORE))
return PROMPT_COMPAT_IGNORE;
return PROMPT_COMPAT_IGNORE;
@@ -217,6 +229,12 @@ void print_prompt_compat_mode(FILE *f)
case PROMPT_COMPAT_PERMSV2:
fprintf(f, "permsv2");
break;
case PROMPT_COMPAT_PERMSV1:
fprintf(f, "permsv1");
break;
case PROMPT_COMPAT_DEV:
fprintf(stderr, "dev");
break;
default:
fprintf(f, "Unknown prompt compat mode '%d'", prompt_compat_mode);
}

View File

@@ -41,7 +41,6 @@
#define SD_CODE_SIZE (sizeof(u8))
#define SD_STR_LEN (sizeof(u16))
using namespace std;
int __sd_serialize_profile(int option, aa_kernel_interface *kernel_interface,
Profile *prof, int cache_fd);
@@ -384,11 +383,13 @@ void sd_serialize_rlimits(std::ostringstream &buf, struct aa_rlimits *limits)
sd_write_structend(buf);
}
void sd_serialize_xtable(std::ostringstream &buf, char **table)
void sd_serialize_xtable(std::ostringstream &buf, char **table,
size_t min_size)
{
size_t count;
size_t size;
if (!table[4])
if (!table[4] && min_size == 0)
return;
sd_write_struct(buf, "xtable");
count = 0;
@@ -397,7 +398,9 @@ void sd_serialize_xtable(std::ostringstream &buf, char **table)
count++;
}
sd_write_array(buf, NULL, count);
size = max(min_size, count);
sd_write_array(buf, NULL, size);
for (size_t i = 4; i < count + 4; i++) {
size_t len = strlen(table[i]) + 1;
@@ -410,6 +413,13 @@ void sd_serialize_xtable(std::ostringstream &buf, char **table)
}
sd_write_strn(buf, table[i], len, NULL);
}
if (min_size > count) {
//fprintf(stderr, "Adding padding to xtable count %lu, min %lu\n", count, min_size);
for (; count < min_size; count++) {
/* fill with null strings */
sd_write_strn(buf, "\000", 1, NULL);
}
}
sd_write_arrayend(buf);
sd_write_structend(buf);
@@ -464,11 +474,6 @@ void sd_serialize_profile(std::ostringstream &buf, Profile *profile,
"disconnected");
}
if (profile->flags.disconnected_ipc && features_supports_flag_disconnected_ipc) {
sd_write_string(buf, profile->flags.disconnected_ipc,
"disconnected_ipc");
}
if (profile->flags.signal && features_supports_flag_signal) {
sd_write_name(buf, "kill");
sd_write_uint32(buf, profile->flags.signal);
@@ -495,8 +500,6 @@ void sd_serialize_profile(std::ostringstream &buf, Profile *profile,
flags |= 0x4;
if (profile->flags.path & PATH_CHROOT_NSATTACH)
flags |= 0x10;
if (profile->flags.path & PATH_IPC_ATTACH)
flags |= 0x20;
sd_write_name(buf, "path_flags");
sd_write_uint32(buf, flags);
@@ -543,17 +546,38 @@ void sd_serialize_profile(std::ostringstream &buf, Profile *profile,
sd_serialize_dfa(buf, profile->policy.dfa, profile->policy.size,
profile->policy.perms_table);
if (kernel_supports_permstable32) {
sd_serialize_xtable(buf, profile->exec_table);
sd_serialize_xtable(buf, profile->exec_table,
profile->uses_prompt_rules &&
prompt_compat_mode == PROMPT_COMPAT_PERMSV1 ?
profile->policy.perms_table.size() : 0);
}
sd_write_structend(buf);
}
sd_serialize_dfa(buf, profile->dfa.dfa, profile->dfa.size,
profile->dfa.perms_table);
if (profile->dfa.dfa) {
// fprintf(stderr, "profile %s: dfa xtable\n", profile->name);
sd_serialize_xtable(buf, profile->exec_table);
/* either have a single dfa or lists of different entry types */
if (profile->uses_prompt_rules && prompt_compat_mode == PROMPT_COMPAT_PERMSV1) {
/* special compat mode to work around verification problem */
sd_serialize_dfa(buf, profile->policy.dfa, profile->policy.size,
profile->policy.perms_table);
sd_write_name(buf, "dfa_start");
sd_write_uint32(buf, profile->policy.file_start);
if (profile->policy.dfa) {
// fprintf(stderr, "profile %s: policy xtable\n", profile->name);
// TODO: this is dummy exec make dependent on V1
sd_serialize_xtable(buf, profile->exec_table,
//permstable32_v1 workaround
profile->policy.perms_table.size());
}
} else {
sd_serialize_dfa(buf, profile->dfa.dfa, profile->dfa.size,
profile->dfa.perms_table);
if (profile->dfa.dfa) {
// fprintf(stderr, "profile %s: dfa xtable\n", profile->name);
sd_serialize_xtable(buf, profile->exec_table,
//??? work around
profile->dfa.perms_table.size());
}
}
sd_write_structend(buf);
}

View File

@@ -46,8 +46,6 @@
#include "policy_cache.h"
#include "file_cache.h"
using namespace std;
#ifdef PDEBUG
#undef PDEBUG
#endif

View File

@@ -51,7 +51,6 @@
#include "policy_cache.h"
#include "libapparmor_re/apparmor_re.h"
#include "file_cache.h"
#include "symtab.h"
#define OLD_MODULE_NAME "subdomain"
#define PROC_MODULES "/proc/modules"
@@ -797,8 +796,12 @@ static int process_arg(int c, char *optarg)
case ARG_PROMPT_COMPAT:
if (strcmp(optarg, "permsv2") == 0) {
prompt_compat_mode = PROMPT_COMPAT_PERMSV2;
} else if (strcmp(optarg, "permsv1") == 0) {
prompt_compat_mode = PROMPT_COMPAT_PERMSV1;
} else if (strcmp(optarg, "default") == 0) {
prompt_compat_mode = default_prompt_compat_mode();
} else if (strcmp(optarg, "dev") == 0) {
prompt_compat_mode = PROMPT_COMPAT_DEV;
} else if (strcmp(optarg, "ignore") == 0) {
prompt_compat_mode = PROMPT_COMPAT_IGNORE;
} else if (strcmp(optarg, "flag") == 0) {
@@ -953,14 +956,6 @@ void set_supported_features()
features_supports_mount = features_intersect(kernel_features,
policy_features,
"mount");
/*
* note: detached mounts are just a null condition, so previous
* mount rule encoding supports it, if the kernel supports
* it. So support for detached depends on mount intersect and
* kernel detached.
*/
features_supports_detached_mount = aa_features_supports(kernel_features,
"mount/move_mount/detached");
features_supports_dbus = features_intersect(kernel_features,
policy_features, "dbus");
features_supports_signal = features_intersect(kernel_features,
@@ -996,9 +991,6 @@ void set_supported_features()
features_supports_flag_error = features_intersect(kernel_features,
policy_features,
"policy/profile/error");
features_supports_flag_disconnected_ipc = features_intersect(kernel_features,
policy_features,
"domain/disconnected.ipc");
}
static bool do_print_cache_dir(aa_features *features, int dirfd, const char *path)
@@ -1089,7 +1081,7 @@ void reset_parser(const char *filename)
memset(&cache_tstamp, 0, sizeof(cache_tstamp));
mru_skip_cache = 1;
free_aliases();
symtab::free_symtab();
free_symtabs();
free_policies();
reset_include_stack(filename);
aa_features_unref(policy_features);
@@ -1220,7 +1212,7 @@ int process_profile(int option, aa_kernel_interface *kernel_interface,
}
if (dump_vars) {
symtab::dump(false);
dump_symtab();
goto out;
}
@@ -1231,7 +1223,7 @@ int process_profile(int option, aa_kernel_interface *kernel_interface,
}
if (dump_expanded_vars) {
symtab::dump(true);
dump_expanded_symtab();
goto out;
}

View File

@@ -66,8 +66,6 @@ void *reallocarray(void *ptr, size_t nmemb, size_t size)
#define NULL nullptr
#endif
using namespace std;
int is_blacklisted(const char *name, const char *path)
{
int retval = _aa_is_blacklisted(name);
@@ -136,11 +134,6 @@ static const unordered_map<string, int> keyword_table = {
{"priority", TOK_PRIORITY},
};
/* glibc maps bsd ofile to nofile but musl does not. */
#ifndef RLIMIT_OFILE
#define RLIMIT_OFILE RLIMIT_NOFILE
#endif
static const unordered_map<string, int> rlimit_table = {
{"cpu", RLIMIT_CPU},
{"fsize", RLIMIT_FSIZE},
@@ -149,7 +142,9 @@ static const unordered_map<string, int> rlimit_table = {
{"core", RLIMIT_CORE},
{"rss", RLIMIT_RSS},
{"nofile", RLIMIT_NOFILE},
#ifdef RLIMIT_OFILE
{"ofile", RLIMIT_OFILE},
#endif
{"as", RLIMIT_AS},
{"nproc", RLIMIT_NPROC},
{"memlock", RLIMIT_MEMLOCK},
@@ -532,6 +527,35 @@ char *processid(const char *string, int len)
return processunquoted(string, len);
}
/* strip off surrounding delimiters around variables */
char *process_var(const char *var)
{
const char *orig = var;
int len = strlen(var);
if (*orig == '@' || *orig == '$') {
orig++;
len--;
} else {
PERROR("ASSERT: Found var '%s' without variable prefix\n",
var);
return NULL;
}
if (*orig == '{') {
orig++;
len--;
if (orig[len - 1] != '}') {
PERROR("ASSERT: No matching '}' in variable '%s'\n",
var);
return NULL;
} else
len--;
}
return strndup(orig, len);
}
/* returns -1 if value != true or false, otherwise 0 == false, 1 == true */
int str_to_boolean(const char *value)
{

View File

@@ -45,7 +45,6 @@
#endif
#define NPDEBUG(fmt, args...) /* Do nothing */
using namespace std;
ProfileList policy_list;
@@ -179,8 +178,6 @@ Profile *merge_policy(Profile *a, Profile *b)
}
}
a->rule_ents.splice(a->rule_ents.end(), b->rule_ents);
merge_hats(a, b->hat_table);
delete b;
out:
@@ -244,7 +241,10 @@ int post_process_profile(Profile *profile, int debug_only)
error = post_process_policy_list(profile->hat_table, debug_only);
if (prompt_compat_mode == PROMPT_COMPAT_FLAG && profile->uses_prompt_rules)
if (prompt_compat_mode == PROMPT_COMPAT_DEV && profile->uses_prompt_rules)
profile->flags.flags |= FLAG_PROMPT_COMPAT;
else if (prompt_compat_mode == PROMPT_COMPAT_FLAG && profile->uses_prompt_rules)
profile->flags.mode = MODE_PROMPT;
return error;

View File

@@ -433,7 +433,7 @@ out:
return ptype;
}
const char *local_name(const char *name)
static const char *local_name(const char *name)
{
const char *t;
@@ -578,7 +578,7 @@ build:
*
* we don't need to build xmatch for permstable32, so don't
*/
prof->xmatch = rules->create_dfablob(&prof->xmatch_size, &prof->xmatch_len, prof->xmatch_perms_table, parseopts, false, false);
prof->xmatch = rules->create_dfablob(&prof->xmatch_size, &prof->xmatch_len, prof->xmatch_perms_table, parseopts, false, false, false);
delete rules;
if (!prof->xmatch)
return false;
@@ -785,17 +785,28 @@ int process_profile_regex(Profile *prof)
/* under permstable32_v1 we weld file and policydb together, so
* don't create the file blob here
*/
if (prof->dfa.rules->rule_count > 0) {
if (prof->dfa.rules->rule_count > 0 && prompt_compat_mode != PROMPT_COMPAT_PERMSV1) {
int xmatch_len = 0;
//fprintf(stderr, "Creating file DFA %d\n", kernel_supports_permstable32);
prof->dfa.dfa = prof->dfa.rules->create_dfablob(&prof->dfa.size,
&xmatch_len, prof->dfa.perms_table,
parseopts, true,
kernel_supports_permstable32);
kernel_supports_permstable32,
prof->uses_prompt_rules);
delete prof->dfa.rules;
prof->dfa.rules = NULL;
if (!prof->dfa.dfa)
goto out;
/*
if (prof->dfa_size == 0) {
PERROR(_("profile %s: has merged rules (%s) with "
"multiple x modifiers\n"),
prof->name, (char *) prof->dfa);
free(prof->dfa);
prof->dfa = NULL;
goto out;
}
*/
}
error = 0;
@@ -1070,6 +1081,7 @@ static const char *mediates_ns = CLASS_STR(AA_CLASS_NS);
static const char *mediates_posix_mqueue = CLASS_STR(AA_CLASS_POSIX_MQUEUE);
static const char *mediates_sysv_mqueue = CLASS_STR(AA_CLASS_SYSV_MQUEUE);
static const char *mediates_io_uring = CLASS_STR(AA_CLASS_IO_URING);
static const char *deny_file = ".*";
/* Set the mediates priority to the maximum possible. This is to help
* ensure that the mediates information is not wiped out by a rule
@@ -1152,13 +1164,44 @@ int process_profile_policydb(Profile *prof)
goto out;
}
if (prof->policy.rules->rule_count > 0) {
if (prompt_compat_mode == PROMPT_COMPAT_PERMSV1) {
// MUST have file and policy
// This requires file rule processing happen first
if (!prof->dfa.rules->rule_count) {
// add null dfa
if (!prof->dfa.rules->add_rule(deny_file, 0, RULE_DENY, AA_MAY_READ, 0, parseopts))
goto out;
}
if (!prof->policy.rules->rule_count) {
if (!prof->policy.rules->add_rule(mediates_file, 0, RULE_DENY, AA_MAY_READ, 0, parseopts))
goto out;
}
int xmatch_len = 0;
prof->policy.dfa = prof->policy.rules->create_welded_dfablob(
prof->dfa.rules,
&prof->policy.size,
&xmatch_len,
&prof->policy.file_start,
prof->policy.perms_table, parseopts,
kernel_supports_permstable32_v1,
prof->uses_prompt_rules);
delete prof->policy.rules;
delete prof->dfa.rules;
prof->policy.rules = NULL;
prof->dfa.rules = NULL;
if (!prof->policy.dfa)
goto out;
} else if (prof->policy.rules->rule_count > 0 &&
// yes not needed as covered above, just making sure
// this doesn't get messed up in the future
prompt_compat_mode != PROMPT_COMPAT_PERMSV1) {
int xmatch_len = 0;
prof->policy.dfa = prof->policy.rules->create_dfablob(&prof->policy.size,
&xmatch_len,
prof->policy.perms_table,
parseopts, false,
kernel_supports_permstable32);
kernel_supports_permstable32,
prof->uses_prompt_rules);
delete prof->policy.rules;
prof->policy.rules = NULL;
@@ -1406,9 +1449,6 @@ int main(void)
int rc = 0;
int retval;
// Default is parser_common.c, but it should be this source file instead
progname = __FILE__;
retval = test_filter_slashes();
if (retval != 0)
rc = retval;

View File

@@ -24,27 +24,646 @@
#include "immunix.h"
#include "parser.h"
#include "symtab.h"
typedef int (*comparison_fn_t)(const void *, const void *);
typedef void (*__free_fn_t)(void *);
enum var_type {
sd_boolean,
sd_set,
};
struct symtab {
char *var_name;
enum var_type type;
int boolean;
struct set_value *values;
struct set_value *expanded;
};
static void *my_symtab = NULL;
static int __expand_variable(struct symtab *symbol);
static struct symtab *new_symtab_entry(const char *name)
{
struct symtab *n = (struct symtab *) calloc(1, sizeof(*n));
if (!n) {
PERROR("Failed to allocate memory: %s\n", strerror(errno));
return NULL;
}
n->var_name = strndup(name, PATH_MAX);
if (!n->var_name) {
PERROR("Failed to allocate memory: %s\n", strerror(errno));
free(n);
return NULL;
}
return n;
}
static struct set_value *new_set_value(const char *val)
{
struct set_value *n = (struct set_value *) calloc(1, sizeof(*n));
if (!n) {
PERROR("Failed to allocate memory: %s\n", strerror(errno));
return NULL;
}
n->val = strndup(val, PATH_MAX);
if (!n->val) {
PERROR("Failed to allocate memory: %s\n", strerror(errno));
free(n);
return NULL;
}
return n;
}
static void free_values(struct set_value *val)
{
struct set_value *i = val, *tmp;
while (i) {
if (i->val)
free(i->val);
tmp = i;
i = i->next;
free(tmp);
}
}
static void free_symtab(struct symtab *symtab)
{
if (!symtab)
return;
if (symtab->var_name)
free(symtab->var_name);
free_values(symtab->values);
free_values(symtab->expanded);
free(symtab);
}
/* abstract this out in case we switch data structures */
static void add_to_set(struct set_value **list, const char *val)
{
struct set_value *new_item = new_set_value(val);
new_item->next = *list;
*list = new_item;
}
static int compare_symtabs(const void *a, const void *b)
{
char *a_name = ((struct symtab *) a)->var_name;
char *b_name = ((struct symtab *) b)->var_name;
return strcmp(a_name, b_name);
}
static struct symtab *lookup_existing_symbol(const char *var)
{
struct symtab *tmp, **lookup;
struct symtab *result = NULL;
tmp = new_symtab_entry(var);
if (!tmp) {
goto out;
}
lookup = (struct symtab **) tfind(tmp, &my_symtab, (comparison_fn_t) &compare_symtabs);
if (!lookup) {
goto out;
}
result = (*lookup);
out:
free_symtab(tmp);
return result;
}
/* add_boolean_var
* creates copies of arguments, so caller can free them after use
*/
int add_boolean_var(const char *var, int value)
{
struct symtab *n, **result;
int rc = 0;
n = new_symtab_entry(var);
if (!n) {
rc = ENOMEM;
goto err;
}
n->type = sd_boolean;
n->boolean = value;
result = (struct symtab **) tsearch(n, &my_symtab, (comparison_fn_t) &compare_symtabs);
if (!result) {
PERROR("Failed to allocate memory: %s\n", strerror(errno));
rc = errno;
goto err;
}
if (*result != n) {
/* already existing variable */
PERROR("'%s' is already defined\n", var);
rc = 1;
goto err;
}
return 0;
err:
free_symtab(n);
return rc;
};
int get_boolean_var(const char *var)
{
struct symtab *result;
int rc = 0;
result = lookup_existing_symbol(var);
if (!result) {
rc = -1;
goto out;
}
if (result->type != sd_boolean) {
PERROR("Variable %s is not a boolean variable\n", var);
rc = -2; /* XXX - might change this to specific values */
goto out;
}
rc = result->boolean;
out:
return rc;
}
/* new_set_var
* creates copies of arguments, so caller can free them after use
*/
int new_set_var(const char *var, const char *value)
{
struct symtab *n, **result;
int rc = 0;
n = new_symtab_entry(var);
if (!n) {
rc = ENOMEM;
goto err;
}
n->type = sd_set;
add_to_set(&(n->values), value);
result = (struct symtab **) tsearch(n, &my_symtab, (comparison_fn_t) &compare_symtabs);
if (!result) {
PERROR("Failed to allocate memory: %s\n", strerror(errno));
rc = errno;
goto err;
}
if (*result != n) {
/* already existing variable */
PERROR("'%s' is already defined\n", var);
rc = 1;
goto err;
}
return 0;
err:
free_symtab(n);
return rc;
}
/* add_set_value
* creates copies of arguments, so caller can free them after use
*/
int add_set_value(const char *var, const char *value)
{
struct symtab *result;
int rc = 0;
result = lookup_existing_symbol(var);
if (!result) {
PERROR("Failed to find declaration for: %s\n", var);
rc = 1;
goto out;
}
if (result->type != sd_set) {
PERROR("Variable %s is not a set variable\n", var);
rc = 2; /* XXX - might change this to specific values */
goto out;
}
if (strcmp(result->var_name, var) != 0) {
PERROR("ASSERT: tfind found %s when looking up variable %s\n",
result->var_name, var);
exit(1);
}
add_to_set(&(result->values), value);
out:
return rc;
}
/* returns a pointer to the value list, which should be used as the
* argument to the get_next_set_value() function. */
struct set_value *get_set_var(const char *var)
{
struct symtab *result;
struct set_value *valuelist = NULL;
result = lookup_existing_symbol(var);
if (!result) {
goto out;
}
if (result->type != sd_set) {
goto out;
}
if (strcmp(result->var_name, var) != 0) {
PERROR("ASSERT: tfind found %s when looking up variable %s\n",
result->var_name, var);
exit(1);
}
if (!result->expanded) {
int err = __expand_variable(result);
if (err) {
PERROR("failure expanding variable %s\n", var);
exit(1);
}
}
valuelist = result->expanded;
out:
return valuelist;
}
/* iterator to walk the list of set values */
char *get_next_set_value(struct set_value **list)
{
struct set_value *next;
char *ret;
if (!list || !(*list))
return NULL;
ret = (*list)->val;
next = (*list)->next;
(*list) = next;
return ret;
}
/* delete_symbol
* removes an individual variable from the symbol table. We don't
* support this in the language, but for special variables that change
* between profiles, we need this.
*/
int delete_set_var(const char *var_name)
{
int rc = 0;
struct symtab **result, *n, *var;
n = new_symtab_entry(var_name);
if (!n) {
rc = ENOMEM;
goto out;
}
result = (struct symtab **) tfind(n, &my_symtab, (comparison_fn_t) &compare_symtabs);
if (!result) {
/* XXX Warning? */
goto out;
}
var = (*result);
result = (struct symtab **) tdelete(n, &my_symtab, (comparison_fn_t) &compare_symtabs);
if (!result) {
PERROR("ASSERT: delete_set_var: tfind found var %s but tdelete failed to delete it\n",
var_name);
exit(1);
}
if (var->type != sd_set) {
PERROR("ASSERT: delete_set_var: deleting %s but is a boolean variable\n",
var_name);
exit(1);
}
free_symtab(var);
out:
free_symtab(n);
return rc;
}
static void *seenlist = NULL;
static int is_seen(const char *var)
{
char **lookup;
lookup = (char **) tfind(var, &seenlist, (comparison_fn_t) &strcmp);
return (lookup != NULL);
}
static void push_seen_var(const char *var)
{
char **lookup;
lookup = (char **) tsearch(var, &seenlist, (comparison_fn_t) &strcmp);
if (*lookup != var) {
PERROR("ASSERT: '%s' is already in the seenlist\n", var);
exit(1);
}
}
static void pop_seen_var(const char *var)
{
char **lookup;
lookup = (char **) tdelete(var, &seenlist, (comparison_fn_t) &strcmp);
if (lookup == NULL) {
PERROR("ASSERT: popped var '%s' not found on the seenlist\n", var);
exit(1);
}
}
static int __expand_variable(struct symtab *symbol)
{
struct set_value *list, *expanded = NULL;
int retval = 0;
struct var_string *split = NULL;
if (symbol->type == sd_boolean) {
PERROR("Referenced variable %s is a boolean used in set context\n",
symbol->var_name);
return 2;
}
/* already done */
if (symbol->expanded)
return 0;
push_seen_var(symbol->var_name);
for (list = symbol->values; list; list = list->next) {
struct set_value *work_list = new_set_value(list->val);
while (work_list) {
struct symtab *ref;
struct set_value *ref_item;
struct set_value *t_value = work_list;
int rc;
work_list = work_list->next;
split = split_out_var(t_value->val);
if (!split) {
/* fully expanded */
add_to_set(&expanded, t_value->val);
goto next;
}
if (is_seen(split->var)) {
PERROR("Variable @{%s} is referenced recursively (by @{%s})\n",
split->var, symbol->var_name);
retval = 1;
free_values(t_value);
goto out;
}
ref = lookup_existing_symbol(split->var);
if (!ref) {
PERROR("Variable @{%s} references undefined variable @{%s}\n",
symbol->var_name, split->var);
retval = 3;
free_values(t_value);
goto out;
}
rc = __expand_variable(ref);
if (rc != 0) {
retval = rc;
free_values(t_value);
goto out;
}
if (!ref->expanded) {
PERROR("ASSERT: Variable @{%s} should have been expanded but isn't\n",
split->var);
exit(1);
}
for (ref_item = ref->expanded; ref_item; ref_item = ref_item->next) {
char *expanded_string;
if (!asprintf(&expanded_string, "%s%s%s",
split->prefix ? split->prefix : "",
ref_item->val,
split->suffix ? split->suffix : "")) {
PERROR("Out of memory\n");
exit(1);
}
add_to_set(&work_list, expanded_string);
free(expanded_string);
}
next:
t_value->next = NULL;
free_values(t_value);
free_var_string(split);
}
}
symbol->expanded = expanded;
out:
pop_seen_var(symbol->var_name);
free_var_string(split);
return retval;
}
static void expand_variable(const void *nodep, VISIT value, int level unused)
{
struct symtab **t = (struct symtab **) nodep;
if (value == preorder || value == endorder)
return;
if ((*t)->type == sd_boolean)
return;
__expand_variable(*t);
}
void expand_variables(void)
{
twalk(my_symtab, &expand_variable);
}
static inline void dump_set_values(struct set_value *value)
{
struct set_value *t = value;
while (t) {
printf(" \"%s\"", t->val);
t = t->next;
}
}
static void __dump_symtab_entry(struct symtab *entry, int do_expanded)
{
switch (entry->type) {
case sd_boolean:
printf("$%s = %s\n", entry->var_name,
entry->boolean ? "true" : "false");
break;
case sd_set:
printf("@%s =", entry->var_name);
if (do_expanded) {
if (!entry->expanded) {
__expand_variable(entry);
}
dump_set_values(entry->expanded);
} else {
dump_set_values(entry->values);
}
printf("\n");
break;
default:
PERROR("ASSERT: unknown symbol table type for %s\n", entry->var_name);
exit(1);
}
}
static void dump_symtab_entry(const void *nodep, VISIT value, int level unused)
{
struct symtab **t = (struct symtab **) nodep;
if (value == preorder || value == endorder)
return;
__dump_symtab_entry(*t, 0);
}
static void dump_expanded_symtab_entry(const void *nodep, VISIT value, int level unused)
{
struct symtab **t = (struct symtab **) nodep;
if (value == preorder || value == endorder)
return;
__dump_symtab_entry(*t, 1);
}
void dump_symtab(void)
{
twalk(my_symtab, &dump_symtab_entry);
}
void dump_expanded_symtab(void)
{
twalk(my_symtab, &dump_expanded_symtab_entry);
}
void free_symtabs(void)
{
if (my_symtab)
tdestroy(my_symtab, (__free_fn_t)&free_symtab);
my_symtab = NULL;
}
#ifdef UNIT_TEST
#include "unit_test.h"
int test_compare_symtab(void)
{
int rc = 0;
int retval;
struct symtab *a, *b, *c;
a = new_symtab_entry("blah");
b = new_symtab_entry("suck");
MY_TEST(a && b, "allocation test");
retval = compare_symtabs(a, b);
MY_TEST(retval < 0, "comparison 1");
retval = compare_symtabs(b, a);
MY_TEST(retval > 0, "comparison 2");
retval = compare_symtabs(b, a);
MY_TEST(retval != 0, "comparison 3");
retval = compare_symtabs(b, b);
MY_TEST(retval == 0, "comparison 4");
c = new_symtab_entry("blah");
retval = compare_symtabs(a, c);
MY_TEST(retval == 0, "comparison 5");
free_symtab(a);
free_symtab(b);
free_symtab(c);
return rc;
}
int test_seenlist(void)
{
int rc = 0;
MY_TEST(!is_seen("oogabooga"), "lookup unseen variable");
push_seen_var("oogabooga");
MY_TEST(is_seen("oogabooga"), "lookup seen variable 1");
MY_TEST(!is_seen("not_seen"), "lookup unseen variable 2");
push_seen_var("heebiejeebie");
MY_TEST(is_seen("oogabooga"), "lookup seen variable 2");
MY_TEST(is_seen("heebiejeebie"), "lookup seen variable 3");
MY_TEST(!is_seen("not_seen"), "lookup unseen variable 3");
pop_seen_var("oogabooga");
MY_TEST(!is_seen("oogabooga"), "lookup unseen variable 4");
MY_TEST(is_seen("heebiejeebie"), "lookup seen variable 4");
MY_TEST(!is_seen("not_seen"), "lookup unseen variable 5");
pop_seen_var("heebiejeebie");
MY_TEST(!is_seen("heebiejeebie"), "lookup unseen variable 6");
//pop_seen_var("not_seen"); /* triggers assert */
return rc;
}
int test_add_set_to_boolean(void)
{
int rc = 0;
int retval;
struct value_list *val;
/* test adding a set value to a boolean variable */
retval = symtab::add_var("@not_a_set_variable", 1);
MY_TEST(retval == 0, "new boolean variable 3");
val = new_value_list(strdup("a set value"));
retval = symtab::add_set_value("@not_a_set_variable", val);
/* test adding a set value to a boolean variable */
retval = add_boolean_var("not_a_set_variable", 1);
MY_TEST(retval == 0, "new boolean variable 3");
retval = add_set_value("not_a_set_variable", "a set value");
MY_TEST(retval != 0, "add set value to boolean");
symtab::free_symtab();
free_value_list(val);
free_symtabs();
return rc;
}
@@ -53,19 +672,19 @@ int test_expand_bool_within_set(void)
{
int rc = 0;
int retval;
variable *retsym;
struct symtab *retsym;
/* test expanding a boolean var within a set variable */
retval = symtab::add_var("@not_a_set_variable", 1);
retval = add_boolean_var("not_a_set_variable", 1);
MY_TEST(retval == 0, "new boolean variable 4");
retval = symtab::add_var("set_variable", "set_value@{not_a_set_variable}");
retval = new_set_var("set_variable", "set_value@{not_a_set_variable}");
MY_TEST(retval == 0, "add set value with embedded boolean");
retsym = symtab::lookup_existing_symbol("set_variable");
retsym = lookup_existing_symbol("set_variable");
MY_TEST(retsym != NULL, "get set variable w/boolean");
retval = retsym->expand_variable();
retval = __expand_variable(retsym);
MY_TEST(retval != 0, "expand set variable with embedded boolean");
symtab::free_symtab();
free_symtabs();
return rc;
}
@@ -74,21 +693,21 @@ int test_expand_recursive_set_vars(void)
{
int rc = 0;
int retval;
variable *retsym;
struct symtab *retsym;
/* test expanding a recursive var within a set variable */
retval = symtab::add_var("recursive_1", "set_value@{recursive_2}");
retval = new_set_var("recursive_1", "set_value@{recursive_2}");
MY_TEST(retval == 0, "new recursive set variable 1");
retval = symtab::add_var("recursive_2", "set_value@{recursive_3}");
retval = new_set_var("recursive_2", "set_value@{recursive_3}");
MY_TEST(retval == 0, "new recursive set variable 2");
retval = symtab::add_var("recursive_3", "set_value@{recursive_1}");
retval = new_set_var("recursive_3", "set_value@{recursive_1}");
MY_TEST(retval == 0, "new recursive set variable 3");
retsym = symtab::lookup_existing_symbol("recursive_1");
retsym = lookup_existing_symbol("recursive_1");
MY_TEST(retsym != NULL, "get recursive set variable");
retval = retsym->expand_variable();
retval = __expand_variable(retsym);
MY_TEST(retval != 0, "expand recursive set variable");
symtab::free_symtab();
free_symtabs();
return rc;
}
@@ -97,17 +716,17 @@ int test_expand_undefined_set_var(void)
{
int rc = 0;
int retval;
variable *retsym;
struct symtab *retsym;
/* test expanding an undefined var within a set variable */
retval = symtab::add_var("defined_var", "set_value@{undefined_var}");
retval = new_set_var("defined_var", "set_value@{undefined_var}");
MY_TEST(retval == 0, "new undefined test set variable");
retsym = symtab::lookup_existing_symbol("defined_var");
retsym = lookup_existing_symbol("defined_var");
MY_TEST(retsym != NULL, "get undefined test set variable");
retval = retsym->expand_variable();
retval = __expand_variable(retsym);
MY_TEST(retval != 0, "expand undefined set variable");
symtab::free_symtab();
free_symtabs();
return rc;
}
@@ -116,20 +735,20 @@ int test_expand_set_var_during_dump(void)
{
int rc = 0;
int retval;
variable *retsym;
struct symtab *retsym;
/* test expanding an defined var within a set variable during var dump*/
retval = symtab::add_var("set_var_1", "set_value@{set_var_2}");
retval = new_set_var("set_var_1", "set_value@{set_var_2}");
MY_TEST(retval == 0, "new dump expansion set variable 1");
retval = symtab::add_var("set_var_2", "some other set_value");
retval = new_set_var("set_var_2", "some other set_value");
MY_TEST(retval == 0, "new dump expansion set variable 2");
retsym = symtab::lookup_existing_symbol("set_var_1");
retsym = lookup_existing_symbol("set_var_1");
MY_TEST(retsym != NULL, "get dump expansion set variable 1");
retsym->dump(false);
retsym->dump(true);
retsym->dump(false);
__dump_symtab_entry(retsym, 0);
__dump_symtab_entry(retsym, 1);
__dump_symtab_entry(retsym, 0);
symtab::free_symtab();
free_symtabs();
return rc;
}
@@ -138,17 +757,13 @@ int test_delete_set_var(void)
{
int rc = 0;
int retval;
variable *deleted;
variable *retsym;
retval = symtab::add_var("deleteme", "delete this variable");
retval = new_set_var("deleteme", "delete this variable");
MY_TEST(retval == 0, "new delete set variable");
deleted = symtab::delete_var("deleteme");
MY_TEST(deleted != NULL, "delete set variable");
retsym = symtab::lookup_existing_symbol(deleted->var_name.c_str());
MY_TEST(retsym == NULL, "deleteme was deleted from symtable");
retval = delete_set_var("deleteme");
MY_TEST(retval == 0, "delete set variable");
symtab::free_symtab();
free_symtabs();
return rc;
}
@@ -157,12 +772,13 @@ int main(void)
{
int rc = 0;
int retval;
struct value_list *list;
struct value_list *val;
variable *retsym;
struct set_value *retptr;
val = new_value_list(strdup("a set value"));
retval = symtab::add_set_value("@not_a_set_variable", val);
rc = test_compare_symtab();
retval = test_seenlist();
if (rc == 0)
rc = retval;
retval = test_add_set_to_boolean();
if (rc == 0)
@@ -188,94 +804,76 @@ int main(void)
if (rc == 0)
rc = retval;
retval = symtab::add_var("test", "test value");
retval = new_set_var("test", "test value");
MY_TEST(retval == 0, "new set variable 1");
retval = symtab::add_var("test", "different value");
retval = new_set_var("test", "different value");
MY_TEST(retval != 0, "new set variable 2");
retval = symtab::add_var("testing", "testing");
retval = new_set_var("testing", "testing");
MY_TEST(retval == 0, "new set variable 3");
retval = symtab::add_var("monopuff", "Mockingbird");
retval = new_set_var("monopuff", "Mockingbird");
MY_TEST(retval == 0, "new set variable 4");
retval = symtab::add_var("stereopuff", "Unsupervised");
retval = new_set_var("stereopuff", "Unsupervised");
MY_TEST(retval == 0, "new set variable 5");
val = new_value_list(strdup("Fun to Steal"));
list = val;
retval = symtab::add_set_value("@stereopuff", val);
retval = add_set_value("stereopuff", "Fun to Steal");
MY_TEST(retval == 0, "add set value 1");
val = new_value_list(strdup("/in/direction"));
list_append(list, val);
retval = symtab::add_set_value("@stereopuff", val);
retval = add_set_value("stereopuff", "/in/direction");
MY_TEST(retval == 0, "add set value 2");
val = new_value_list(strdup("stereopuff"));
list_append(list, val);
retval = symtab::add_set_value("@no_such_variable", val);
retval = add_set_value("no_such_variable", "stereopuff");
MY_TEST(retval != 0, "add to non-existent set var");
retval = symtab::add_var("@abuse", 0);
retval = add_boolean_var("abuse", 0);
MY_TEST(retval == 0, "new boolean variable 1");
retval = symtab::add_var("@abuse", 1);
retval = add_boolean_var("abuse", 1);
MY_TEST(retval != 0, "duplicate boolean variable 1");
retval = symtab::add_var("@stereopuff", 1);
retval = add_boolean_var("stereopuff", 1);
MY_TEST(retval != 0, "duplicate boolean variable 2");
retval = symtab::add_var("@shenanigan", 1);
retval = add_boolean_var("shenanigan", 1);
MY_TEST(retval == 0, "new boolean variable 2");
retsym = symtab::get_boolean_var("@shenanigan");
MY_TEST(retsym != NULL, "boolean variable 1 exists");
MY_TEST(retsym->boolean == 1, "get boolean variable 1");
retval = get_boolean_var("shenanigan");
MY_TEST(retval == 1, "get boolean variable 1");
retsym = symtab::get_boolean_var("@abuse");
MY_TEST(retsym != NULL, "boolean variable 2 exists");
MY_TEST(retsym->boolean == 0, "get boolean variable 2");
retval = get_boolean_var("abuse");
MY_TEST(retval == 0, "get boolean variable 2");
retsym = symtab::get_boolean_var("@non_existant");
MY_TEST(retsym == NULL, "get nonexistent boolean variable");
retval = get_boolean_var("non_existant");
MY_TEST(retval < 0, "get nonexistent boolean variable");
retsym = symtab::get_boolean_var("@stereopuff");
MY_TEST(retsym == NULL, "get boolean variable that's declared a set var");
retval = get_boolean_var("stereopuff");
MY_TEST(retval < 0, "get boolean variable that's declared a set var");
retsym = symtab::get_set_var("@daves_not_here_man");
MY_TEST(retsym == NULL, "get nonexistent set variable");
retptr = get_set_var("daves_not_here_man");
MY_TEST(retptr == NULL, "get nonexistent set variable");
retsym = symtab::get_set_var("@abuse");
MY_TEST(retsym == NULL, "get set variable that's declared a boolean");
retptr = get_set_var("abuse");
MY_TEST(retptr == NULL, "get set variable that's declared a boolean");
/* test walking set values */
retsym = symtab::get_set_var("@monopuff");
MY_TEST(retsym != NULL, "get set variable 1");
MY_TEST(retsym->values.size() == 1, "only one value");
MY_TEST(retsym->expanded.size() == 1, "only one expanded");
retptr = get_set_var("monopuff");
MY_TEST(retptr != NULL, "get set variable 1");
retval = strcmp(get_next_set_value(&retptr), "Mockingbird");
MY_TEST(retval == 0, "get set value 1");
MY_TEST(get_next_set_value(&retptr) == NULL, "get no more set values 1");
for (std::string value : retsym->values) {
retval = strcmp(value.c_str(), "Mockingbird");
MY_TEST(retval == 0, "get set value 1");
}
for (std::string value : retsym->expanded) {
retval = strcmp(value.c_str(), "Mockingbird");
MY_TEST(retval == 0, "get set value 1 expanded");
}
retval = symtab::add_var("eek", "Mocking@{monopuff}bir@{stereopuff}d@{stereopuff}");
retval = new_set_var("eek", "Mocking@{monopuff}bir@{stereopuff}d@{stereopuff}");
MY_TEST(retval == 0, "new set variable 4");
symtab::dump(false);
symtab::expand_variables();
symtab::dump(false);
symtab::dump(true);
dump_symtab();
expand_variables();
dump_symtab();
dump_expanded_symtab();
free_value_list(list);
symtab::free_symtab();
free_symtabs();
return rc;
}

View File

@@ -31,12 +31,213 @@
#include "profile.h"
#include "mount.h"
#include "dbus.h"
#include "symtab.h"
static inline const char *get_var_end(const char *var)
{
const char *eptr = var;
while (*eptr) {
if (*eptr == '}')
return eptr;
/* first character must be alpha */
if (eptr == var) {
if (!isalpha(*eptr))
return NULL; /* invalid char */
} else {
if (!(*eptr == '_' || isalnum(*eptr)))
return NULL; /* invalid char */
}
eptr++;
}
return NULL; /* no terminating '}' */
}
static struct var_string *split_string(const char *string, const char *var_begin,
const char *var_end)
{
struct var_string *n = (struct var_string *) calloc(1, sizeof(struct var_string));
unsigned int offset = strlen("@{");
if (!n) {
PERROR("Memory allocation error\n");
return NULL;
}
if (var_begin != string) {
n->prefix = strndup(string, var_begin - string);
}
n->var = strndup(var_begin + offset, var_end - (var_begin + offset));
if (strlen(var_end + 1) != 0) {
n->suffix = strdup(var_end + 1);
}
return n;
}
struct var_string *split_out_var(const char *string)
{
struct var_string *n = NULL;
const char *sptr;
bool bEscape = false; /* flag to indicate escape */
if (!string) /* shouldn't happen */
return NULL;
sptr = string;
while (!n && *sptr) {
switch (*sptr) {
case '\\':
bEscape = !bEscape;
break;
case '@':
if (bEscape) {
bEscape = false;
} else if (*(sptr + 1) == '{') {
const char *eptr = get_var_end(sptr + 2);
if (!eptr)
break; /* no variable end found */
if (eptr == sptr + 2) {
/* XXX - better diagnostics here, please */
PERROR("Empty variable name found!\n");
exit(1);
}
n = split_string(string, sptr, eptr);
}
break;
default:
bEscape = false;
}
sptr++;
}
return n;
}
void free_var_string(struct var_string *var)
{
if (!var)
return;
if (var->prefix)
free(var->prefix);
if (var->var)
free(var->var);
if (var->suffix)
free(var->suffix);
free(var);
}
static void trim_trailing_slash(std::string& str)
{
std::size_t found = str.find_last_not_of('/');
if (found != std::string::npos)
str.erase(found + 1);
else
str.clear(); // str is all '/'
}
static void write_replacement(const char separator, const char* value,
std::string& replacement, bool filter_leading_slash,
bool filter_trailing_slash)
{
const char *p = value;
replacement.append(1, separator);
if (filter_leading_slash)
while (*p == '/')
p++;
replacement.append(p);
if (filter_trailing_slash)
trim_trailing_slash(replacement);
}
static int expand_by_alternations(struct set_value **valuelist,
struct var_string *split_var,
char **name)
{
char *value, *first_value;
std::string replacement;
bool filter_leading_slash = false;
bool filter_trailing_slash = false;
first_value = get_next_set_value(valuelist);
if (!first_value) {
PERROR("ASSERT: set variable (%s) should always have at least one value assigned to it\n",
split_var->var);
exit(1);
}
free(*name);
value = get_next_set_value(valuelist);
if (!value) {
/* only one entry for the variable, so just sub it in */
if (asprintf(name, "%s%s%s",
split_var->prefix ? split_var->prefix : "",
first_value,
split_var->suffix ? split_var->suffix : "") == -1)
return -1;
return 0;
}
if (split_var->prefix && split_var->prefix[strlen(split_var->prefix) - 1] == '/')
filter_leading_slash = true;
if (split_var->suffix && *split_var->suffix == '/')
filter_trailing_slash = true;
write_replacement('{', first_value, replacement, filter_leading_slash, filter_trailing_slash);
write_replacement(',', value, replacement, filter_leading_slash, filter_trailing_slash);
while ((value = get_next_set_value(valuelist))) {
write_replacement(',', value, replacement, filter_leading_slash, filter_trailing_slash);
}
if (asprintf(name, "%s%s}%s",
split_var->prefix ? split_var->prefix : "",
replacement.c_str(),
split_var->suffix ? split_var->suffix : "") == -1) {
return -1;
}
return 0;
}
/* doesn't handle variables in options atm */
int expand_entry_variables(char **name)
{
return variable::expand_by_alternation(name);
struct set_value *valuelist;
struct var_string *split_var;
int ret;
assert(name);
if (!*name) /* can happen when entry is optional */
return 0;
while ((split_var = split_out_var(*name))) {
valuelist = get_set_var(split_var->var);
if (!valuelist) {
int boolean = get_boolean_var(split_var->var);
if (boolean == -1)
PERROR("Found reference to variable %s, but is never declared\n",
split_var->var);
else
PERROR("Found reference to set variable %s, but declared boolean\n",
split_var->var);
exit(1);
}
ret = expand_by_alternations(&valuelist, split_var, name);
free_var_string(split_var);
if (ret != 0)
return -1;
}
return 0;
}
static int process_variables_in_entries(struct cod_entry *entry_list)
@@ -71,49 +272,28 @@ static int process_variables_in_rules(Profile &prof)
return 0;
}
static int process_variable_in_attach_disconnected(char **disconnected)
{
int error = expand_entry_variables(disconnected);
if (error)
return error;
filter_slashes(*disconnected);
// TODO: semantic check should go somewhere else
if ((*disconnected)[0] != '/')
yyerror(_("attach_disconnected path must begin with a /"));
int n = strlen(*disconnected);
// removing trailing / */
while (n && (*disconnected)[n-1] == '/')
(*disconnected)[--n] = 0;
return error;
}
static int process_variables_in_name(Profile &prof)
{
/* this needs to be done before alias expansion, ie. altnames are
* setup
*/
int error = expand_entry_variables(&prof.name);
if (!error) {
if (prof.attachment)
error = expand_entry_variables(&prof.attachment);
else if (prof.name[0] == '/') {
/* had to wait to do this until after processing the
* variables in the profile name
*/
prof.attachment = strdup(local_name(prof.name));
if (!prof.attachment) {
errno = ENOMEM;
return -1;
}
filter_slashes(prof.attachment);
}
}
if (!error && prof.attachment)
error = expand_entry_variables(&prof.attachment);
if (!error && prof.flags.disconnected_path) {
error = expand_entry_variables(&prof.flags.disconnected_path);
if (error)
return error;
filter_slashes(prof.flags.disconnected_path);
// TODO: semantic check should go somewhere else
if (prof.flags.disconnected_path[0] != '/')
yyerror(_("attach_disconnected_path value must begin with a /"));
int n = strlen(prof.flags.disconnected_path);
// removing trailing / */
while (n && prof.flags.disconnected_path[n-1] == '/')
prof.flags.disconnected_path[--n] = 0;
if (!error && prof.flags.disconnected_path)
error = process_variable_in_attach_disconnected(&prof.flags.disconnected_path);
if (!error && prof.flags.disconnected_ipc)
error = process_variable_in_attach_disconnected(&prof.flags.disconnected_ipc);
}
return error;
}
@@ -137,73 +317,30 @@ static std::string escape_re(std::string str)
int process_profile_variables(Profile *prof)
{
int error = 0;
variable *saved_exec_path = NULL;
variable *saved_attach_path = NULL;
variable *tmp = NULL;
int error = 0, rc;
/* needs to be before PROFILE_NAME_VARIABLE so that variable will
* have the correct name
*/
error = process_variables_in_name(*prof);
if (error)
goto out;
/* escape profile name elements that could be interpreted as
* regular expressions.
*/
error = symtab::add_var(PROFILE_NAME_VARIABLE, escape_re(prof->get_name(false)).c_str());
if (error)
goto out;
if (prof->attachment) {
/* IF we didn't want a path based profile name to generate
* an attachment. The code could be moved here. Add the
* output fed into the vars directly instead of setting
* the attachment.
if (!error) {
/* escape profile name elements that could be interpreted
* as regular expressions.
*/
/* need to take into account alias, but not yet */
saved_attach_path = symtab::delete_var(PROFILE_ATTACH_VAR);
error = symtab::add_var(PROFILE_ATTACH_VAR, (const char*) prof->attachment);
if (error)
goto cleanup_name;
/* update to use kernel vars if available */
saved_exec_path = symtab::delete_var(PROFILE_EXEC_VAR);
error = symtab::add_var(PROFILE_EXEC_VAR, (const char*) prof->attachment);
if (error)
goto cleanup_attach;
error = new_set_var(PROFILE_NAME_VARIABLE, escape_re(prof->get_name(false)).c_str());
}
error = process_variables_in_entries(prof->entries);
if (error)
goto cleanup;
error = process_variables_in_rules(*prof);
if (!error)
error = process_variables_in_entries(prof->entries);
if (!error)
error = process_variables_in_rules(*prof);
rc = delete_set_var(PROFILE_NAME_VARIABLE);
if (!error)
error = rc;
cleanup:
/* ideally these variables would be local scoped and we would not
* have to clean them up here, but unfortunately variables
* don't support that yet.
*/
if (prof->attachment) {
tmp = symtab::delete_var(PROFILE_EXEC_VAR);
delete tmp;
if (saved_exec_path)
symtab::add_var(*saved_exec_path);
}
cleanup_attach:
if (prof->attachment) {
tmp = symtab::delete_var(PROFILE_ATTACH_VAR);
delete tmp;
if (saved_attach_path)
symtab::add_var(*saved_attach_path);
}
cleanup_name:
tmp = symtab::delete_var(PROFILE_NAME_VARIABLE);
delete tmp;
delete saved_exec_path;
delete saved_attach_path;
out:
return error;
}
@@ -211,75 +348,82 @@ out:
#include "unit_test.h"
int test_get_var_end(void)
{
int rc = 0;
const char *retchar;
const char *testchar;
testchar = "TRUE}";
retchar = get_var_end(testchar);
MY_TEST(retchar - testchar == strlen("TRUE"), "get var end for TRUE}");
testchar = "some_var}some other text";
retchar = get_var_end(testchar);
MY_TEST(retchar - testchar == strlen("some_var"), "get var end for some_var}");
testchar = "some_var}some other} text";
retchar = get_var_end(testchar);
MY_TEST(retchar - testchar == strlen("some_var"), "get var end for some_var} 2");
testchar = "FALSE";
retchar = get_var_end(testchar);
MY_TEST(retchar == NULL, "get var end for FALSE");
testchar = "pah,pah}pah ";
retchar = get_var_end(testchar);
MY_TEST(retchar == NULL, "get var end for pah,pah}");
return rc;
}
int test_split_string(void)
{
int rc = 0;
char *tst_string;
char *tst_string, *var_start, *var_end;
struct var_string *ret_struct;
const char *prefix = "abcdefg";
const char *var = "boogie";
const char *suffix = "suffixication";
std::tuple<std::string, std::string, std::string> result;
std::string result_prefix;
std::string result_var;
std::string result_suffix;
char *pvar;
asprintf(&tst_string, "%s@{%s}%s", prefix, var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(strcmp(result_prefix.c_str(), prefix) == 0, "split string 1 prefix");
MY_TEST(strcmp(pvar, var) == 0, "split string 1 var");
MY_TEST(strcmp(result_suffix.c_str(), suffix) == 0, "split string 1 suffix");
free(pvar);
var_start = tst_string + strlen(prefix);
var_end = var_start + strlen(var) + strlen("@\{");
ret_struct = split_string(tst_string, var_start, var_end);
MY_TEST(strcmp(ret_struct->prefix, prefix) == 0, "split string 1 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split string 1 var");
MY_TEST(strcmp(ret_struct->suffix, suffix) == 0, "split string 1 suffix");
free_var_string(ret_struct);
free(tst_string);
asprintf(&tst_string, "@{%s}%s", var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(result_prefix.empty(), "split string 2 prefix");
MY_TEST(strcmp(pvar, var) == 0, "split string 2 var");
MY_TEST(strcmp(result_suffix.c_str(), suffix) == 0, "split string 2 suffix");
free(pvar);
var_start = tst_string;
var_end = var_start + strlen(var) + strlen("@\{");
ret_struct = split_string(tst_string, var_start, var_end);
MY_TEST(ret_struct->prefix == NULL, "split string 2 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split string 2 var");
MY_TEST(strcmp(ret_struct->suffix, suffix) == 0, "split string 2 suffix");
free_var_string(ret_struct);
free(tst_string);
asprintf(&tst_string, "%s@{%s}", prefix, var);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(strcmp(result_prefix.c_str(), prefix) == 0, "split string 3 prefix");
MY_TEST(strcmp(pvar, var) == 0, "split string 3 var");
MY_TEST(result_suffix.empty(), "split string 3 suffix");
free(pvar);
var_start = tst_string + strlen(prefix);
var_end = var_start + strlen(var) + strlen("@\{");
ret_struct = split_string(tst_string, var_start, var_end);
MY_TEST(strcmp(ret_struct->prefix, prefix) == 0, "split string 3 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split string 3 var");
MY_TEST(ret_struct->suffix == NULL, "split string 3 suffix");
free_var_string(ret_struct);
free(tst_string);
asprintf(&tst_string, "@{%s}", var);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(result_prefix.empty(), "split string 4 prefix");
MY_TEST(strcmp(pvar, var) == 0, "split string 4 var");
MY_TEST(result_suffix.empty(), "split string 4 suffix");
free(pvar);
free(tst_string);
asprintf(&tst_string, "%s%s%s", prefix, var, suffix);;
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
MY_TEST(result_prefix.empty(), "split string 5 prefix");
MY_TEST(result_var.empty(), "split string 5 var");
MY_TEST(result_suffix.empty(), "split string 5 suffix");
var_start = tst_string;
var_end = var_start + strlen(var) + strlen("@\{");
ret_struct = split_string(tst_string, var_start, var_end);
MY_TEST(ret_struct->prefix == NULL, "split string 4 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split string 4 var");
MY_TEST(ret_struct->suffix == NULL, "split string 4 suffix");
free_var_string(ret_struct);
free(tst_string);
return rc;
@@ -289,228 +433,135 @@ int test_split_out_var(void)
{
int rc = 0;
char *tst_string, *tmp;
struct var_string *ret_struct;
const char *prefix = "abcdefg";
const char *var = "boogie";
const char *var2 = "V4rW1thNum5";
const char *var3 = "boogie_board";
const char *suffix = "suffixication";
std::tuple<std::string, std::string, std::string> result;
std::string result_prefix;
std::string result_var;
std::string result_suffix;
char *pvar = NULL;
/* simple case */
asprintf(&tst_string, "%s@{%s}%s", prefix, var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar != NULL, "extract_variable 1 pvar");
MY_TEST(strcmp(result_prefix.c_str(), prefix) == 0, "extract_variable 1 prefix");
MY_TEST(strcmp(pvar, var) == 0, "extract_variable 1 var");
MY_TEST(strcmp(result_suffix.c_str(), suffix) == 0, "extract_variable 1 suffix");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(strcmp(ret_struct->prefix, prefix) == 0, "split out var 1 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split out var 1 var");
MY_TEST(strcmp(ret_struct->suffix, suffix) == 0, "split out var 1 suffix");
free_var_string(ret_struct);
free(tst_string);
/* no prefix */
asprintf(&tst_string, "@{%s}%s", var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar != NULL, "extract_variable 2 pvar");
MY_TEST(result_prefix.empty(), "extract_variable 2 prefix");
MY_TEST(strcmp(pvar, var) == 0, "extract_variable 2 var");
MY_TEST(strcmp(result_suffix.c_str(), suffix) == 0, "extract_variable 2 suffix");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct->prefix == NULL, "split out var 2 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split out var 2 var");
MY_TEST(strcmp(ret_struct->suffix, suffix) == 0, "split out var 2 suffix");
free_var_string(ret_struct);
free(tst_string);
/* no suffix */
asprintf(&tst_string, "%s@{%s}", prefix, var);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar != NULL, "extract_variable 3 pvar");
MY_TEST(strcmp(result_prefix.c_str(), prefix) == 0, "extract_variable 3 prefix");
MY_TEST(strcmp(pvar, var) == 0, "extract_variable 3 var");
MY_TEST(result_suffix.empty(), "extract_variable 3 suffix");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(strcmp(ret_struct->prefix, prefix) == 0, "split out var 3 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split out var 3 var");
MY_TEST(ret_struct->suffix == NULL, "split out var 3 suffix");
free_var_string(ret_struct);
free(tst_string);
/* var only */
asprintf(&tst_string, "@{%s}", var);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar != NULL, "extract_variable 4 pvar");
MY_TEST(result_prefix.empty(), "extract_variable 4 prefix");
MY_TEST(strcmp(pvar, var) == 0, "extract_variable 4 var");
MY_TEST(result_suffix.empty(), "extract_variable 4 suffix");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct->prefix == NULL, "split out var 4 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split out var 4 var");
MY_TEST(ret_struct->suffix == NULL, "split out var 4 suffix");
free_var_string(ret_struct);
free(tst_string);
/* quoted var, shouldn't split */
asprintf(&tst_string, "%s\\@{%s}%s", prefix, var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
MY_TEST(result_prefix.empty(), "extract_variable - quoted @ prefix");
MY_TEST(result_var.empty(), "extract_variable - quoted @ var");
MY_TEST(result_suffix.empty(), "extract_variable - quoted @ suffix");
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct == NULL, "split out var - quoted @");
free_var_string(ret_struct);
free(tst_string);
/* quoted \, split should succeed */
asprintf(&tst_string, "%s\\\\@{%s}%s", prefix, var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
ret_struct = split_out_var(tst_string);
tmp = strndup(tst_string, strlen(prefix) + 2);
MY_TEST(pvar != NULL, "extract_variable 5 pvar");
MY_TEST(strcmp(result_prefix.c_str(), tmp) == 0, "extract_variable 5 prefix");
MY_TEST(strcmp(pvar, var) == 0, "extract_variable 5 var");
MY_TEST(strcmp(result_suffix.c_str(), suffix) == 0, "extract_variable 5 suffix");
if (pvar)
free(pvar);
MY_TEST(strcmp(ret_struct->prefix, tmp) == 0, "split out var 5 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split out var 5 var");
MY_TEST(strcmp(ret_struct->suffix, suffix) == 0, "split out var 5 suffix");
free_var_string(ret_struct);
free(tst_string);
free(tmp);
/* un terminated var, should fail */
asprintf(&tst_string, "%s@{%s%s", prefix, var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
MY_TEST(result_prefix.empty(), "extract_variable - un-terminated var prefix");
MY_TEST(result_var.empty(), "extract_variable - un-terminated var var");
MY_TEST(result_suffix.empty(), "extract_variable - un-terminated var suffix");
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct == NULL, "split out var - un-terminated var");
free_var_string(ret_struct);
free(tst_string);
/* invalid char in var, should fail */
asprintf(&tst_string, "%s@{%s^%s}%s", prefix, var, var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar == NULL, "process_var - invalid char in var");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct == NULL, "split out var - invalid char in var");
free_var_string(ret_struct);
free(tst_string);
/* two vars, should only strip out first */
asprintf(&tmp, "@{%s}%s}", suffix, suffix);
asprintf(&tst_string, "%s@{%s}%s", prefix, var, tmp);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar != NULL, "extract_variable 6 pvar");
MY_TEST(strcmp(result_prefix.c_str(), prefix) == 0, "extract_variable 6 prefix");
MY_TEST(strcmp(pvar, var) == 0, "extract_variable 6 var");
MY_TEST(strcmp(result_suffix.c_str(), tmp) == 0, "extract_variable 6 suffix");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(strcmp(ret_struct->prefix, prefix) == 0, "split out var 6 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split out var 6 var");
MY_TEST(strcmp(ret_struct->suffix, tmp) == 0, "split out var 6 suffix");
free_var_string(ret_struct);
free(tst_string);
free(tmp);
/* quoted @ followed by var, split should succeed */
asprintf(&tst_string, "%s\\@@{%s}%s", prefix, var, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
ret_struct = split_out_var(tst_string);
tmp = strndup(tst_string, strlen(prefix) + 2);
MY_TEST(pvar != NULL, "extract_variable 7 pvar");
MY_TEST(strcmp(result_prefix.c_str(), tmp) == 0, "extract_variable 7 prefix");
MY_TEST(strcmp(pvar, var) == 0, "extract_variable 7 var");
MY_TEST(strcmp(result_suffix.c_str(), suffix) == 0, "extract_variable 7 suffix");
if (pvar)
free(pvar);
MY_TEST(strcmp(ret_struct->prefix, tmp) == 0, "split out var 7 prefix");
MY_TEST(strcmp(ret_struct->var, var) == 0, "split out var 7 var");
MY_TEST(strcmp(ret_struct->suffix, suffix) == 0, "split out var 7 suffix");
free_var_string(ret_struct);
free(tst_string);
free(tmp);
/* numeric char in var, should succeed */
asprintf(&tst_string, "%s@{%s}%s", prefix, var2, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar != NULL, "extract_variable numeric var pvar");
MY_TEST(strcmp(result_prefix.c_str(), prefix) == 0, "split out numeric var prefix");
MY_TEST(strcmp(pvar, var2) == 0, "split numeric var var");
MY_TEST(strcmp(result_suffix.c_str(), suffix) == 0, "split out numeric var suffix");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct && strcmp(ret_struct->prefix, prefix) == 0, "split out numeric var prefix");
MY_TEST(ret_struct && strcmp(ret_struct->var, var2) == 0, "split numeric var var");
MY_TEST(ret_struct && strcmp(ret_struct->suffix, suffix) == 0, "split out numeric var suffix");
free_var_string(ret_struct);
free(tst_string);
/* numeric first char in var, should fail */
asprintf(&tst_string, "%s@{6%s}%s", prefix, var2, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar == NULL, "process_var - invalid char in var");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct == NULL, "split out var - numeric first char in var");
free_var_string(ret_struct);
free(tst_string);
/* underscore char in var, should succeed */
asprintf(&tst_string, "%s@{%s}%s", prefix, var3, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar != NULL, "extract_variable underscore var pvar");
MY_TEST(strcmp(result_prefix.c_str(), prefix) == 0, "split out underscore var prefix");
MY_TEST(strcmp(pvar, var3) == 0, "split out underscore var");
MY_TEST(strcmp(result_suffix.c_str(), suffix) == 0, "split out underscore var suffix");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct && strcmp(ret_struct->prefix, prefix) == 0, "split out underscore var prefix");
MY_TEST(ret_struct && strcmp(ret_struct->var, var3) == 0, "split out underscore var");
MY_TEST(ret_struct && strcmp(ret_struct->suffix, suffix) == 0, "split out underscore var suffix");
free_var_string(ret_struct);
free(tst_string);
/* underscore first char in var, should fail */
asprintf(&tst_string, "%s@{_%s%s}%s", prefix, var2, var3, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar == NULL, "process_var - invalid char in var");
if (pvar)
free(pvar);
ret_struct = split_out_var(tst_string);
MY_TEST(ret_struct == NULL, "split out var - underscore first char in var");
free_var_string(ret_struct);
free(tst_string);
/* empty var name, should fail */
asprintf(&tst_string, "%s@{}%s", prefix, suffix);
result = extract_variable(tst_string);
result_prefix = std::get<0>(result);
result_var = std::get<1>(result);
result_suffix = std::get<2>(result);
pvar = variable::process_var(result_var.c_str());
MY_TEST(pvar == NULL, "process_var - empty var name");
if (pvar)
free(pvar);
free(tst_string);
return rc;
}
int main(void)
@@ -518,6 +569,10 @@ int main(void)
int rc = 0;
int retval;
retval = test_get_var_end();
if (retval != 0)
rc = retval;
retval = test_split_string();
if (retval != 0)
rc = retval;

View File

@@ -45,7 +45,6 @@
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
#define CIDR_32 htonl(0xffffffff)
#define CIDR_24 htonl(0xffffff00)
@@ -193,7 +192,6 @@ static void abi_features(char *filename, bool search);
#include "network.h"
#include "all_rule.h"
#include "cond_expr.h"
#include "symtab.h"
}
%union {
@@ -493,37 +491,71 @@ alias: TOK_ALIAS TOK_ID TOK_ARROW TOK_ID TOK_END_OF_RULE
varassign: TOK_SET_VAR TOK_EQUALS valuelist
{
struct value_list *list = $3;
char *var_name = process_var($1);
int err;
err = symtab::add_var($1, $3);
if (!list || !list->value)
yyerror("Assert: valuelist returned NULL");
PDEBUG("Matched: set assignment for (%s)\n", $1);
err = new_set_var(var_name, list->value);
if (err) {
free(var_name);
yyerror("variable %s was previously declared", $1);
/* FIXME: it'd be handy to report the previous location */
}
for (list = list->next; list; list = list->next) {
err = add_set_value(var_name, list->value);
if (err) {
free(var_name);
yyerror("Error adding %s to set var %s",
list->value, $1);
}
}
free_value_list($3);
free(var_name);
free($1);
}
varassign: TOK_SET_VAR TOK_ADD_ASSIGN valuelist
{
struct value_list *list = $3;
char *var_name = process_var($1);
int err;
err = symtab::add_set_value($1, $3);
if (!list || !list->value)
yyerror("Assert: valuelist returned NULL");
PDEBUG("Matched: additive assignment for (%s)\n", $1);
/* do the first one outside the loop, subsequent
* failures are indicative of symtab failures */
err = add_set_value(var_name, list->value);
if (err) {
free(var_name);
yyerror("variable %s was not previously declared, but is being assigned additional values", $1);
}
for (list = list->next; list; list = list->next) {
err = add_set_value(var_name, list->value);
if (err) {
free(var_name);
yyerror("Error adding %s to set var %s",
list->value, $1);
}
}
free_value_list($3);
free(var_name);
free($1);
}
varassign: TOK_BOOL_VAR TOK_EQUALS TOK_VALUE
{
int boolean, err;
char *var_name = process_var($1);
PDEBUG("Matched: boolean assignment (%s) to %s\n", $1, $3);
boolean = str_to_boolean($3);
if (boolean == -1) {
yyerror("Invalid boolean assignment for (%s): %s is not true or false",
$1, $3);
}
err = symtab::add_var($1, boolean);
err = add_boolean_var(var_name, boolean);
free(var_name);
if (err) {
yyerror("variable %s was previously declared", $1);
/* FIXME: it'd be handy to report the previous location */
@@ -577,7 +609,6 @@ flags: opt_flags TOK_OPENPAREN flagvals TOK_CLOSEPAREN
flagvals: flagvals flagval
{
$1.merge($2);
$2.clear();
$$ = $1;
};
@@ -1749,17 +1780,8 @@ static int abi_features_base(struct aa_features **features, char *filename, bool
bool cached;
if (search) {
if (strcmp(filename, "kernel") == 0) {
if (kernel_features) {
*features = aa_features_ref(kernel_features);
return 0;
}
if (strcmp(filename, "kernel") == 0)
return aa_features_new_from_kernel(features);
} else if (strcmp(filename, "default") == 0) {
return aa_features_new_from_string(features,
default_features_abi,
strlen(default_features_abi));
}
f = search_path(filename, &fullpath, &cached);
PDEBUG("abi lookup '%s' -> '%s' f %p cached %d\n", filename, fullpath, f, cached);
if (!f && cached) {

View File

@@ -8,33 +8,33 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2020-03-12 02:48+0000\n"
"Last-Translator: bernard stafford <Unknown>\n"
"PO-Revision-Date: 2013-11-15 01:27+0000\n"
"Last-Translator: Novell Language <Unknown>\n"
"Language-Team: Novell Language <language@novell.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-03-13 05:43+0000\n"
"X-Generator: Launchpad (build 3a6db24bbe7280ec09bae73384238390fcc98ad3)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:32+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: af\n"
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "Fout: Buite geheue.\n"
msgstr ""
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr "Fout: basedir %s is nie 'n gids, huppel tans.\n"
msgstr ""
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr "Fout: Kon gids nie by te voeg %s om soek pad.\n"
msgstr ""
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "Fout: Kon nie geheue toeken.\n"
msgstr ""
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
msgid "Bad write position\n"
@@ -50,7 +50,7 @@ msgstr "Geheue is opgebruik\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "Kon nie profiel kopieer: Slegte geheue-adres\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
msgid "Profile doesn't conform to protocol\n"
@@ -62,7 +62,7 @@ msgstr "Profiel stem nie ooreen met handtekening nie\n"
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
msgid "Profile version not supported by Apparmor module\n"
msgstr "Profiel weergawe nie gesteunde deur Apparmora module\n"
msgstr ""
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
msgid "Profile already exists\n"
@@ -74,12 +74,12 @@ msgstr "Profiel bestaan nie\n"
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr "Toestemming ontkened; poging tot laai 'n profiel terwyl confined?\n"
msgstr ""
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "Onbekende fout (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
@@ -109,7 +109,7 @@ msgstr "%s: Kan nie na stdout toe skryf nie\n"
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: Nie in staat is om te skryf aan uitset lêer\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
@@ -145,11 +145,11 @@ msgstr "PANIEK slegs inkrementbuffer %p pos %p uitbr %p grootte %d res %p\n"
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr "profiel %s netwerk reëls nie afgedwing\n"
msgstr ""
#: ../parser_interface.c:666
msgid "Unknown pattern type\n"
msgstr "Onbekend patroon tipe\n"
msgstr ""
#: ../parser_interface.c:750 ../parser_interface.c:902
#: ../parser_interface.c:743 ../parser_interface.c:894
@@ -162,13 +162,13 @@ msgstr "Kan %s - %s nie open nie\n"
#: ../parser_interface.c:543
#, c-format
msgid "Memory Allocation Error: Unable to remove ^%s\n"
msgstr "Geheue Allokasie Fout: Nie in staat om verwyder ^%s\n"
msgstr ""
#: ../parser_interface.c:789 ../parser_interface.c:781
#: ../parser_interface.c:556
#, c-format
msgid "Memory Allocation Error: Unable to remove %s:%s."
msgstr "Geheue Allokasie Fout: Nie in staat om verwyder %s:%s."
msgstr ""
#: ../parser_interface.c:810 ../parser_interface.c:802
msgid "unable to create work area\n"
@@ -190,32 +190,32 @@ msgstr "%s: Kan nie volledige profielinskrywing skryf nie\n"
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr "%s: Nie in staat skryf die entire profiel inskrywing om kas\n"
msgstr ""
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr "Kon nie oopmaak '%s'"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr "fstat misluk vir '%s'"
msgstr ""
#: parser_lex.l:121
#, c-format
msgid "opendir failed '%s'"
msgstr "oopdir misluk '%s'"
msgstr ""
#: parser_lex.l:152
#, c-format
msgid "stat failed for '%s'"
msgstr "stat misluk vir '%s'"
msgstr ""
#: parser_lex.l:155 parser_lex.l:133 parser_lex.l:139
#, c-format
msgid "Could not open '%s' in '%s'"
msgstr "Kon nie oopmaak '%s' in '%s'"
msgstr ""
#: parser_lex.l:284 parser_lex.l:322 parser_lex.l:362 parser_lex.l:399
#: parser_lex.l:469 parser_lex.l:655 parser_lex.l:586 parser_lex.l:638
@@ -225,17 +225,17 @@ msgstr "Onverwagte karakter gevind: '%s'"
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr "Veranderlike aangiftes aanvaar nie trailing kommas"
msgstr ""
#: parser_lex.l:420
#, c-format
msgid "(network_mode) Found unexpected character: '%s'"
msgstr "(netwerk_modus) Gevind onverwagte karakter: '%s'"
msgstr ""
#: ../parser_main.c:333 ../parser_common.c:61 ../parser_common.c:106
#, c-format
msgid "Warning from %s (%s%sline %d): %s"
msgstr "Waarskuwing vanaf %s (%s%sline %d): %s"
msgstr ""
#: ../parser_main.c:531
#, c-format
@@ -248,8 +248,6 @@ msgid ""
"Warning: unable to find a suitable fs in %s, is it mounted?\n"
"Use --subdomainfs to override.\n"
msgstr ""
"Waarskuwing: nie in staat om vind 'n geskikte fs in %s, is dit gemonteer?\n"
"Gebruik --subdomainfs om override.\n"
#: ../parser_main.c:597 ../parser_main.c:635 ../parser_main.c:498
#, c-format
@@ -257,8 +255,6 @@ msgid ""
"%s: Sorry. You need root privileges to run this program.\n"
"\n"
msgstr ""
"%s: Jammer. Wat jy nodig het root voorregte om hierdie program uit te voer.\n"
"\n"
#: ../parser_main.c:604 ../parser_main.c:642 ../parser_main.c:505
#, c-format
@@ -267,16 +263,12 @@ msgid ""
"Anybody who can run this program can update your AppArmor profiles.\n"
"\n"
msgstr ""
"%s: Waarskuwing! Jy het stel hierdie program setuid root.\n"
"Enigiemand wat hierdie programe kan jou AppArmor profiele by te werk kan "
"hardloop.\n"
"\n"
#: ../parser_main.c:704 ../parser_main.c:813 ../parser_main.c:836
#: ../parser_main.c:946 ../parser_main.c:860
#, c-format
msgid "Error: Could not read profile %s: %s.\n"
msgstr "Fout: Kan nie profiel lees %s: %s.\n"
msgstr ""
#: ../parser_main.c:718 ../parser_misc.c:270 parser_yacc.y:227
#: parser_yacc.y:374 parser_yacc.y:386 parser_yacc.y:484 parser_yacc.y:586
@@ -302,12 +294,12 @@ msgstr "Geheuetoekenningsfout."
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr "Kas laai suksesvol vir \"%s\".\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr "Kas relaai suksesvol vir \"%s\".\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#, c-format
@@ -319,14 +311,11 @@ msgid ""
"Uppercase qualifiers \"RWLIMX\" are deprecated, please convert to lowercase\n"
"See the apparmor.d(5) manpage for details.\n"
msgstr ""
"Hoofletters kwalifiseerders \"RWLIMX\" is deprecated, asseblief omskakel na "
"kleinletters\n"
"Sien die apparmor.d(5) manpage vir besonderhede.\n"
#: ../parser_misc.c:467 ../parser_misc.c:474 ../parser_misc.c:638
#: ../parser_misc.c:645 ../parser_misc.c:380 ../parser_misc.c:387
msgid "Conflict 'a' and 'w' perms are mutually exclusive."
msgstr "Konflik 'a' en 'w' perms is onderling uitsluitend."
msgstr ""
#: ../parser_misc.c:491 ../parser_misc.c:662 ../parser_misc.c:404
msgid "Exec qualifier 'i' invalid, conflicting qualifier already specified"
@@ -340,17 +329,12 @@ msgid ""
"Unconfined exec qualifier (%c%c) allows some dangerous environment variables "
"to be passed to the unconfined process; 'man 5 apparmor.d' for details.\n"
msgstr ""
"Onbegrensde exec kwalifiseerder (%c%c) toelaat sommige gevaarlike omgewing "
"veranderlikes om wees geslaag om die onbegrensde proses; 'man 5 apparmor.d' "
"vir besonderhede.\n"
#: ../parser_misc.c:510 ../parser_misc.c:551 ../parser_misc.c:681
#: ../parser_misc.c:722 ../parser_misc.c:423 ../parser_misc.c:464
#, c-format
msgid "Exec qualifier '%c' invalid, conflicting qualifier already specified"
msgstr ""
"Exec kwalifiseerder '%c' ongeldig, konflikterende kwalifiseerder reeds "
"gespesifiseer"
#: ../parser_misc.c:537 ../parser_misc.c:545 ../parser_misc.c:708
#: ../parser_misc.c:716 ../parser_misc.c:450 ../parser_misc.c:458
@@ -358,24 +342,22 @@ msgstr ""
msgid ""
"Exec qualifier '%c%c' invalid, conflicting qualifier already specified"
msgstr ""
"Exec kwalifiseerder '%c%c' ongeldig, konflikterende kwalifiseerder reeds "
"gespesifiseer"
#: ../parser_misc.c:593 ../parser_misc.c:764 ../parser_misc.c:506
#, c-format
msgid "Internal: unexpected mode character '%c' in input"
msgstr "Interne: onverwagte modus karakter '%c' in insette"
msgstr ""
#: ../parser_misc.c:615 ../parser_misc.c:786 ../parser_misc.c:528
#, c-format
msgid "Internal error generated invalid perm 0x%llx\n"
msgstr "Interne fout gegenereer ongeldige perm 0x%llx\n"
msgstr ""
#: ../parser_misc.c:865 ../parser_symtab.c:561 ../parser_regex.c:626
#: ../parser_variable.c:229
#, c-format
msgid "AppArmor parser error: %s\n"
msgstr "AppArmor parser fout: %s\n"
msgstr ""
#: ../parser_merge.c:92 ../parser_merge.c:91 ../parser_merge.c:83
msgid "Couldn't merge entries. Out of Memory\n"
@@ -384,50 +366,47 @@ msgstr "Kon inskrywings nie saamvleg nie. Geheue is opgebruik\n"
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr "profiel %s: het saamgevoegde reël %s met konflikterende x wysigers\n"
msgstr ""
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
msgstr "Profiel beslaglegging moet begin met 'n '/'."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
"Profiel name moet begin met 'n '/', naamruimte of sleutelwoord 'profile' of "
"'hat'."
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
msgid "Failed to create alias %s -> %s\n"
msgstr "Kon nie alias skep %s -> %s\n"
msgstr ""
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr "Profiel vlag chroot_relatiewe konflik met naamruimte_relatiewe"
msgstr ""
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr "Profiel vlag bemiddel_geskrap konflikte met delegeer_geskrap"
msgstr ""
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
"Profiel vlag hechten_ontkoppelde konflikte met geen_hechten_ontkoppel"
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr "Profiel vlag chroot_hechten konflik met chroot_geen_hechten"
msgstr ""
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
msgstr "Profiel vlag 'debug' is nie meer geldig."
msgstr ""
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552
#, c-format
msgid "Invalid profile flag: %s."
msgstr "Ongeldige profiel vlag: %s."
msgstr ""
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
msgid "Assert: `rule' returned NULL."
@@ -439,29 +418,23 @@ msgid ""
"Invalid mode, in deny rules 'x' must not be preceded by exec qualifier 'i', "
"'p', or 'u'"
msgstr ""
"Ongeldige modus, in ontken reëls 'x' moet nie voorafgegaan word deur exec "
"kwalifiseerder 'i', 'p', of 'u'"
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602
msgid ""
"Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', 'c', or 'u'"
msgstr ""
"Ongeldige modus, 'x' moet voorafgegaan word deur exec kwalifiseerder 'i', "
"'p', 'c', of 'u'"
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633
msgid "Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', or 'u'"
msgstr ""
"Ongeldige modus, 'x' moet voorafgegaan word deur exec kwalifiseerder 'i', "
"'p', of 'u'"
#: parser_yacc.y:574 parser_yacc.y:612 parser_yacc.y:614 parser_yacc.y:660
msgid "Assert: `network_rule' return invalid protocol."
msgstr "Assert: `network_rule' ongeldige protokol terugstuur."
msgstr ""
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr "Assert: `change_profile' teruggekeer NULL."
msgstr ""
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
@@ -469,28 +442,28 @@ msgstr "Beweer: `hat-reël' het NUL teruggestuur."
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr "Assert: 'local_profile rule' teruggekeer NULL."
msgstr ""
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
msgid "Unset boolean variable %s used in if-expression"
msgstr "Unset boolean veranderlike %s gebruik in if-uitdrukking"
msgstr ""
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092
msgid "unsafe rule missing exec permissions"
msgstr "onveilige reël ontbreek exec toestemmings"
msgstr ""
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060
msgid "subset can only be used with link rules."
msgstr "subset kan slegs gebruik word met skakel reëls."
msgstr ""
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062
msgid "link and exec perms conflict on a file rule using ->"
msgstr "skakel en exec perms konflik op 'n lêer reël met behulp van ->"
msgstr ""
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064
msgid "link perms are not allowed on a named profile transition.\n"
msgstr "skakel perms word nie toegelaat op 'n vernoem profiel oorgang.\n"
msgstr ""
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109
#, c-format
@@ -500,22 +473,22 @@ msgstr "ontbreek daar n reëleindkarakter? (inskrywing: %s)"
#: parser_yacc.y:975 parser_yacc.y:985 parser_yacc.y:1057 parser_yacc.y:1067
#: parser_yacc.y:1145 parser_yacc.y:1155
msgid "Invalid network entry."
msgstr "Ongeldig netwerk inskrywing."
msgstr ""
#: parser_yacc.y:1039 parser_yacc.y:1048 parser_yacc.y:1254 parser_yacc.y:1510
#, c-format
msgid "Invalid capability %s."
msgstr "Ongeldige capvermoë %s."
msgstr ""
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr "AppArmor parser fout vir %s%s%s by lyn %d: %s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr "AppArmor parser fout,%s%s lyn %d: %s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
@@ -541,8 +514,6 @@ msgid ""
"%s: Regex grouping error: Unclosed grouping or character class, expecting "
"close }\n"
msgstr ""
"%s: Regex groepering fout: Unclosed groepering of karakter klas, verwag tans "
"sluit }\n"
#: ../parser_regex.c:351 ../parser_regex.c:357
#, c-format
@@ -557,12 +528,12 @@ msgstr "%s: Kan insetreël '%s' nie ontleed nie\n"
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr "%s: Ongeldig profiel naam '%s' - slegte gereelde uitdrukking\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#, c-format
msgid "ERROR merging rules for profile %s, failed to load\n"
msgstr "FOUT samesmelting reëls vir profiele %s, kon nie laai nie\n"
msgstr ""
#: ../parser_policy.c:234
#, c-format
@@ -571,24 +542,21 @@ msgid ""
"\t'*', '?', character ranges, and alternations are not allowed.\n"
"\t'**' may only be used at the end of a rule.\n"
msgstr ""
"FOUT profiel %s bevat beleid elemente nie bruikbaar met hierdie kern:\n"
"\t'*', '?', karakter reekse, en alternations is nie toegelaat.\n"
"\t'**' mag enigste wees gebruik an die einde van 'n rule.\n"
#: ../parser_policy.c:279 ../parser_policy.c:359 ../parser_policy.c:332
#, c-format
msgid "ERROR processing regexs for profile %s, failed to load\n"
msgstr "FOUT verwerking regexs vir profiel %s, misluk om laai\n"
msgstr ""
#: ../parser_policy.c:306 ../parser_policy.c:389 ../parser_policy.c:362
#, c-format
msgid "ERROR expanding variables for profile %s, failed to load\n"
msgstr "FOUT uitbrei tans veranderlikes vir praofiel %s, misluk om laai\n"
msgstr ""
#: ../parser_policy.c:390 ../parser_policy.c:382 ../parser_policy.c:355
#, c-format
msgid "ERROR adding hat access rule for profile %s\n"
msgstr "FOUT bygevoeg hoed toegang reël vir profiel %s\n"
msgstr ""
#: ../parser_policy.c:490 ../parser_policy.c:271
#, c-format
@@ -598,17 +566,17 @@ msgstr "FOUT in profiel %s, het misluk om te laai\n"
#: ../parser_policy.c:675
#, c-format
msgid "%s: Errors found during postprocessing. Aborting.\n"
msgstr "%s: Foute gevind tydens naverwerking. Aborteer tans.\n"
msgstr ""
#: ../parser_policy.c:682 ../parser_policy.c:704
#, c-format
msgid "%s: Errors found during regex postprocess. Aborting.\n"
msgstr "%s: Foute gevind tydens regex naverwerking. Aborteer tans.\n"
msgstr ""
#: ../parser_policy.c:689
#, c-format
msgid "%s: Errors found during postprocess. Aborting.\n"
msgstr "%s: Foute gevind tydens na-proses. Aborteer tans.\n"
msgstr ""
#: ../parser_policy.c:696
#, c-format
@@ -619,162 +587,161 @@ msgstr ""
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr "Kon nie proses -insluit gids '%s' in '%s'"
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr "Funksie buffer volle."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "Uit van geheue"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
msgid "Can't create cache directory: %s\n"
msgstr "Kan nie kasgids skep nie: %s\n"
msgstr ""
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr "Lêer in kas directory plek: %s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
msgid "Can't update cache directory: %s\n"
msgstr "Kan nie kasgids opdateer: %s\n"
msgstr ""
#: ../parser_misc.c:833
#, c-format
msgid "Internal: unexpected DBus mode character '%c' in input"
msgstr "interne: onverwagte DBUS modus karakter '%c' in insette"
msgstr ""
#: ../parser_misc.c:857
#, c-format
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr "Interne fout gegenereer ongeldig DBus perm 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr "ontken voorvoegsel nie toegelaat"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr "eienaar voorvoegsel nie toegelaat"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr "eienaar voorvoegsel nie toegelaat op reëls berg"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr "eienaar voorvoegsel nie toelaat op dbus reëls"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr "eienaar voorvoegsel nie toelaat op capvermoë reëls"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr "ongeldig berg voorwaardelike %s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr "slegte berg reël"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr "hegpunt voorwaardes tans nie ondersteun nie"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr "ongeldig pivotroot voorwaardelike '%s'"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
"%s: Regex groepering fout: Ongeldig naby ], geen bypassende oop [ bespeur\n"
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr "%s: Regex groepering fout: Oorskry maksimum nes van {}\n"
msgstr ""
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr "FOUT verwerking beleiddb reëls vir profiel %s, kon nie laai nie\n"
msgstr ""
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr "FOUT vervanging van aliasse vir profiel %s, misluk om laai\n"
msgstr ""
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr "%s: Nie in staat om skryf %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr "Fout: Kon nie lees binêre profiel of kaslêer %s: %s.\n"
msgstr ""
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr "Fout: Kon nie lees kaslêer '%s', huppel tans...\n"
msgstr ""
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr "Interne: onverwagte %s modus karakter '%c' in inset"
msgstr ""
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr "Interne fout gegenereer ongeldig %s perm 0x%x\n"
msgstr ""
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr "eienaar voorvoegsel nie toegelaat op reëls berg"
msgstr ""
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr "eienaar voorvoegsel nie toegelaat op dbus reëls"
msgstr ""
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr "eienaar voorvoegsel nie toegelaat op sein reëls"
msgstr ""
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr "eienaar voorvoegsel nie toegelaat op ptrace reëls"
msgstr ""
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr "eienaar voorvoegsel nie toegelaat op unix reëls"
msgstr ""
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr "eienaar voorvoegsel nie toegelaat op capvermoë reëls"
msgstr ""
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr "dbus reël: ongeldig voorwaardelike groep %s=()"
msgstr ""
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr "unix reël: ongeldig voorwaardelike groep %s=()"
msgstr ""
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr "%s: Regex fout: trailing '\\' ontsnapping karakter\n"
msgstr ""

View File

@@ -1,741 +0,0 @@
# Belarusian translation for apparmor
# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
# This file is distributed under the same license as the apparmor package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2020-05-03 16:54+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Belarusian <be@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-05-04 04:32+0000\n"
"X-Generator: Launchpad (build fbdff7602bd10fb883bf7e2ddcc7fd5a16f60398)\n"
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr ""
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr ""
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr ""
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr ""
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
msgid "Bad write position\n"
msgstr ""
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
msgid "Permission denied\n"
msgstr ""
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
msgid "Out of memory\n"
msgstr ""
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
msgid "Couldn't copy profile: Bad memory address\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
msgid "Profile doesn't conform to protocol\n"
msgstr ""
#: ../parser_interface.c:84 ../parser_interface.c:87 ../parser_interface.c:64
msgid "Profile does not match signature\n"
msgstr ""
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
msgid "Profile version not supported by Apparmor module\n"
msgstr ""
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
msgid "Profile already exists\n"
msgstr ""
#: ../parser_interface.c:93 ../parser_interface.c:96 ../parser_interface.c:73
msgid "Profile doesn't exist\n"
msgstr ""
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr ""
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
#, c-format
msgid "%s: Unable to add \"%s\". "
msgstr ""
#: ../parser_interface.c:121 ../parser_interface.c:124
#: ../parser_interface.c:101
#, c-format
msgid "%s: Unable to replace \"%s\". "
msgstr ""
#: ../parser_interface.c:126 ../parser_interface.c:129
#: ../parser_interface.c:106
#, c-format
msgid "%s: Unable to remove \"%s\". "
msgstr ""
#: ../parser_interface.c:131 ../parser_interface.c:134
#: ../parser_interface.c:111
#, c-format
msgid "%s: Unable to write to stdout\n"
msgstr ""
#: ../parser_interface.c:135 ../parser_interface.c:138
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
#: ../parser_interface.c:118 ../parser_interface.c:142
#, c-format
msgid "%s: ASSERT: Invalid option: %d\n"
msgstr ""
#: ../parser_interface.c:147 ../parser_interface.c:150
#: ../parser_interface.c:127
#, c-format
msgid "Addition succeeded for \"%s\".\n"
msgstr ""
#: ../parser_interface.c:151 ../parser_interface.c:154
#: ../parser_interface.c:131
#, c-format
msgid "Replacement succeeded for \"%s\".\n"
msgstr ""
#: ../parser_interface.c:155 ../parser_interface.c:158
#: ../parser_interface.c:135
#, c-format
msgid "Removal succeeded for \"%s\".\n"
msgstr ""
#: ../parser_interface.c:251 ../parser_interface.c:254
#, c-format
msgid "PANIC bad increment buffer %p pos %p ext %p size %d res %p\n"
msgstr ""
#: ../parser_interface.c:656 ../parser_interface.c:658
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr ""
#: ../parser_interface.c:666
msgid "Unknown pattern type\n"
msgstr ""
#: ../parser_interface.c:750 ../parser_interface.c:902
#: ../parser_interface.c:743 ../parser_interface.c:894
#: ../parser_interface.c:518 ../parser_interface.c:669
#, c-format
msgid "Unable to open %s - %s\n"
msgstr ""
#: ../parser_interface.c:776 ../parser_interface.c:768
#: ../parser_interface.c:543
#, c-format
msgid "Memory Allocation Error: Unable to remove ^%s\n"
msgstr ""
#: ../parser_interface.c:789 ../parser_interface.c:781
#: ../parser_interface.c:556
#, c-format
msgid "Memory Allocation Error: Unable to remove %s:%s."
msgstr ""
#: ../parser_interface.c:810 ../parser_interface.c:802
msgid "unable to create work area\n"
msgstr ""
#: ../parser_interface.c:818 ../parser_interface.c:810
#, c-format
msgid "unable to serialize profile %s\n"
msgstr ""
#: ../parser_interface.c:829 ../parser_interface.c:916
#: ../parser_interface.c:821 ../parser_interface.c:908
#: ../parser_interface.c:582
#, c-format
msgid "%s: Unable to write entire profile entry\n"
msgstr ""
#: ../parser_interface.c:839 ../parser_interface.c:831
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr ""
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr ""
#: parser_lex.l:121
#, c-format
msgid "opendir failed '%s'"
msgstr ""
#: parser_lex.l:152
#, c-format
msgid "stat failed for '%s'"
msgstr ""
#: parser_lex.l:155 parser_lex.l:133 parser_lex.l:139
#, c-format
msgid "Could not open '%s' in '%s'"
msgstr ""
#: parser_lex.l:284 parser_lex.l:322 parser_lex.l:362 parser_lex.l:399
#: parser_lex.l:469 parser_lex.l:655 parser_lex.l:586 parser_lex.l:638
#, c-format
msgid "Found unexpected character: '%s'"
msgstr ""
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr ""
#: parser_lex.l:420
#, c-format
msgid "(network_mode) Found unexpected character: '%s'"
msgstr ""
#: ../parser_main.c:333 ../parser_common.c:61 ../parser_common.c:106
#, c-format
msgid "Warning from %s (%s%sline %d): %s"
msgstr ""
#: ../parser_main.c:531
#, c-format
msgid "%s: Could not allocate memory for subdomainbase mount point\n"
msgstr ""
#: ../parser_main.c:577 ../parser_main.c:616 ../parser_main.c:479
#, c-format
msgid ""
"Warning: unable to find a suitable fs in %s, is it mounted?\n"
"Use --subdomainfs to override.\n"
msgstr ""
#: ../parser_main.c:597 ../parser_main.c:635 ../parser_main.c:498
#, c-format
msgid ""
"%s: Sorry. You need root privileges to run this program.\n"
"\n"
msgstr ""
#: ../parser_main.c:604 ../parser_main.c:642 ../parser_main.c:505
#, c-format
msgid ""
"%s: Warning! You've set this program setuid root.\n"
"Anybody who can run this program can update your AppArmor profiles.\n"
"\n"
msgstr ""
#: ../parser_main.c:704 ../parser_main.c:813 ../parser_main.c:836
#: ../parser_main.c:946 ../parser_main.c:860
#, c-format
msgid "Error: Could not read profile %s: %s.\n"
msgstr ""
#: ../parser_main.c:718 ../parser_misc.c:270 parser_yacc.y:227
#: parser_yacc.y:374 parser_yacc.y:386 parser_yacc.y:484 parser_yacc.y:586
#: parser_yacc.y:624 parser_yacc.y:939 parser_yacc.y:948 parser_yacc.y:960
#: parser_yacc.y:1008 parser_yacc.y:1019 parser_yacc.y:1101 parser_yacc.y:1119
#: parser_yacc.y:1126 ../parser_main.c:850 ../parser_main.c:1015
#: ../parser_main.c:1229 ../parser_main.c:1283 ../parser_misc.c:431
#: parser_yacc.y:268 parser_yacc.y:416 parser_yacc.y:426 parser_yacc.y:537
#: parser_yacc.y:626 parser_yacc.y:976 parser_yacc.y:1021 parser_yacc.y:1030
#: parser_yacc.y:1042 parser_yacc.y:1078 parser_yacc.y:1082 parser_yacc.y:1092
#: parser_yacc.y:1102 parser_yacc.y:1201 parser_yacc.y:1223 parser_yacc.y:1234
#: parser_yacc.y:1309 parser_yacc.y:1327 parser_yacc.y:1334 parser_yacc.y:1385
#: ../parser_main.c:735 ../parser_main.c:923 ../parser_main.c:1133
#: ../parser_main.c:1187 parser_yacc.y:311 parser_yacc.y:462 parser_yacc.y:472
#: parser_yacc.y:583 parser_yacc.y:662 parser_yacc.y:669 parser_yacc.y:1130
#: parser_yacc.y:1166 parser_yacc.y:1170 parser_yacc.y:1180 parser_yacc.y:1190
#: parser_yacc.y:1298 parser_yacc.y:1376 parser_yacc.y:1479 parser_yacc.y:1490
#: parser_yacc.y:1565 parser_yacc.y:1583 parser_yacc.y:1590 parser_yacc.y:1639
#: ../network.c:314 ../af_unix.cc:203
msgid "Memory allocation error."
msgstr ""
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#, c-format
msgid "%s: Errors found in file. Aborting.\n"
msgstr ""
#: ../parser_misc.c:426 ../parser_misc.c:597 ../parser_misc.c:339
msgid ""
"Uppercase qualifiers \"RWLIMX\" are deprecated, please convert to lowercase\n"
"See the apparmor.d(5) manpage for details.\n"
msgstr ""
#: ../parser_misc.c:467 ../parser_misc.c:474 ../parser_misc.c:638
#: ../parser_misc.c:645 ../parser_misc.c:380 ../parser_misc.c:387
msgid "Conflict 'a' and 'w' perms are mutually exclusive."
msgstr ""
#: ../parser_misc.c:491 ../parser_misc.c:662 ../parser_misc.c:404
msgid "Exec qualifier 'i' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:502 ../parser_misc.c:673 ../parser_misc.c:415
#, c-format
msgid ""
"Unconfined exec qualifier (%c%c) allows some dangerous environment variables "
"to be passed to the unconfined process; 'man 5 apparmor.d' for details.\n"
msgstr ""
#: ../parser_misc.c:510 ../parser_misc.c:551 ../parser_misc.c:681
#: ../parser_misc.c:722 ../parser_misc.c:423 ../parser_misc.c:464
#, c-format
msgid "Exec qualifier '%c' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:537 ../parser_misc.c:545 ../parser_misc.c:708
#: ../parser_misc.c:716 ../parser_misc.c:450 ../parser_misc.c:458
#, c-format
msgid ""
"Exec qualifier '%c%c' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:593 ../parser_misc.c:764 ../parser_misc.c:506
#, c-format
msgid "Internal: unexpected mode character '%c' in input"
msgstr ""
#: ../parser_misc.c:615 ../parser_misc.c:786 ../parser_misc.c:528
#, c-format
msgid "Internal error generated invalid perm 0x%llx\n"
msgstr ""
#: ../parser_misc.c:865 ../parser_symtab.c:561 ../parser_regex.c:626
#: ../parser_variable.c:229
#, c-format
msgid "AppArmor parser error: %s\n"
msgstr ""
#: ../parser_merge.c:92 ../parser_merge.c:91 ../parser_merge.c:83
msgid "Couldn't merge entries. Out of Memory\n"
msgstr ""
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr ""
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
msgid "Failed to create alias %s -> %s\n"
msgstr ""
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr ""
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr ""
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
msgstr ""
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552
#, c-format
msgid "Invalid profile flag: %s."
msgstr ""
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
msgid "Assert: `rule' returned NULL."
msgstr ""
#: parser_yacc.y:501 parser_yacc.y:546 parser_yacc.y:552 parser_yacc.y:584
#: parser_yacc.y:598 parser_yacc.y:630
msgid ""
"Invalid mode, in deny rules 'x' must not be preceded by exec qualifier 'i', "
"'p', or 'u'"
msgstr ""
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602
msgid ""
"Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', 'c', or 'u'"
msgstr ""
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633
msgid "Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', or 'u'"
msgstr ""
#: parser_yacc.y:574 parser_yacc.y:612 parser_yacc.y:614 parser_yacc.y:660
msgid "Assert: `network_rule' return invalid protocol."
msgstr ""
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr ""
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
msgstr ""
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr ""
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
msgid "Unset boolean variable %s used in if-expression"
msgstr ""
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092
msgid "unsafe rule missing exec permissions"
msgstr ""
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060
msgid "subset can only be used with link rules."
msgstr ""
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062
msgid "link and exec perms conflict on a file rule using ->"
msgstr ""
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064
msgid "link perms are not allowed on a named profile transition.\n"
msgstr ""
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109
#, c-format
msgid "missing an end of line character? (entry: %s)"
msgstr ""
#: parser_yacc.y:975 parser_yacc.y:985 parser_yacc.y:1057 parser_yacc.y:1067
#: parser_yacc.y:1145 parser_yacc.y:1155
msgid "Invalid network entry."
msgstr ""
#: parser_yacc.y:1039 parser_yacc.y:1048 parser_yacc.y:1254 parser_yacc.y:1510
#, c-format
msgid "Invalid capability %s."
msgstr ""
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
msgid "%s: Illegal open {, nesting groupings not allowed\n"
msgstr ""
#: ../parser_regex.c:265 ../parser_regex.c:274 ../parser_regex.c:278
#, c-format
msgid "%s: Regex grouping error: Invalid number of items between {}\n"
msgstr ""
#: ../parser_regex.c:271 ../parser_regex.c:280 ../parser_regex.c:284
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close }, no matching open { detected\n"
msgstr ""
#: ../parser_regex.c:337 ../parser_regex.c:343 ../parser_regex.c:361
#, c-format
msgid ""
"%s: Regex grouping error: Unclosed grouping or character class, expecting "
"close }\n"
msgstr ""
#: ../parser_regex.c:351 ../parser_regex.c:357
#, c-format
msgid "%s: Internal buffer overflow detected, %d characters exceeded\n"
msgstr ""
#: ../parser_regex.c:355 ../parser_regex.c:361 ../parser_regex.c:377
#, c-format
msgid "%s: Unable to parse input line '%s'\n"
msgstr ""
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#, c-format
msgid "ERROR merging rules for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:234
#, c-format
msgid ""
"ERROR profile %s contains policy elements not usable with this kernel:\n"
"\t'*', '?', character ranges, and alternations are not allowed.\n"
"\t'**' may only be used at the end of a rule.\n"
msgstr ""
#: ../parser_policy.c:279 ../parser_policy.c:359 ../parser_policy.c:332
#, c-format
msgid "ERROR processing regexs for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:306 ../parser_policy.c:389 ../parser_policy.c:362
#, c-format
msgid "ERROR expanding variables for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:390 ../parser_policy.c:382 ../parser_policy.c:355
#, c-format
msgid "ERROR adding hat access rule for profile %s\n"
msgstr ""
#: ../parser_policy.c:490 ../parser_policy.c:271
#, c-format
msgid "ERROR in profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:675
#, c-format
msgid "%s: Errors found during postprocessing. Aborting.\n"
msgstr ""
#: ../parser_policy.c:682 ../parser_policy.c:704
#, c-format
msgid "%s: Errors found during regex postprocess. Aborting.\n"
msgstr ""
#: ../parser_policy.c:689
#, c-format
msgid "%s: Errors found during postprocess. Aborting.\n"
msgstr ""
#: ../parser_policy.c:696
#, c-format
msgid "%s: Errors found in combining rules postprocessing. Aborting.\n"
msgstr ""
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
msgid "Can't create cache directory: %s\n"
msgstr ""
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
msgid "Can't update cache directory: %s\n"
msgstr ""
#: ../parser_misc.c:833
#, c-format
msgid "Internal: unexpected DBus mode character '%c' in input"
msgstr ""
#: ../parser_misc.c:857
#, c-format
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr ""
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr ""
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr ""
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr ""
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr ""
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr ""
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr ""
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr ""
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr ""
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr ""
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr ""
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr ""
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr ""
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr ""

View File

@@ -8,33 +8,33 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2024-09-14 11:03+0000\n"
"Last-Translator: Walter Garcia-Fontes <walter.garcia@upf.edu>\n"
"PO-Revision-Date: 2013-11-15 01:59+0000\n"
"Last-Translator: Christian Boltz <Unknown>\n"
"Language-Team: Catalan\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2024-09-15 07:16+0000\n"
"X-Generator: Launchpad (build 1b1ed1ad2dbfc71ee62b5c5491c975135a771bf0)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:32+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: ca\n"
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "Error: Sense memòria.\n"
msgstr ""
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr "Error: basedir %s no és un directori, s'omet.\n"
msgstr ""
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr "Error: no s'ha pogut afegir el directori %s al camí de cerca.\n"
msgstr ""
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "Error: no s'ha pogut assignar memòria.\n"
msgstr ""
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
msgid "Bad write position\n"
@@ -50,7 +50,7 @@ msgstr "Sense memòria\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "No s'ha pogut copiar el perfil: adreça de memòria incorrecta\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
msgid "Profile doesn't conform to protocol\n"
@@ -62,7 +62,7 @@ msgstr "El perfil no coincideix amb la signatura\n"
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
msgid "Profile version not supported by Apparmor module\n"
msgstr "La versió del perfil no és compatible amb el mòdul Apparmor\n"
msgstr ""
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
msgid "Profile already exists\n"
@@ -75,13 +75,11 @@ msgstr "El perfil no existeix\n"
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr ""
"S'ha denegat el permís; s'ha intentat carregar un perfil mentre està "
"confinat?\n"
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "Error desconegut (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
@@ -111,7 +109,7 @@ msgstr "%s: no es pot escriure a l'stdout\n"
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: no s'ha pogut escriure al fitxer de sortida\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
@@ -149,11 +147,11 @@ msgstr ""
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr "el perfil %s de les regles de xarxa no està obligat\n"
msgstr ""
#: ../parser_interface.c:666
msgid "Unknown pattern type\n"
msgstr "Tipus de patró desconegut\n"
msgstr ""
#: ../parser_interface.c:750 ../parser_interface.c:902
#: ../parser_interface.c:743 ../parser_interface.c:894
@@ -166,13 +164,13 @@ msgstr "No es pot obrir %s - %s\n"
#: ../parser_interface.c:543
#, c-format
msgid "Memory Allocation Error: Unable to remove ^%s\n"
msgstr "Error d'assignació de memòria: no es pot eliminar ^%s\n"
msgstr ""
#: ../parser_interface.c:789 ../parser_interface.c:781
#: ../parser_interface.c:556
#, c-format
msgid "Memory Allocation Error: Unable to remove %s:%s."
msgstr "Error d'assignació de memòria: no es pot eliminar %s:%s."
msgstr ""
#: ../parser_interface.c:810 ../parser_interface.c:802
msgid "unable to create work area\n"
@@ -195,32 +193,31 @@ msgstr "%s: no es pot escriure tota l'entrada del perfil\n"
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr ""
"%s: No s'ha pogut escriure l'entrada de perfil sencera a la memòria cau\n"
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr "No s'ha pogut obrir «%s»"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr "ha fallat fstat per a «%s»"
msgstr ""
#: parser_lex.l:121
#, c-format
msgid "opendir failed '%s'"
msgstr "opendir ha fallat «%s»"
msgstr ""
#: parser_lex.l:152
#, c-format
msgid "stat failed for '%s'"
msgstr "stat ha fallat per a «%s»"
msgstr ""
#: parser_lex.l:155 parser_lex.l:133 parser_lex.l:139
#, c-format
msgid "Could not open '%s' in '%s'"
msgstr "No s'ha pogut obrir «%s» a «%s»"
msgstr ""
#: parser_lex.l:284 parser_lex.l:322 parser_lex.l:362 parser_lex.l:399
#: parser_lex.l:469 parser_lex.l:655 parser_lex.l:586 parser_lex.l:638
@@ -230,17 +227,17 @@ msgstr "S'ha trobat un caràcter inesperat: '%s'"
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr "Les declaracions de variables no accepten comes finals"
msgstr ""
#: parser_lex.l:420
#, c-format
msgid "(network_mode) Found unexpected character: '%s'"
msgstr "(networkmode) S'ha trobat un caràcter inesperat: «%s»"
msgstr ""
#: ../parser_main.c:333 ../parser_common.c:61 ../parser_common.c:106
#, c-format
msgid "Warning from %s (%s%sline %d): %s"
msgstr "Avís de %s (%s%slínia %d): %s"
msgstr ""
#: ../parser_main.c:531
#, c-format
@@ -255,8 +252,6 @@ msgid ""
"Warning: unable to find a suitable fs in %s, is it mounted?\n"
"Use --subdomainfs to override.\n"
msgstr ""
"Avís: no s'ha pogut trobar un fs adequat a %s, està muntat?\n"
"Utilitzeu --subdomainfs per a substituir.\n"
#: ../parser_main.c:597 ../parser_main.c:635 ../parser_main.c:498
#, c-format
@@ -264,8 +259,6 @@ msgid ""
"%s: Sorry. You need root privileges to run this program.\n"
"\n"
msgstr ""
"%s: Ho sento. Necessiteu privilegis de root per a executar aquest programa.\n"
"\n"
#: ../parser_main.c:604 ../parser_main.c:642 ../parser_main.c:505
#, c-format
@@ -274,16 +267,12 @@ msgid ""
"Anybody who can run this program can update your AppArmor profiles.\n"
"\n"
msgstr ""
"%s: Avís! Heu establert el setuid d'aquest programa a root.\n"
"Qualsevol persona que pugui executar aquest programa pot actualitzar els "
"perfils de l'AppArmor.\n"
"\n"
#: ../parser_main.c:704 ../parser_main.c:813 ../parser_main.c:836
#: ../parser_main.c:946 ../parser_main.c:860
#, c-format
msgid "Error: Could not read profile %s: %s.\n"
msgstr "Error: no s'ha pogut llegir el perfil %s: %s.\n"
msgstr ""
#: ../parser_main.c:718 ../parser_misc.c:270 parser_yacc.y:227
#: parser_yacc.y:374 parser_yacc.y:386 parser_yacc.y:484 parser_yacc.y:586
@@ -309,12 +298,12 @@ msgstr "S'ha produït un error d'assignació de memòria."
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr "La càrrega a la memòria cau ha estat correcta per a «%s».\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr "S'ha recarregat a la memòria cau amb èxit per a «%s».\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#, c-format
@@ -326,14 +315,11 @@ msgid ""
"Uppercase qualifiers \"RWLIMX\" are deprecated, please convert to lowercase\n"
"See the apparmor.d(5) manpage for details.\n"
msgstr ""
"Els classificadors «RWLIMX» en majúscules estan obsolets, si us plau "
"convertiu-los a minúscules\n"
"Vegeu la pàgina del manual apparmor.d(5) per a més detalls.\n"
#: ../parser_misc.c:467 ../parser_misc.c:474 ../parser_misc.c:638
#: ../parser_misc.c:645 ../parser_misc.c:380 ../parser_misc.c:387
msgid "Conflict 'a' and 'w' perms are mutually exclusive."
msgstr "Els perms del conflicte «a» i «w» són mútuament excloents."
msgstr ""
#: ../parser_misc.c:491 ../parser_misc.c:662 ../parser_misc.c:404
msgid "Exec qualifier 'i' invalid, conflicting qualifier already specified"
@@ -347,17 +333,12 @@ msgid ""
"Unconfined exec qualifier (%c%c) allows some dangerous environment variables "
"to be passed to the unconfined process; 'man 5 apparmor.d' for details.\n"
msgstr ""
"El qualificador d'exec no confiat (%c%c) permet passar algunes variables "
"d'entorn perilloses al procés no confiat; «man 5 apparmor.d» per als "
"detalls.\n"
#: ../parser_misc.c:510 ../parser_misc.c:551 ../parser_misc.c:681
#: ../parser_misc.c:722 ../parser_misc.c:423 ../parser_misc.c:464
#, c-format
msgid "Exec qualifier '%c' invalid, conflicting qualifier already specified"
msgstr ""
"El qualificador d'execució «%c» no és vàlid, ja s'ha especificat un "
"qualificador conflictiu"
#: ../parser_misc.c:537 ../parser_misc.c:545 ../parser_misc.c:708
#: ../parser_misc.c:716 ../parser_misc.c:450 ../parser_misc.c:458
@@ -365,24 +346,22 @@ msgstr ""
msgid ""
"Exec qualifier '%c%c' invalid, conflicting qualifier already specified"
msgstr ""
"El qualificador d'execució «%c%c» no és vàlid, ja s'ha especificat un "
"qualificador conflictiu"
#: ../parser_misc.c:593 ../parser_misc.c:764 ../parser_misc.c:506
#, c-format
msgid "Internal: unexpected mode character '%c' in input"
msgstr "Intern: el caràcter de mode «%c» no és esperat a l'entrada"
msgstr ""
#: ../parser_misc.c:615 ../parser_misc.c:786 ../parser_misc.c:528
#, c-format
msgid "Internal error generated invalid perm 0x%llx\n"
msgstr "Error intern generat un perm 0x%llx no vàlid\n"
msgstr ""
#: ../parser_misc.c:865 ../parser_symtab.c:561 ../parser_regex.c:626
#: ../parser_variable.c:229
#, c-format
msgid "AppArmor parser error: %s\n"
msgstr "Error de l'analitzador AppArmor: %s\n"
msgstr ""
#: ../parser_merge.c:92 ../parser_merge.c:91 ../parser_merge.c:83
msgid "Couldn't merge entries. Out of Memory\n"
@@ -391,56 +370,47 @@ msgstr "No s'han pogut fusionar les entrades. Sense memòria\n"
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr "perfil %s: té la regla fusionada %s amb modificadors X conflictius\n"
msgstr ""
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
msgstr "L'adjunt del perfil ha de començar amb una «/»."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
"Els noms de perfil han de començar amb un '/', espai de noms o paraula clau "
"'profile' o 'hat'."
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
msgid "Failed to create alias %s -> %s\n"
msgstr "No s'ha pogut crear l'àlies %s -> %s\n"
msgstr ""
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
"L'indicador de perfil chrootrelative entra en conflicte amb "
"namespace_relative"
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr ""
"L'indicador del perfil mediate_deleted entre en conflicte amb "
"delegate_deleted"
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
"L'indicador de perfil attach_disconnected entra en conflicte amb "
"no_attach_disconnected"
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr ""
"El perfil de l'etiqueta chroot_attach entra en conflicte amb chroot_noattach"
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
msgstr "L'indicador de perfil «debug» ja no és vàlid."
msgstr ""
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552
#, c-format
msgid "Invalid profile flag: %s."
msgstr "Indicador de perfil no vàlid: %s."
msgstr ""
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
msgid "Assert: `rule' returned NULL."
@@ -452,29 +422,23 @@ msgid ""
"Invalid mode, in deny rules 'x' must not be preceded by exec qualifier 'i', "
"'p', or 'u'"
msgstr ""
"El mode no és vàlid, a les regles de denegació «x» no s'ha de precedir per "
"«i», «p» o «u»"
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602
msgid ""
"Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', 'c', or 'u'"
msgstr ""
"El mode no és vàlid, «x» ha d'anar precedit del qualificador «i», «p», «c» o "
"«u»"
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633
msgid "Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', or 'u'"
msgstr ""
"El mode no és vàlid, «x» ha d'anar precedit del qualificador exec «i», «p» o "
"«u»"
#: parser_yacc.y:574 parser_yacc.y:612 parser_yacc.y:614 parser_yacc.y:660
msgid "Assert: `network_rule' return invalid protocol."
msgstr "Assert: «network_rule» retorna un protocol no vàlid."
msgstr ""
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr "Confirmació: «change_profile» ha retornat NULL."
msgstr ""
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
@@ -482,32 +446,28 @@ msgstr "Confirmació: 'hat rule' ha retornat NULL."
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr "Confirmació: «local_profile rule» ha retornat NULL."
msgstr ""
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
msgid "Unset boolean variable %s used in if-expression"
msgstr ""
"No s'ha establert la variable booleana %s utilitzada a l'expressió if"
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092
msgid "unsafe rule missing exec permissions"
msgstr "manca permisos d'execució per a la regla insegura"
msgstr ""
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060
msgid "subset can only be used with link rules."
msgstr "el subconjunt només es pot utilitzar amb regles d'enllaç."
msgstr ""
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062
msgid "link and exec perms conflict on a file rule using ->"
msgstr ""
"l'enllaç i els permisos exec entren en conflicte amb una regla de fitxer "
"utilitzant ->"
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064
msgid "link perms are not allowed on a named profile transition.\n"
msgstr ""
"no es permeten permisos d'enllaç en una transició de perfil amb nom.\n"
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109
#, c-format
@@ -517,22 +477,22 @@ msgstr "falta un caràcter de final de línia? (entrada: %s)"
#: parser_yacc.y:975 parser_yacc.y:985 parser_yacc.y:1057 parser_yacc.y:1067
#: parser_yacc.y:1145 parser_yacc.y:1155
msgid "Invalid network entry."
msgstr "Entrada de xarxa no vàlida."
msgstr ""
#: parser_yacc.y:1039 parser_yacc.y:1048 parser_yacc.y:1254 parser_yacc.y:1510
#, c-format
msgid "Invalid capability %s."
msgstr "Capacitat no vàlida %s."
msgstr ""
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr "Error de l'analitzador AppArmor per a %s%s%s a la línia %d: %s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr "Error de l'analitzador AppArmor, %s%s línia %d: %s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
@@ -561,8 +521,6 @@ msgid ""
"%s: Regex grouping error: Unclosed grouping or character class, expecting "
"close }\n"
msgstr ""
"%s: error d'agrupament d'expressions regulars: agrupació sense tancar o "
"classe de caràcters, esperant tancar }\n"
#: ../parser_regex.c:351 ../parser_regex.c:357
#, c-format
@@ -580,14 +538,11 @@ msgstr "%s: no es pot analitzar la línia d'entrada '%s'\n"
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr ""
"%s: el nom del perfil «%s» no és vàlid - expressió regular incorrecta\n"
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#, c-format
msgid "ERROR merging rules for profile %s, failed to load\n"
msgstr ""
"S'ha produït un ERROR en fusionar les regles per al perfil %s, no s'ha pogut "
"carregar\n"
#: ../parser_policy.c:234
#, c-format
@@ -596,28 +551,21 @@ msgid ""
"\t'*', '?', character ranges, and alternations are not allowed.\n"
"\t'**' may only be used at the end of a rule.\n"
msgstr ""
"El perfil d'ERROR %s conté elements de política no usables amb aquest "
"nucli:\n"
"\t'*', '?', intervals de caràcters i alternances no estan permesos.\n"
"\t«**» només es pot utilitzar al final d'una regla.\n"
#: ../parser_policy.c:279 ../parser_policy.c:359 ../parser_policy.c:332
#, c-format
msgid "ERROR processing regexs for profile %s, failed to load\n"
msgstr ""
"S'ha produït un ERROR en processar les expressions regulars del perfil %s, "
"no s'ha pogut carregar\n"
#: ../parser_policy.c:306 ../parser_policy.c:389 ../parser_policy.c:362
#, c-format
msgid "ERROR expanding variables for profile %s, failed to load\n"
msgstr ""
"ERROR en expandir les variables del perfil %s, no s'ha pogut carregar\n"
#: ../parser_policy.c:390 ../parser_policy.c:382 ../parser_policy.c:355
#, c-format
msgid "ERROR adding hat access rule for profile %s\n"
msgstr "ERROR en afegir la regla d'accés al barret per al perfil %s\n"
msgstr ""
#: ../parser_policy.c:490 ../parser_policy.c:271
#, c-format
@@ -628,20 +576,16 @@ msgstr "ERROR al perfil %s, no s'ha pogut carregar\n"
#, c-format
msgid "%s: Errors found during postprocessing. Aborting.\n"
msgstr ""
"%s: S'han trobat errors durant el postprocessament. S'està avortant.\n"
#: ../parser_policy.c:682 ../parser_policy.c:704
#, c-format
msgid "%s: Errors found during regex postprocess. Aborting.\n"
msgstr ""
"%s: S'han trobat errors durant el postprocés de l'expressió regular. S'està "
"avortant.\n"
#: ../parser_policy.c:689
#, c-format
msgid "%s: Errors found during postprocess. Aborting.\n"
msgstr ""
"%s: S'han trobat errors durant el postprocessament. S'està avortant.\n"
#: ../parser_policy.c:696
#, c-format
@@ -653,171 +597,161 @@ msgstr ""
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr "No s'ha pogut processar el directori d'inclusió «%s» a «%s»"
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr "Memòria intermèdia de funcions plena."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "Sense memòria"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
msgid "Can't create cache directory: %s\n"
msgstr "No es pot crear el directori de la memòria cau: %s\n"
msgstr ""
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr "Fitxer a la ubicació del directori de la memòria cau: %s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
msgid "Can't update cache directory: %s\n"
msgstr "No es pot actualitzar el directori de la memòria cau: %s\n"
msgstr ""
#: ../parser_misc.c:833
#, c-format
msgid "Internal: unexpected DBus mode character '%c' in input"
msgstr "Intern: el caràcter «%c» del mode DBus no és esperat a l'entrada"
msgstr ""
#: ../parser_misc.c:857
#, c-format
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr "S'ha produït un error intern al DBus perm 0x%x no vàlid\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr "no es permet el prefix de denegació"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr "no es permet el prefix del propietari"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr "el prefix propietari no permet les regles de muntatge"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr "el prefix del propietari no permet a les regles de dbus"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr "el prefix del propietari no permet les regles de capacitat"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr "el muntatge condicional %s%s no és vàlid"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr "regla de muntatge incorrecta"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr "les condicions del punt de muntatge no són compatibles actualment"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr "la condició «%s» de l'arrel dinàmica no és vàlida"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
"%s: error d'agrupament d'expressions regulars: tancament invàlid ], no s'ha "
"trobat cap obert coincident [ detectat\n"
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
"%s: Error d'agrupament d'expressions regulars: s'ha superat la imbricació "
"màxima de {}\n"
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
"S'ha produït un error en processar les regles policydb per al perfil %s, no "
"s'ha pogut carregar\n"
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr ""
"ERROR en substituir els àlies del perfil %s, no s'ha pogut carregar\n"
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr "%s: no s'ha pogut escriure %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr ""
"Error: no s'ha pogut llegir el perfil binari o el fitxer de memòria cau %s: "
"%s.\n"
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr ""
"Error: no s'ha pogut llegir el fitxer de la memòria cau «%s», s'omet...\n"
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr "Intern: al mode %s el caràcter «%c» no és l'esperat"
msgstr ""
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr "Error intern generat no vàlid %s perm 0x%x\n"
msgstr ""
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr "no es permet el prefix del propietari a les regles de muntatge"
msgstr ""
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr "no es permet el prefix del propietari a les regles de dbus"
msgstr ""
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr "no es permet el prefix del propietari a les regles del senyal"
msgstr ""
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr "no es permet el prefix del propietari a les regles «ptrace»"
msgstr ""
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr "no es permet el prefix del propietari a les regles unix"
msgstr ""
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr "no es permet el prefix del propietari a les regles de capacitat"
msgstr ""
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr "regla dbus: el grup condicional %s()() no és vàlid"
msgstr ""
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr "regla unix: el grup condicional %s()() no és vàlid"
msgstr ""
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr "%s: error d'expressió regular: caràcter d'escapament «\\» al final\n"
msgstr ""

View File

@@ -6,142 +6,130 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2022-03-10 18:26+0000\n"
"Last-Translator: Marek Hladík <mhladik@seznam.cz>\n"
"PO-Revision-Date: 2013-11-15 02:07+0000\n"
"Last-Translator: Novell Language <Unknown>\n"
"Language-Team: Novell Language <language@novell.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2022-03-11 06:22+0000\n"
"X-Generator: Launchpad (build 61f4697954ab70d633d14d8ceecff69a20b08a6b)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:32+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: cs\n"
#: ../parser_include.c:113 ../parser_include.c:111 ../parser_include.c:96
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "Chyba: Nedostatek paměti\n"
#: ../parser_include.c:123 ../parser_include.c:121 ../parser_include.c:106
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr "Chyba: Základní adresář %s není adresář, přeskakuje se.\n"
#: ../parser_include.c:137 ../parser_include.c:122
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr "Chyba: Adresář %s nelze přidat ke hledané cestě.\n"
#: ../parser_include.c:147 ../parser_include.c:151 ../parser_include.c:136
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "Chyba: Nelze přidělit paměť\n"
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
#: ../parser_interface.c:52
msgid "Bad write position\n"
msgstr "Špatná pozice zápisu\n"
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
#: ../parser_interface.c:55
msgid "Permission denied\n"
msgstr "Oprávnění odepřeno\n"
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
#: ../parser_interface.c:58
msgid "Out of memory\n"
msgstr "Nedostatek paměti\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
#: ../parser_interface.c:61
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "Nelze zkopírovat profil: Špatná adresa paměti\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
#: ../parser_interface.c:64
msgid "Profile doesn't conform to protocol\n"
msgstr "Profil neodpovídá protokolu\n"
#: ../parser_interface.c:84 ../parser_interface.c:87 ../parser_interface.c:64
#: ../parser_interface.c:67
msgid "Profile does not match signature\n"
msgstr "Profil neodpovídá podpisu\n"
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
#: ../parser_interface.c:70
msgid "Profile version not supported by Apparmor module\n"
msgstr "Modul Apparmor nepodporuje verzi profilu.\n"
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
#: ../parser_interface.c:73
msgid "Profile already exists\n"
msgstr "Profil již existuje\n"
#: ../parser_interface.c:93 ../parser_interface.c:96 ../parser_interface.c:73
#: ../parser_interface.c:76
msgid "Profile doesn't exist\n"
msgstr "Profil neexistuje\n"
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
#: ../parser_interface.c:79
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr "Přístup odepřen. Pokoušíte se načíst profil, i přes jistá omezeni?\n"
msgstr ""
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#: ../parser_interface.c:82
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "Neznámá chyba (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119 ../parser_interface.c:96
#: ../parser_interface.c:100
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
#, c-format
msgid "%s: Unable to add \"%s\". "
msgstr "%s: Nelze přidat \"%s\". "
#: ../parser_interface.c:121 ../parser_interface.c:124
#: ../parser_interface.c:101 ../parser_interface.c:105
#: ../parser_interface.c:101
#, c-format
msgid "%s: Unable to replace \"%s\". "
msgstr "%s: Nelze nahradit \"%s\". "
#: ../parser_interface.c:126 ../parser_interface.c:129
#: ../parser_interface.c:106 ../parser_interface.c:110
#: ../parser_interface.c:106
#, c-format
msgid "%s: Unable to remove \"%s\". "
msgstr "%s: Nelze odstranit \"%s\". "
#: ../parser_interface.c:131 ../parser_interface.c:134
#: ../parser_interface.c:111 ../parser_interface.c:115
#: ../parser_interface.c:111
#, c-format
msgid "%s: Unable to write to stdout\n"
msgstr "%s: nelze zapisovat na standardní výstup\n"
#: ../parser_interface.c:135 ../parser_interface.c:138
#: ../parser_interface.c:115 ../parser_interface.c:119
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: Nelze zapsat výstupní soubor\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
#: ../parser_interface.c:118 ../parser_interface.c:142
#: ../parser_interface.c:123 ../parser_interface.c:147
#, c-format
msgid "%s: ASSERT: Invalid option: %d\n"
msgstr "%s: ASSERT: neplatná volba: %d\n"
#: ../parser_interface.c:147 ../parser_interface.c:150
#: ../parser_interface.c:127 ../parser_interface.c:132
#: ../parser_interface.c:127
#, c-format
msgid "Addition succeeded for \"%s\".\n"
msgstr "Přidání uspělo pro \"%s\".\n"
#: ../parser_interface.c:151 ../parser_interface.c:154
#: ../parser_interface.c:131 ../parser_interface.c:136
#: ../parser_interface.c:131
#, c-format
msgid "Replacement succeeded for \"%s\".\n"
msgstr "Nahrazení uspělo pro \"%s\".\n"
#: ../parser_interface.c:155 ../parser_interface.c:158
#: ../parser_interface.c:135 ../parser_interface.c:140
#: ../parser_interface.c:135
#, c-format
msgid "Removal succeeded for \"%s\".\n"
msgstr "Odstranění uspělo pro \"%s\".\n"
@@ -152,14 +140,14 @@ msgid "PANIC bad increment buffer %p pos %p ext %p size %d res %p\n"
msgstr "PANIKA: chybný přírůstkový buffer %p pos %p ext %p size %d res %p\n"
#: ../parser_interface.c:656 ../parser_interface.c:658
#: ../parser_interface.c:446 ../parser_interface.c:476
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr "profilu %s nejsou vynucena síťová pravidla\n"
msgstr ""
#: ../parser_interface.c:666
msgid "Unknown pattern type\n"
msgstr "Neznámý typ vzoru\n"
msgstr ""
#: ../parser_interface.c:750 ../parser_interface.c:902
#: ../parser_interface.c:743 ../parser_interface.c:894
@@ -197,35 +185,35 @@ msgid "%s: Unable to write entire profile entry\n"
msgstr "%s: Nelze zapsat celý záznam profilu\n"
#: ../parser_interface.c:839 ../parser_interface.c:831
#: ../parser_interface.c:593 ../parser_interface.c:579
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr "%s: Nelze zapsat celý záznam profilu do mezipaměti\n"
msgstr ""
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr "Nelze otevřít '%s'"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173 parser_lex.l:174
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr "fstat selhal pro '%s'"
msgstr ""
#: parser_lex.l:121
#, c-format
msgid "opendir failed '%s'"
msgstr "opendir selhal '%s'"
msgstr ""
#: parser_lex.l:152
#, c-format
msgid "stat failed for '%s'"
msgstr "stat selhal pro '%s'"
msgstr ""
#: parser_lex.l:155 parser_lex.l:133 parser_lex.l:139
#, c-format
msgid "Could not open '%s' in '%s'"
msgstr "Nelze otevřít '%s' v '%s'"
msgstr ""
#: parser_lex.l:284 parser_lex.l:322 parser_lex.l:362 parser_lex.l:399
#: parser_lex.l:469 parser_lex.l:655 parser_lex.l:586 parser_lex.l:638
@@ -233,9 +221,9 @@ msgstr "Nelze otevřít '%s' v '%s'"
msgid "Found unexpected character: '%s'"
msgstr "Nalezen neočekávaný znak: '%s'"
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428 parser_lex.l:474
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr "U deklarace proměnných nejsou přípustné koncové čárky"
msgstr ""
#: parser_lex.l:420
#, c-format
@@ -245,7 +233,7 @@ msgstr "(režim_sítě) Nalezen neplatný znak: '%s'"
#: ../parser_main.c:333 ../parser_common.c:61 ../parser_common.c:106
#, c-format
msgid "Warning from %s (%s%sline %d): %s"
msgstr "Pozor na %s (%s%s řádku %d): %s"
msgstr ""
#: ../parser_main.c:531
#, c-format
@@ -253,7 +241,6 @@ msgid "%s: Could not allocate memory for subdomainbase mount point\n"
msgstr "%s: Nelze alokovat paměť pro bod připojení subdomainbase\n"
#: ../parser_main.c:577 ../parser_main.c:616 ../parser_main.c:479
#: ../parser_main.c:1444
#, c-format
msgid ""
"Warning: unable to find a suitable fs in %s, is it mounted?\n"
@@ -263,7 +250,6 @@ msgstr ""
"Možnost lze přepsat pomocí možnosti --subdomainfs.\n"
#: ../parser_main.c:597 ../parser_main.c:635 ../parser_main.c:498
#: ../parser_main.c:822
#, c-format
msgid ""
"%s: Sorry. You need root privileges to run this program.\n"
@@ -273,7 +259,6 @@ msgstr ""
"\n"
#: ../parser_main.c:604 ../parser_main.c:642 ../parser_main.c:505
#: ../parser_main.c:828
#, c-format
msgid ""
"%s: Warning! You've set this program setuid root.\n"
@@ -287,7 +272,7 @@ msgstr ""
"\n"
#: ../parser_main.c:704 ../parser_main.c:813 ../parser_main.c:836
#: ../parser_main.c:946 ../parser_main.c:860 ../parser_main.c:1038
#: ../parser_main.c:946 ../parser_main.c:860
#, c-format
msgid "Error: Could not read profile %s: %s.\n"
msgstr "Chyba: Nelze číst profil %s: %s.\n"
@@ -309,36 +294,26 @@ msgstr "Chyba: Nelze číst profil %s: %s.\n"
#: parser_yacc.y:1166 parser_yacc.y:1170 parser_yacc.y:1180 parser_yacc.y:1190
#: parser_yacc.y:1298 parser_yacc.y:1376 parser_yacc.y:1479 parser_yacc.y:1490
#: parser_yacc.y:1565 parser_yacc.y:1583 parser_yacc.y:1590 parser_yacc.y:1639
#: ../network.c:314 ../af_unix.cc:203 ../parser_misc.c:215 ../parser_misc.c:939
#: parser_yacc.y:343 parser_yacc.y:367 parser_yacc.y:533 parser_yacc.y:543
#: parser_yacc.y:660 parser_yacc.y:741 parser_yacc.y:750 parser_yacc.y:1171
#: parser_yacc.y:1219 parser_yacc.y:1255 parser_yacc.y:1264 parser_yacc.y:1268
#: parser_yacc.y:1278 parser_yacc.y:1288 parser_yacc.y:1382 parser_yacc.y:1460
#: parser_yacc.y:1592 parser_yacc.y:1597 parser_yacc.y:1674 parser_yacc.y:1692
#: parser_yacc.y:1699 parser_yacc.y:1748 ../network.c:315 ../af_unix.cc:194
#: ../network.c:314 ../af_unix.cc:203
msgid "Memory allocation error."
msgstr "Chyba alokace paměti."
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#: ../parser_main.c:975
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr "Načtení z mezipaměti pro „%s“ bylo úspěšné\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#: ../parser_main.c:979
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr "Opětovné načtení mezipaměti pro „%s“ bylo úspěšné\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#: ../parser_main.c:1132
#, c-format
msgid "%s: Errors found in file. Aborting.\n"
msgstr "%s: Chyby v souboru. Ukončuji.\n"
#: ../parser_misc.c:426 ../parser_misc.c:597 ../parser_misc.c:339
#: ../parser_misc.c:532
msgid ""
"Uppercase qualifiers \"RWLIMX\" are deprecated, please convert to lowercase\n"
"See the apparmor.d(5) manpage for details.\n"
@@ -349,19 +324,16 @@ msgstr ""
#: ../parser_misc.c:467 ../parser_misc.c:474 ../parser_misc.c:638
#: ../parser_misc.c:645 ../parser_misc.c:380 ../parser_misc.c:387
#: ../parser_misc.c:573 ../parser_misc.c:580
msgid "Conflict 'a' and 'w' perms are mutually exclusive."
msgstr "Oprávnění 'a' a 'w' se vzájemně vylučují."
#: ../parser_misc.c:491 ../parser_misc.c:662 ../parser_misc.c:404
#: ../parser_misc.c:597
msgid "Exec qualifier 'i' invalid, conflicting qualifier already specified"
msgstr ""
"Exec kvalifikátor 'i' je neplatný, byl již specifikován konfliktní "
"kvalifikátor"
#: ../parser_misc.c:502 ../parser_misc.c:673 ../parser_misc.c:415
#: ../parser_misc.c:608
#, c-format
msgid ""
"Unconfined exec qualifier (%c%c) allows some dangerous environment variables "
@@ -373,7 +345,6 @@ msgstr ""
#: ../parser_misc.c:510 ../parser_misc.c:551 ../parser_misc.c:681
#: ../parser_misc.c:722 ../parser_misc.c:423 ../parser_misc.c:464
#: ../parser_misc.c:616 ../parser_misc.c:657
#, c-format
msgid "Exec qualifier '%c' invalid, conflicting qualifier already specified"
msgstr ""
@@ -382,7 +353,6 @@ msgstr ""
#: ../parser_misc.c:537 ../parser_misc.c:545 ../parser_misc.c:708
#: ../parser_misc.c:716 ../parser_misc.c:450 ../parser_misc.c:458
#: ../parser_misc.c:643 ../parser_misc.c:651
#, c-format
msgid ""
"Exec qualifier '%c%c' invalid, conflicting qualifier already specified"
@@ -391,13 +361,11 @@ msgstr ""
"kvalifikátor"
#: ../parser_misc.c:593 ../parser_misc.c:764 ../parser_misc.c:506
#: ../parser_misc.c:699
#, c-format
msgid "Internal: unexpected mode character '%c' in input"
msgstr "Vnitřní: Neznámý znak režimu '%c' na vstupu."
#: ../parser_misc.c:615 ../parser_misc.c:786 ../parser_misc.c:528
#: ../parser_misc.c:721
#, c-format
msgid "Internal error generated invalid perm 0x%llx\n"
msgstr "Vnitřní chyba způsobila neplatné perm 0x%llx\n"
@@ -409,148 +377,137 @@ msgid "AppArmor parser error: %s\n"
msgstr "Chyba parseru AppArmor: %s\n"
#: ../parser_merge.c:92 ../parser_merge.c:91 ../parser_merge.c:83
#: ../parser_merge.c:71
msgid "Couldn't merge entries. Out of Memory\n"
msgstr "Nelze sloučit záznamy. Nedostatek paměti\n"
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#: ../parser_merge.c:93
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr "profil %s: bylo sloučeno pravidlo %s s konfliktními x modifikátory\n"
msgstr ""
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
msgstr "Příloha profilu musí začínat znakem '/'."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348 parser_yacc.y:407
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
"Názvy profilů musí začínat znakem '/', jmenným prostorem nebo klíčovým "
"slovem 'profile' nebo 'hat'."
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384 parser_yacc.y:449
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
msgid "Failed to create alias %s -> %s\n"
msgstr "Nelze vytvořit alias %s -> %s\n"
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506 parser_yacc.y:581
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
"Příznak profilu 'chroot_relative' je v konfliktu s 'namespace_relative'"
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510 parser_yacc.y:585
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr ""
"Příznak profilu 'mediate_deleted' je v konfliktu s 'delegate_deleted'"
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513 parser_yacc.y:588
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
"Příznak profilu 'connect_disconnected' je v konfliktu s "
"'no_attach_disconnected'"
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516 parser_yacc.y:591
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr "Příznak profilu 'chroot_attach' je v konfliktu s 'chroot_no_attach'"
msgstr ""
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530 parser_yacc.y:607
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
msgstr "Příznak profilu 'debug' již není platný."
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552 parser_yacc.y:629
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552
#, c-format
msgid "Invalid profile flag: %s."
msgstr "Neplatný příznak profilu: %s."
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
#: parser_yacc.y:673
msgid "Assert: `rule' returned NULL."
msgstr "Assert: `rule' vrátil NULL."
#: parser_yacc.y:501 parser_yacc.y:546 parser_yacc.y:552 parser_yacc.y:584
#: parser_yacc.y:598 parser_yacc.y:630 parser_yacc.y:677 parser_yacc.y:709
#: parser_yacc.y:598 parser_yacc.y:630
msgid ""
"Invalid mode, in deny rules 'x' must not be preceded by exec qualifier 'i', "
"'p', or 'u'"
msgstr ""
"Neplatný režim, před 'x' musí být exec kvalifikátor 'i', 'p' nebo 'u'"
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602 parser_yacc.y:681
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602
msgid ""
"Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', 'c', or 'u'"
msgstr ""
"Neplatný režim, před 'x' musí být exec kvalifikátor 'i', 'p', 'c' nebo 'u'"
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633 parser_yacc.y:712
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633
msgid "Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', or 'u'"
msgstr "Neplatný režim, před 'x' musí být kvalifikátor 'i', 'p' nebo 'u'."
#: parser_yacc.y:574 parser_yacc.y:612 parser_yacc.y:614 parser_yacc.y:660
#: parser_yacc.y:739
msgid "Assert: `network_rule' return invalid protocol."
msgstr "Assert: `pravidlo_sítě' vrací neplatný protokol."
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786 parser_yacc.y:867
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr "Assert: `změna_profilu' vrátila hodnotu NULL."
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810 parser_yacc.y:905
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
msgstr "Assert: 'hat rule' vrátil NULL."
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819 parser_yacc.y:914
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr "Assert: 'local_profile rule' vrátil NULL."
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992 parser_yacc.y:1077
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
msgid "Unset boolean variable %s used in if-expression"
msgstr "Ve výrazu 'if' byla použita nenastavená booleovská proměnná %s."
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092 parser_yacc.y:1181
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092
msgid "unsafe rule missing exec permissions"
msgstr "nebezpečné pravidlo nemá oprávnění ke spuštění"
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060 parser_yacc.y:1148
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060
msgid "subset can only be used with link rules."
msgstr "podskupina může být použita pouze s pravidly odkazů."
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062 parser_yacc.y:1150
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062
msgid "link and exec perms conflict on a file rule using ->"
msgstr "link a exec perms konflikt souboru pravidel používajícím ->"
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064 parser_yacc.y:1152
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064
msgid "link perms are not allowed on a named profile transition.\n"
msgstr "link perms nejsou povoleny na přechodu pojmenovaného profilu.\n"
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109 parser_yacc.y:1198
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109
#, c-format
msgid "missing an end of line character? (entry: %s)"
msgstr "chybí znak konce řádku? (záznam: %s)"
#: parser_yacc.y:975 parser_yacc.y:985 parser_yacc.y:1057 parser_yacc.y:1067
#: parser_yacc.y:1145 parser_yacc.y:1155 parser_yacc.y:1234 parser_yacc.y:1244
#: parser_yacc.y:1145 parser_yacc.y:1155
msgid "Invalid network entry."
msgstr "Neplatná položka sítě."
#: parser_yacc.y:1039 parser_yacc.y:1048 parser_yacc.y:1254 parser_yacc.y:1510
#: parser_yacc.y:1617
#, c-format
msgid "Invalid capability %s."
msgstr "Neplatná schopnost %s."
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525 parser_yacc.y:1637
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr "Chyba parseru AppArmor pro %s%s%s na řádku %d: %s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr "Chyba parseru AppArmor, %s%s řádek %d: %s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
@@ -558,13 +515,11 @@ msgid "%s: Illegal open {, nesting groupings not allowed\n"
msgstr "%s: nepovolená otvírací {, vnořené seskupování není povoleno\n"
#: ../parser_regex.c:265 ../parser_regex.c:274 ../parser_regex.c:278
#: ../parser_regex.c:306
#, c-format
msgid "%s: Regex grouping error: Invalid number of items between {}\n"
msgstr "%s: Chyba seskupování regex: neplatný počet položek mezi {}\n"
#: ../parser_regex.c:271 ../parser_regex.c:280 ../parser_regex.c:284
#: ../parser_regex.c:312
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close }, no matching open { detected\n"
@@ -573,7 +528,6 @@ msgstr ""
"otevírací {\n"
#: ../parser_regex.c:337 ../parser_regex.c:343 ../parser_regex.c:361
#: ../parser_regex.c:403
#, c-format
msgid ""
"%s: Regex grouping error: Unclosed grouping or character class, expecting "
@@ -588,19 +542,16 @@ msgid "%s: Internal buffer overflow detected, %d characters exceeded\n"
msgstr "%s: Detekováno vnitřní přetečení zásobníku, přesáhlo %d znaků\n"
#: ../parser_regex.c:355 ../parser_regex.c:361 ../parser_regex.c:377
#: ../parser_regex.c:419
#, c-format
msgid "%s: Unable to parse input line '%s'\n"
msgstr "%s: Nelze analyzovat vstupní řádku '%s'\n"
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#: ../parser_regex.c:487
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr "%s: Neplatné jméno profilu '%s' - špatný regulární výraz\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#: ../parser_policy.c:383
#, c-format
msgid "ERROR merging rules for profile %s, failed to load\n"
msgstr ""
@@ -618,7 +569,6 @@ msgstr ""
"\t'**' lze použít pouze na konci pravidla.\n"
#: ../parser_policy.c:279 ../parser_policy.c:359 ../parser_policy.c:332
#: ../parser_policy.c:340
#, c-format
msgid "ERROR processing regexs for profile %s, failed to load\n"
msgstr ""
@@ -626,14 +576,12 @@ msgstr ""
"načítání.\n"
#: ../parser_policy.c:306 ../parser_policy.c:389 ../parser_policy.c:362
#: ../parser_policy.c:370
#, c-format
msgid "ERROR expanding variables for profile %s, failed to load\n"
msgstr ""
"CHYBA při rozšíření proměnných pro profil %s, došlo k chybě při načítání.\n"
#: ../parser_policy.c:390 ../parser_policy.c:382 ../parser_policy.c:355
#: ../parser_policy.c:363
#, c-format
msgid "ERROR adding hat access rule for profile %s\n"
msgstr "Chyba při přidání pravidla pro přístup k hat pro profil %s\n"
@@ -665,170 +613,164 @@ msgid "%s: Errors found in combining rules postprocessing. Aborting.\n"
msgstr ""
"%s: Nalezeny chyby při postprocesingu kombinačních pravidel. Ukončuji.\n"
#: parser_lex.l:180 parser_lex.l:186 parser_lex.l:187
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr "Nelze zpracovat vloženého adresáře '%s' v '%s'"
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr "Vyrovnávací paměť pro funkce je plná."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041 ../parser_main.c:1332 ../parser_main.c:1354
#: ../parser_misc.c:280 ../parser_misc.c:299 ../parser_misc.c:308
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "Nedostatek paměti"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
msgid "Can't create cache directory: %s\n"
msgstr "Nelze vytvořit adresář mezipaměti: %s\n"
msgstr ""
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr "Soubor v adresáři mezipaměti: %s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
msgid "Can't update cache directory: %s\n"
msgstr "Nelze aktualizovat adresář mezipaměti: %s\n"
msgstr ""
#: ../parser_misc.c:833
#, c-format
msgid "Internal: unexpected DBus mode character '%c' in input"
msgstr "Interní: Neočekávaný znak '%c' režimu DBus na vstupu"
msgstr ""
#: ../parser_misc.c:857
#, c-format
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr "Interní chyba vygenerovaná neplatnou DBus perm 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621 parser_yacc.y:700
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr "deny prefix není povolen"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658 parser_yacc.y:737
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr "prefix vlastníka není povolen"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr "prefix vlastníka není povolen v pravidlech pro připojení"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr "prefix vlastníka není povolen v pravidlech dbus"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr "prefix vlastníka není povolen v pravidlech schopností"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613 parser_yacc.y:1722
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr "neplatná podmínka připojení %s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628 parser_yacc.y:1737
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr "špatné pravidlo připojení"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635 parser_yacc.y:1744
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr "podmínky přípojného bodu nejsou aktuálně podporovány"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650 parser_yacc.y:1759
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr "neplatný podmíněný pivotroot '%s'"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236 ../parser_regex.c:264
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
"%s: Chyba seskupení regulárních výrazů: Neplatné uzavření ], nebylo zjištěno "
"žádné odpovídající otevření [\n"
#: ../parser_regex.c:257 ../parser_regex.c:256 ../parser_regex.c:284
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
"%s: Chyba seskupení regulárních výrazů: Překročen maximální počet vnoření "
"{}\n"
#: ../parser_policy.c:366 ../parser_policy.c:339 ../parser_policy.c:347
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
"CHYBA zpracování pravidel policydb pro profil %s, načtení se nezdařilo\n"
#: ../parser_policy.c:396 ../parser_policy.c:369 ../parser_policy.c:377
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr "CHYBA při nahrazení aliasů pro profil %s, načtení se nezdařilo\n"
msgstr ""
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr "%s: Nelze zapsat %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr "Chyba: Nelze přečíst binární profil nebo soubor mezipaměti %s: %s.\n"
msgstr ""
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr "Chyba: Nelze přečíst soubor mezipaměti '%s', přeskočení...\n"
msgstr ""
#: ../parser_misc.c:575 ../parser_misc.c:768
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr "Interní: V režimu %s se na vstupu vyskytl neočekávaný znak '%c'"
msgstr ""
#: ../parser_misc.c:599 ../parser_misc.c:792
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr "Interní chyba vygenerovala neplatné %s perm 0x%x\n"
msgstr ""
#: parser_yacc.y:703 parser_yacc.y:784
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr "prefix vlastníka není v pravidlech připojení povolen"
msgstr ""
#: parser_yacc.y:720 parser_yacc.y:801
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr "prefix vlastníka není v pravidlech dbus povolen"
msgstr ""
#: parser_yacc.y:736 parser_yacc.y:817
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr "prefix vlastníka není v pravidlech signálu povolen"
msgstr ""
#: parser_yacc.y:752 parser_yacc.y:833
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr "prefix vlastníka není v pravidlech ptrace povolen"
msgstr ""
#: parser_yacc.y:768 parser_yacc.y:849 parser_yacc.y:869
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr "prefix vlastníka není v pravidlech unixu povolen"
msgstr ""
#: parser_yacc.y:794 parser_yacc.y:885
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr "prefix vlastníka není v pravidlech schopností povolen"
msgstr ""
#: parser_yacc.y:1293 parser_yacc.y:1377
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr "pravidlo dbus: neplatná podmíněná skupina %s=()"
msgstr ""
#: parser_yacc.y:1371 parser_yacc.y:1455
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr "unixové pravidlo: neplatná podmíněná skupina %s=()"
msgstr ""
#: ../parser_regex.c:368 ../parser_regex.c:410
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr "%s: Chyba regulárního výrazu: koncový znak escape '\\'\n"
msgstr ""

View File

@@ -6,38 +6,38 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2024-10-09 22:03+0000\n"
"Last-Translator: Rodrigo Lledó <rodhos92@gmail.com>\n"
"PO-Revision-Date: 2013-11-26 03:48+0000\n"
"Last-Translator: Monkey <monkey.libre@gmail.com>\n"
"Language-Team: Novell Language <language@novell.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2024-10-10 07:50+0000\n"
"X-Generator: Launchpad (build 6341c735b243a0768c3cb66edf85737937cab327)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:32+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: es\n"
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "Error: Memoria insuficiente.\n"
msgstr "Error: memoria insuficiente.\n"
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr "Error: el directorio base %s no es un directorio. Se omitido.\n"
msgstr "Error: el directorio base %s no es un directorio. Se va a omitir.\n"
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr ""
"Error: No se ha podido añadir el directorio %s a la ruta de búsqueda.\n"
"Error: no se ha podido añadir el directorio %s a la a de búsqueda.\n"
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "Error: la memoria no pudo ser asignada.\n"
msgstr "Error: no es posible asignar memoria.\n"
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
msgid "Bad write position\n"
msgstr "Escrito en el lugar equivocado.\n"
msgstr "Posición de escritura incorrecta\n"
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
msgid "Permission denied\n"
@@ -45,15 +45,15 @@ msgstr "Permiso denegado\n"
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
msgid "Out of memory\n"
msgstr "Sin memoria.\n"
msgstr "Memoria agotada\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "No se pudo copiar el perfil. Dirección de memoria incorrecta.\n"
msgstr "No se puede copiar el perfil. Dirección de memoria incorrecta\n"
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
msgid "Profile doesn't conform to protocol\n"
msgstr "El perfil no cumple el protocolo.\n"
msgstr "El perfil no se ajusta al protocolo\n"
#: ../parser_interface.c:84 ../parser_interface.c:87 ../parser_interface.c:64
msgid "Profile does not match signature\n"
@@ -61,7 +61,7 @@ msgstr "El perfil no coincide con la firma\n"
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
msgid "Profile version not supported by Apparmor module\n"
msgstr "Versión del perfil no compatible con el módulo Apparmor.\n"
msgstr "La versión del perfil no se admite en el módulo de Apparmor.\n"
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
msgid "Profile already exists\n"
@@ -73,7 +73,8 @@ msgstr "El perfil no existe\n"
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr "Permiso denegado. ¿Intentó cargar un perfil restringido?\n"
msgstr ""
"Permiso denegado. ¿Intentando cargar un perfil mientras estaba confinado?\n"
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#, c-format
@@ -139,7 +140,8 @@ msgstr "Eliminación correcta de \"%s\".\n"
#, c-format
msgid "PANIC bad increment buffer %p pos %p ext %p size %d res %p\n"
msgstr ""
"PÁNICO: error en el aumento del búfer %p pos %p ext %p size %d res %p\n"
"PANIC: incremento de buffer incorrecto; pos %p; ext %p; tamaño %p; res %d "
"%p\n"
#: ../parser_interface.c:656 ../parser_interface.c:658
#: ../parser_interface.c:446
@@ -184,18 +186,18 @@ msgstr "no es posible poner en serie el perfil %s\n"
#: ../parser_interface.c:582
#, c-format
msgid "%s: Unable to write entire profile entry\n"
msgstr "%s: no es posible escribir el acceso al perfil completo\n"
msgstr "%s: no es posible escribir todo el perfil\n"
#: ../parser_interface.c:839 ../parser_interface.c:831
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr "%s: no es posible escribir el acceso al perfil completo al caché\n"
msgstr "%s: Imposible escribir la entrada de perfil completa a la caché\n"
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr "No se pudo abrir «%s»"
msgstr "No se pudo abrir '%s'"
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
@@ -210,7 +212,7 @@ msgstr "opendir falló «%s»"
#: parser_lex.l:152
#, c-format
msgid "stat failed for '%s'"
msgstr "stat falló para «%s»"
msgstr ""
#: parser_lex.l:155 parser_lex.l:133 parser_lex.l:139
#, c-format
@@ -221,11 +223,11 @@ msgstr "No se pudo abrir «%s» en «%s»"
#: parser_lex.l:469 parser_lex.l:655 parser_lex.l:586 parser_lex.l:638
#, c-format
msgid "Found unexpected character: '%s'"
msgstr "Se ha detectado un carácter inesperado: «%s»"
msgstr "Se ha detectado un carácter inesperado: '%s'"
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr "Las declaraciones de variables no aceptan comas al final"
msgstr ""
#: parser_lex.l:420
#, c-format
@@ -235,7 +237,7 @@ msgstr "(network_mode) Se ha encontrado un carácter inesperado: %s"
#: ../parser_main.c:333 ../parser_common.c:61 ../parser_common.c:106
#, c-format
msgid "Warning from %s (%s%sline %d): %s"
msgstr "Aviso desde %s (%s%slínea %d): %s"
msgstr ""
#: ../parser_main.c:531
#, c-format
@@ -306,12 +308,12 @@ msgstr "Error de asignación de memoria."
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr "Se ha cargado caché con éxito para «%s».\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr "Se ha recargado caché con éxito para «%s».\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#, c-format
@@ -389,18 +391,15 @@ msgstr "No es posible fusionar las entradas. Memoria agotada\n"
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr ""
"el perfil %s: ha fusionado la regla %s con modificadores x en conflicto\n"
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
msgstr "El adjunto al perfil debe empezar con un «/»."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
"Los nombres del perfil deben empezar con un «/», espacio de nombre o palabra "
"clave «profile» o «hat»."
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
@@ -410,24 +409,19 @@ msgstr "Error al crear el alias %s -> %s\n"
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
"La marca del perfi chroot_relative está en conflicto con namespace_relative"
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr ""
"La marca del perfil mediate_deleted está en conflicto con delegate_deleted"
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
"La marca del perfil attach_disconnected está en conflicto con "
"no_attach_disconnected"
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr ""
"La marca del perfil chroot_attach está en conflicto con chroot_no_attach"
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
@@ -522,12 +516,12 @@ msgstr "Característica no válida %s."
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr "Error del analizador AppArmor para %s%s%s en la línea %d: %s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr "Error de análisis AppArmor,%s%s línea %d: %s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
@@ -571,7 +565,7 @@ msgstr "%s: no es posible analizar la línea de entrada '%s'\n"
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr "%s: nombre de perfil no válido «%s» - expresión regular incorrecta\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#, c-format
@@ -637,166 +631,161 @@ msgstr ""
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr "No se pudo procesar la inclusión del directorio «%s» en «%s»"
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr "Buffer de características lleno."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "Memoria agotada"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
msgid "Can't create cache directory: %s\n"
msgstr "No se puede crear el directorio de antememoria: %s\n"
msgstr ""
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr "Archivo en ubicación de directorio de caché: %s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
msgid "Can't update cache directory: %s\n"
msgstr "No se puede actualizar el directorio de caché: %s\n"
msgstr ""
#: ../parser_misc.c:833
#, c-format
msgid "Internal: unexpected DBus mode character '%c' in input"
msgstr "Interno: carácter de modo DBUS «%c» inesperado en entrada"
msgstr ""
#: ../parser_misc.c:857
#, c-format
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr "Error interno generado perm DBus no válido 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr "prefijo de denegación no permitido"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr "prefijo de propietario no permitido"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr "prefijo de propietario no permitido en reglas de montaje"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr "prefijo de propietario no permitido en reglas dbus"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr "prefijo de priopietario no permitido en reglas de capacidades"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr "condicional de montaje %s%s no válido"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr "regla de montaje errónea"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr "condiciones de punto de montaje actualmente no soportadas"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr "condicional pivotroot no válido «%s»"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
"%s: Error de agrupamiento regex: Cierre no válido ], no se detectó pareja de "
"apertura [\n"
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
"%s: Error de agrupamiento regex: Se excedió el máximo de anidado de {}\n"
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
"ERROR al procesar reglas policydb para el perfil %s, falló al cargar\n"
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr "ERROR al reemplazar aliases para el perfil %s, falló al cargar\n"
msgstr ""
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr "%s: no se pudo escribir %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr ""
"Error: no se pudo leer archivo de perfil binario o archivo de caché %s: %s.\n"
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr "Error: no se pudo leer archivo de caché «%s», omitiendo...\n"
msgstr ""
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr "Interno: modo inesperado %s carácter «%c» en la entrada"
msgstr ""
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr "Un error interno ha generado un %s perm no válido 0x%x\n"
msgstr ""
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr "prefijo de propietario no permitido en reglas de montaje"
msgstr ""
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr "prefijo de propietario no permitido en reglas de dbus"
msgstr ""
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr "prefijo de propietario no permitido en reglas de señal"
msgstr ""
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr "prefijo de propietario no permitido en reglas de ptrace"
msgstr ""
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr "prefijo de propietario no permitido en las reglas de Unix"
msgstr ""
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr "prefijo de propietario no permitido en las reglas de capacidad"
msgstr ""
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr "regla dbus: grupo condicional no válido %s=()"
msgstr ""
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr "regla unix: grupo condicional no válido %s=()"
msgstr ""
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr "%s: Error regex: arrastrando carácter de escape «\\»\n"
msgstr ""

View File

@@ -8,145 +8,132 @@ msgstr ""
"Project-Id-Version: apparmor\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2023-12-31 16:22+0000\n"
"Last-Translator: S.M.Mousavi <Unknown>\n"
"PO-Revision-Date: 2019-12-27 08:23+0000\n"
"Last-Translator: VahidNameni <Unknown>\n"
"Language-Team: Persian <fa@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2024-01-01 04:31+0000\n"
"X-Generator: Launchpad (build e1eeab5b20e19239bd7d5f36676f7a52988db88b)\n"
"X-Launchpad-Export-Date: 2019-12-28 05:38+0000\n"
"X-Generator: Launchpad (build bceb5ef013b87ef7aafe0755545ceb689ca7ac60)\n"
#: ../parser_include.c:113 ../parser_include.c:111 ../parser_include.c:96
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "خطا: خارج از حافظه.\n"
#: ../parser_include.c:123 ../parser_include.c:121 ../parser_include.c:106
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr "خطا: basedir %s یک شاخه نیست، در حال رد کردن.\n"
msgstr ""
#: ../parser_include.c:137 ../parser_include.c:122
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr "خطا: امکان اضافه کردن پوشه %s به مسیر جستجو نیست.\n"
#: ../parser_include.c:147 ../parser_include.c:151 ../parser_include.c:136
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "خطا: عدم توانایی تخصیص حافظه.\n"
msgstr ""
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
#: ../parser_interface.c:52
msgid "Bad write position\n"
msgstr "مکان نوشتن اشتباه\n"
msgstr ""
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
#: ../parser_interface.c:55
msgid "Permission denied\n"
msgstr "مجوز صادر نگردید\n"
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
#: ../parser_interface.c:58
msgid "Out of memory\n"
msgstr "خارج از حافظه\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
#: ../parser_interface.c:61
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "عدم توانایی رونوشت از نمایه: آدرس حافظه بد\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
#: ../parser_interface.c:64
msgid "Profile doesn't conform to protocol\n"
msgstr "نمایه با پروتکل مطابقت ندارد\n"
msgstr ""
#: ../parser_interface.c:84 ../parser_interface.c:87 ../parser_interface.c:64
#: ../parser_interface.c:67
msgid "Profile does not match signature\n"
msgstr "نمایه با امضا مطابقت ندارد\n"
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
#: ../parser_interface.c:70
msgid "Profile version not supported by Apparmor module\n"
msgstr "نسخه نمایه توسط ماژول Apparmor پشتیبانی نمی‌شود\n"
msgstr ""
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
#: ../parser_interface.c:73
msgid "Profile already exists\n"
msgstr "نمایه موجود است\n"
msgstr ""
#: ../parser_interface.c:93 ../parser_interface.c:96 ../parser_interface.c:73
#: ../parser_interface.c:76
msgid "Profile doesn't exist\n"
msgstr "نمایه موجود نیست\n"
msgstr ""
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
#: ../parser_interface.c:79
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr ""
"اجازه رد شد؛ آیا در حالیکه محدود هستید، سعی در بارگزاری یک نمایه کردید؟\n"
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#: ../parser_interface.c:82
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "خطای ناشناخته (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119 ../parser_interface.c:96
#: ../parser_interface.c:100
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
#, c-format
msgid "%s: Unable to add \"%s\". "
msgstr "%s: عدم توانایی اضافه کردن \"%s\". "
msgstr ""
#: ../parser_interface.c:121 ../parser_interface.c:124
#: ../parser_interface.c:101 ../parser_interface.c:105
#: ../parser_interface.c:101
#, c-format
msgid "%s: Unable to replace \"%s\". "
msgstr "%s: عدم توانایی جایگزینی \"%s\". "
msgstr ""
#: ../parser_interface.c:126 ../parser_interface.c:129
#: ../parser_interface.c:106 ../parser_interface.c:110
#: ../parser_interface.c:106
#, c-format
msgid "%s: Unable to remove \"%s\". "
msgstr "%s: عدم توانایی حذف \"%s\". "
msgstr ""
#: ../parser_interface.c:131 ../parser_interface.c:134
#: ../parser_interface.c:111 ../parser_interface.c:115
#: ../parser_interface.c:111
#, c-format
msgid "%s: Unable to write to stdout\n"
msgstr "%s: عدم توانایی نوشتن در stdout\n"
msgstr ""
#: ../parser_interface.c:135 ../parser_interface.c:138
#: ../parser_interface.c:115 ../parser_interface.c:119
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: عدم توانایی نوشتن در فایل خروجی\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
#: ../parser_interface.c:118 ../parser_interface.c:142
#: ../parser_interface.c:123 ../parser_interface.c:147
#, c-format
msgid "%s: ASSERT: Invalid option: %d\n"
msgstr ""
#: ../parser_interface.c:147 ../parser_interface.c:150
#: ../parser_interface.c:127 ../parser_interface.c:132
#: ../parser_interface.c:127
#, c-format
msgid "Addition succeeded for \"%s\".\n"
msgstr "اضافه کردن \"%s\" با موفقیت انجام شد.\n"
msgstr ""
#: ../parser_interface.c:151 ../parser_interface.c:154
#: ../parser_interface.c:131 ../parser_interface.c:136
#: ../parser_interface.c:131
#, c-format
msgid "Replacement succeeded for \"%s\".\n"
msgstr "جایگزینی \"%s\" با موفقیت انجام شد.\n"
msgstr ""
#: ../parser_interface.c:155 ../parser_interface.c:158
#: ../parser_interface.c:135 ../parser_interface.c:140
#: ../parser_interface.c:135
#, c-format
msgid "Removal succeeded for \"%s\".\n"
msgstr "حذف \"%s\" با موفقیت انجام شد.\n"
msgstr ""
#: ../parser_interface.c:251 ../parser_interface.c:254
#, c-format
@@ -154,33 +141,33 @@ msgid "PANIC bad increment buffer %p pos %p ext %p size %d res %p\n"
msgstr ""
#: ../parser_interface.c:656 ../parser_interface.c:658
#: ../parser_interface.c:446 ../parser_interface.c:476
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr ""
#: ../parser_interface.c:666
msgid "Unknown pattern type\n"
msgstr "نوع الگوی ناشناخته\n"
msgstr ""
#: ../parser_interface.c:750 ../parser_interface.c:902
#: ../parser_interface.c:743 ../parser_interface.c:894
#: ../parser_interface.c:518 ../parser_interface.c:669
#, c-format
msgid "Unable to open %s - %s\n"
msgstr "عدم توانایی بازکردن %s - %s\n"
msgstr ""
#: ../parser_interface.c:776 ../parser_interface.c:768
#: ../parser_interface.c:543
#, c-format
msgid "Memory Allocation Error: Unable to remove ^%s\n"
msgstr "خطای تخصیص حافظه: عدم توانایی حذف ^%s\n"
msgstr ""
#: ../parser_interface.c:789 ../parser_interface.c:781
#: ../parser_interface.c:556
#, c-format
msgid "Memory Allocation Error: Unable to remove %s:%s."
msgstr "خطای تخصیص حافظه: عدم توانایی حذف %s:%s."
msgstr ""
#: ../parser_interface.c:810 ../parser_interface.c:802
msgid "unable to create work area\n"
@@ -199,7 +186,7 @@ msgid "%s: Unable to write entire profile entry\n"
msgstr ""
#: ../parser_interface.c:839 ../parser_interface.c:831
#: ../parser_interface.c:593 ../parser_interface.c:579
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr ""
@@ -209,7 +196,7 @@ msgstr ""
msgid "Could not open '%s'"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173 parser_lex.l:174
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr ""
@@ -235,7 +222,7 @@ msgstr ""
msgid "Found unexpected character: '%s'"
msgstr ""
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428 parser_lex.l:474
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr ""
@@ -255,7 +242,6 @@ msgid "%s: Could not allocate memory for subdomainbase mount point\n"
msgstr ""
#: ../parser_main.c:577 ../parser_main.c:616 ../parser_main.c:479
#: ../parser_main.c:1444
#, c-format
msgid ""
"Warning: unable to find a suitable fs in %s, is it mounted?\n"
@@ -263,7 +249,6 @@ msgid ""
msgstr ""
#: ../parser_main.c:597 ../parser_main.c:635 ../parser_main.c:498
#: ../parser_main.c:822
#, c-format
msgid ""
"%s: Sorry. You need root privileges to run this program.\n"
@@ -271,7 +256,6 @@ msgid ""
msgstr ""
#: ../parser_main.c:604 ../parser_main.c:642 ../parser_main.c:505
#: ../parser_main.c:828
#, c-format
msgid ""
"%s: Warning! You've set this program setuid root.\n"
@@ -280,7 +264,7 @@ msgid ""
msgstr ""
#: ../parser_main.c:704 ../parser_main.c:813 ../parser_main.c:836
#: ../parser_main.c:946 ../parser_main.c:860 ../parser_main.c:1038
#: ../parser_main.c:946 ../parser_main.c:860
#, c-format
msgid "Error: Could not read profile %s: %s.\n"
msgstr ""
@@ -302,36 +286,26 @@ msgstr ""
#: parser_yacc.y:1166 parser_yacc.y:1170 parser_yacc.y:1180 parser_yacc.y:1190
#: parser_yacc.y:1298 parser_yacc.y:1376 parser_yacc.y:1479 parser_yacc.y:1490
#: parser_yacc.y:1565 parser_yacc.y:1583 parser_yacc.y:1590 parser_yacc.y:1639
#: ../network.c:314 ../af_unix.cc:203 ../parser_misc.c:215 ../parser_misc.c:939
#: parser_yacc.y:343 parser_yacc.y:367 parser_yacc.y:533 parser_yacc.y:543
#: parser_yacc.y:660 parser_yacc.y:741 parser_yacc.y:750 parser_yacc.y:1171
#: parser_yacc.y:1219 parser_yacc.y:1255 parser_yacc.y:1264 parser_yacc.y:1268
#: parser_yacc.y:1278 parser_yacc.y:1288 parser_yacc.y:1382 parser_yacc.y:1460
#: parser_yacc.y:1592 parser_yacc.y:1597 parser_yacc.y:1674 parser_yacc.y:1692
#: parser_yacc.y:1699 parser_yacc.y:1748 ../network.c:315 ../af_unix.cc:194
#: ../network.c:314 ../af_unix.cc:203
msgid "Memory allocation error."
msgstr ""
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#: ../parser_main.c:975
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#: ../parser_main.c:979
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#: ../parser_main.c:1132
#, c-format
msgid "%s: Errors found in file. Aborting.\n"
msgstr ""
#: ../parser_misc.c:426 ../parser_misc.c:597 ../parser_misc.c:339
#: ../parser_misc.c:532
msgid ""
"Uppercase qualifiers \"RWLIMX\" are deprecated, please convert to lowercase\n"
"See the apparmor.d(5) manpage for details.\n"
@@ -339,17 +313,14 @@ msgstr ""
#: ../parser_misc.c:467 ../parser_misc.c:474 ../parser_misc.c:638
#: ../parser_misc.c:645 ../parser_misc.c:380 ../parser_misc.c:387
#: ../parser_misc.c:573 ../parser_misc.c:580
msgid "Conflict 'a' and 'w' perms are mutually exclusive."
msgstr ""
#: ../parser_misc.c:491 ../parser_misc.c:662 ../parser_misc.c:404
#: ../parser_misc.c:597
msgid "Exec qualifier 'i' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:502 ../parser_misc.c:673 ../parser_misc.c:415
#: ../parser_misc.c:608
#, c-format
msgid ""
"Unconfined exec qualifier (%c%c) allows some dangerous environment variables "
@@ -358,27 +329,23 @@ msgstr ""
#: ../parser_misc.c:510 ../parser_misc.c:551 ../parser_misc.c:681
#: ../parser_misc.c:722 ../parser_misc.c:423 ../parser_misc.c:464
#: ../parser_misc.c:616 ../parser_misc.c:657
#, c-format
msgid "Exec qualifier '%c' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:537 ../parser_misc.c:545 ../parser_misc.c:708
#: ../parser_misc.c:716 ../parser_misc.c:450 ../parser_misc.c:458
#: ../parser_misc.c:643 ../parser_misc.c:651
#, c-format
msgid ""
"Exec qualifier '%c%c' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:593 ../parser_misc.c:764 ../parser_misc.c:506
#: ../parser_misc.c:699
#, c-format
msgid "Internal: unexpected mode character '%c' in input"
msgstr ""
#: ../parser_misc.c:615 ../parser_misc.c:786 ../parser_misc.c:528
#: ../parser_misc.c:721
#, c-format
msgid "Internal error generated invalid perm 0x%llx\n"
msgstr ""
@@ -390,12 +357,10 @@ msgid "AppArmor parser error: %s\n"
msgstr ""
#: ../parser_merge.c:92 ../parser_merge.c:91 ../parser_merge.c:83
#: ../parser_merge.c:71
msgid "Couldn't merge entries. Out of Memory\n"
msgstr ""
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#: ../parser_merge.c:93
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr ""
@@ -404,118 +369,115 @@ msgstr ""
msgid "Profile attachment must begin with a '/'."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348 parser_yacc.y:407
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384 parser_yacc.y:449
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
msgid "Failed to create alias %s -> %s\n"
msgstr ""
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506 parser_yacc.y:581
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510 parser_yacc.y:585
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr ""
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513 parser_yacc.y:588
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516 parser_yacc.y:591
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr ""
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530 parser_yacc.y:607
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
msgstr ""
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552 parser_yacc.y:629
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552
#, c-format
msgid "Invalid profile flag: %s."
msgstr ""
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
#: parser_yacc.y:673
msgid "Assert: `rule' returned NULL."
msgstr ""
#: parser_yacc.y:501 parser_yacc.y:546 parser_yacc.y:552 parser_yacc.y:584
#: parser_yacc.y:598 parser_yacc.y:630 parser_yacc.y:677 parser_yacc.y:709
#: parser_yacc.y:598 parser_yacc.y:630
msgid ""
"Invalid mode, in deny rules 'x' must not be preceded by exec qualifier 'i', "
"'p', or 'u'"
msgstr ""
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602 parser_yacc.y:681
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602
msgid ""
"Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', 'c', or 'u'"
msgstr ""
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633 parser_yacc.y:712
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633
msgid "Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', or 'u'"
msgstr ""
#: parser_yacc.y:574 parser_yacc.y:612 parser_yacc.y:614 parser_yacc.y:660
#: parser_yacc.y:739
msgid "Assert: `network_rule' return invalid protocol."
msgstr ""
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786 parser_yacc.y:867
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr ""
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810 parser_yacc.y:905
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
msgstr ""
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819 parser_yacc.y:914
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr ""
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992 parser_yacc.y:1077
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
msgid "Unset boolean variable %s used in if-expression"
msgstr ""
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092 parser_yacc.y:1181
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092
msgid "unsafe rule missing exec permissions"
msgstr ""
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060 parser_yacc.y:1148
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060
msgid "subset can only be used with link rules."
msgstr ""
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062 parser_yacc.y:1150
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062
msgid "link and exec perms conflict on a file rule using ->"
msgstr ""
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064 parser_yacc.y:1152
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064
msgid "link perms are not allowed on a named profile transition.\n"
msgstr ""
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109 parser_yacc.y:1198
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109
#, c-format
msgid "missing an end of line character? (entry: %s)"
msgstr ""
#: parser_yacc.y:975 parser_yacc.y:985 parser_yacc.y:1057 parser_yacc.y:1067
#: parser_yacc.y:1145 parser_yacc.y:1155 parser_yacc.y:1234 parser_yacc.y:1244
#: parser_yacc.y:1145 parser_yacc.y:1155
msgid "Invalid network entry."
msgstr ""
#: parser_yacc.y:1039 parser_yacc.y:1048 parser_yacc.y:1254 parser_yacc.y:1510
#: parser_yacc.y:1617
#, c-format
msgid "Invalid capability %s."
msgstr ""
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525 parser_yacc.y:1637
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr ""
@@ -531,20 +493,17 @@ msgid "%s: Illegal open {, nesting groupings not allowed\n"
msgstr ""
#: ../parser_regex.c:265 ../parser_regex.c:274 ../parser_regex.c:278
#: ../parser_regex.c:306
#, c-format
msgid "%s: Regex grouping error: Invalid number of items between {}\n"
msgstr ""
#: ../parser_regex.c:271 ../parser_regex.c:280 ../parser_regex.c:284
#: ../parser_regex.c:312
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close }, no matching open { detected\n"
msgstr ""
#: ../parser_regex.c:337 ../parser_regex.c:343 ../parser_regex.c:361
#: ../parser_regex.c:403
#, c-format
msgid ""
"%s: Regex grouping error: Unclosed grouping or character class, expecting "
@@ -557,19 +516,16 @@ msgid "%s: Internal buffer overflow detected, %d characters exceeded\n"
msgstr ""
#: ../parser_regex.c:355 ../parser_regex.c:361 ../parser_regex.c:377
#: ../parser_regex.c:419
#, c-format
msgid "%s: Unable to parse input line '%s'\n"
msgstr ""
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#: ../parser_regex.c:487
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#: ../parser_policy.c:383
#, c-format
msgid "ERROR merging rules for profile %s, failed to load\n"
msgstr ""
@@ -583,19 +539,16 @@ msgid ""
msgstr ""
#: ../parser_policy.c:279 ../parser_policy.c:359 ../parser_policy.c:332
#: ../parser_policy.c:340
#, c-format
msgid "ERROR processing regexs for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:306 ../parser_policy.c:389 ../parser_policy.c:362
#: ../parser_policy.c:370
#, c-format
msgid "ERROR expanding variables for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:390 ../parser_policy.c:382 ../parser_policy.c:355
#: ../parser_policy.c:363
#, c-format
msgid "ERROR adding hat access rule for profile %s\n"
msgstr ""
@@ -625,7 +578,7 @@ msgstr ""
msgid "%s: Errors found in combining rules postprocessing. Aborting.\n"
msgstr ""
#: parser_lex.l:180 parser_lex.l:186 parser_lex.l:187
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr ""
@@ -635,8 +588,7 @@ msgid "Feature buffer full."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041 ../parser_main.c:1332 ../parser_main.c:1354
#: ../parser_misc.c:280 ../parser_misc.c:299 ../parser_misc.c:308
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr ""
@@ -665,11 +617,11 @@ msgstr ""
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621 parser_yacc.y:700
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658 parser_yacc.y:737
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr ""
@@ -685,41 +637,41 @@ msgstr ""
msgid "owner prefix not allow on capability rules"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613 parser_yacc.y:1722
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628 parser_yacc.y:1737
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635 parser_yacc.y:1744
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650 parser_yacc.y:1759
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236 ../parser_regex.c:264
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
#: ../parser_regex.c:257 ../parser_regex.c:256 ../parser_regex.c:284
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
#: ../parser_policy.c:366 ../parser_policy.c:339 ../parser_policy.c:347
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:396 ../parser_policy.c:369 ../parser_policy.c:377
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr ""
@@ -739,51 +691,51 @@ msgstr ""
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr ""
#: ../parser_misc.c:575 ../parser_misc.c:768
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr ""
#: ../parser_misc.c:599 ../parser_misc.c:792
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr ""
#: parser_yacc.y:703 parser_yacc.y:784
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr ""
#: parser_yacc.y:720 parser_yacc.y:801
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr ""
#: parser_yacc.y:736 parser_yacc.y:817
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr ""
#: parser_yacc.y:752 parser_yacc.y:833
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr ""
#: parser_yacc.y:768 parser_yacc.y:849 parser_yacc.y:869
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr ""
#: parser_yacc.y:794 parser_yacc.y:885
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr ""
#: parser_yacc.y:1293 parser_yacc.y:1377
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr ""
#: parser_yacc.y:1371 parser_yacc.y:1455
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr ""
#: ../parser_regex.c:368 ../parser_regex.c:410
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr ""

View File

@@ -16,14 +16,14 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2021-04-11 15:29+0000\n"
"Last-Translator: Markus Mikkonen <Unknown>\n"
"PO-Revision-Date: 2014-05-01 19:38+0000\n"
"Last-Translator: Jiri Grönroos <Unknown>\n"
"Language-Team: Suomi <fi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-04-12 06:41+0000\n"
"X-Generator: Launchpad (build f3c8a1aed7c0b9bc4f5601dbf2698b30e1ab66f1)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:32+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: fi\n"
#: ../parser_include.c:113 ../parser_include.c:111
@@ -643,7 +643,7 @@ msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "Muisti lopussa"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format

View File

@@ -11,49 +11,49 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2021-10-03 10:20+0000\n"
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
"PO-Revision-Date: 2013-11-15 02:58+0000\n"
"Last-Translator: Krešimir Jozić <Unknown>\n"
"Language-Team: Croatian <en@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2021-10-04 06:23+0000\n"
"X-Generator: Launchpad (build 1ce78163f6a09ed42b4201fe7d3f0e3a2eba7d02)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:32+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: hr\n"
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "Greška: ponestalo memorije.\n"
msgstr "Greška: Nedovoljno memorije.\n"
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr "Greška: osnovni direktorij %s nije direktorij, preskačem.\n"
msgstr "Greška: temeljni direktorij %s nije direktorij, preskačem.\n"
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr "Greška: nemoguće dodavanje direktorija %s u putanju pretrage.\n"
msgstr "Greška: Ne mogu dodati direktorij %s u putanju za pretragu.\n"
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "Greška: nemoguće dodijeliti memoriju.\n"
msgstr "Greška: Ne mogu rezervirati memoriju.\n"
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
msgid "Bad write position\n"
msgstr "Netočan položaj zapisivanja\n"
msgstr "Neipravan položaj za zapisivanje\n"
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
msgid "Permission denied\n"
msgstr "Pristup uskraćen\n"
msgstr "Pristup odbijen\n"
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
msgid "Out of memory\n"
msgstr "Ponestalo memorije\n"
msgstr "Nema dovoljno memorije\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "Nemoguće kopiranje profila: neispravna memorijska adresa\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
msgid "Profile doesn't conform to protocol\n"
@@ -65,7 +65,7 @@ msgstr "Profil ne odgovara potpisu\n"
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
msgid "Profile version not supported by Apparmor module\n"
msgstr "Inačicu profila ne podržava Apparmor modul\n"
msgstr "Verzija profila nije podržana od Apparmor modula\n"
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
msgid "Profile already exists\n"
@@ -77,42 +77,42 @@ msgstr "Profil ne postoji\n"
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr "Pristup odbijen, pokušaj učitavanja profila tijekom ograničenja?\n"
msgstr ""
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "Nepoznata greška (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
#, c-format
msgid "%s: Unable to add \"%s\". "
msgstr "%s: Nemoguće je dodati \"%s\". "
msgstr "%s: Ne mogu dodati \"%s\". "
#: ../parser_interface.c:121 ../parser_interface.c:124
#: ../parser_interface.c:101
#, c-format
msgid "%s: Unable to replace \"%s\". "
msgstr "%s: Nemoguće je zamijeniti \"%s\". "
msgstr "%s: Ne mogu zamijeniti \"%s\". "
#: ../parser_interface.c:126 ../parser_interface.c:129
#: ../parser_interface.c:106
#, c-format
msgid "%s: Unable to remove \"%s\". "
msgstr "%s : Nemoguće je ukloniti \"%s\". "
msgstr "%s : Ne mogu ukloniti \"%s\". "
#: ../parser_interface.c:131 ../parser_interface.c:134
#: ../parser_interface.c:111
#, c-format
msgid "%s: Unable to write to stdout\n"
msgstr "%s: Nemoguće je zapisivati u stdout\n"
msgstr "%s: Ne mogu pisati na stdout\n"
#: ../parser_interface.c:135 ../parser_interface.c:138
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: Nemoguće je zapisivati u izlaznu datoteku\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165

View File

@@ -9,293 +9,267 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2023-06-26 15:06+0000\n"
"Last-Translator: NorwayFun <temuri.doghonadze@gmail.com>\n"
"PO-Revision-Date: 2013-11-14 22:25+0000\n"
"Last-Translator: George Machitidze <giomac@gmail.com>\n"
"Language-Team: Georgian <i18n@suse.de>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2023-06-27 04:31+0000\n"
"X-Generator: Launchpad (build aedf8597c50c1abc5fb7f9e871e686dfcb381fde)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:32+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: ka\n"
#: ../parser_include.c:113 ../parser_include.c:111 ../parser_include.c:96
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "შეცდომა: არასაკმარისი მეხსიერება.\n"
msgstr ""
#: ../parser_include.c:123 ../parser_include.c:121 ../parser_include.c:106
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr ""
"შეცდომა: საბაზისო საქაღალდე %s საქაღალდეს არ წარმოადგენს. გამოტოვება\n"
#: ../parser_include.c:137 ../parser_include.c:122
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr "შეცდომა: საქაღალდის %s ძებნის ბილიკში ჩამატების შეცდომა.\n"
msgstr ""
#: ../parser_include.c:147 ../parser_include.c:151 ../parser_include.c:136
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "შეცდომა: მეხსიერების გამოყოფა შეუძლებელია.\n"
msgstr ""
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
#: ../parser_interface.c:52
msgid "Bad write position\n"
msgstr "არასწორი ჩაწერის მდებარეობა\n"
msgstr ""
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
#: ../parser_interface.c:55
msgid "Permission denied\n"
msgstr "წვდომა აკრძალულია\n"
msgstr ""
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
#: ../parser_interface.c:58
msgid "Out of memory\n"
msgstr "არასაკმარისი მეხსიერება\n"
msgstr ""
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
#: ../parser_interface.c:61
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "პროფილს კოპირება შეუძლებელია: არასწორი მეხსიერების მისამართი\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
#: ../parser_interface.c:64
msgid "Profile doesn't conform to protocol\n"
msgstr "პროფილი პროტოკოლს არ ემორჩილება\n"
msgstr ""
#: ../parser_interface.c:84 ../parser_interface.c:87 ../parser_interface.c:64
#: ../parser_interface.c:67
msgid "Profile does not match signature\n"
msgstr "პროფილი ხელმოწერას არ ემთხვევა\n"
msgstr ""
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
#: ../parser_interface.c:70
msgid "Profile version not supported by Apparmor module\n"
msgstr "პროფილის ვერსია Apparmor-ის მოდულის მიერ მხარდაჭერილი არაა\n"
msgstr ""
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
#: ../parser_interface.c:73
msgid "Profile already exists\n"
msgstr "პროფილი უკვე არსებობს\n"
msgstr ""
#: ../parser_interface.c:93 ../parser_interface.c:96 ../parser_interface.c:73
#: ../parser_interface.c:76
msgid "Profile doesn't exist\n"
msgstr "პროფილი არ არსებობს\n"
msgstr ""
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
#: ../parser_interface.c:79
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr "წვდომა აკრძალულია. პროფილის ჩატვირთვის მცდელობა შეზღუდვისას?\n"
msgstr ""
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#: ../parser_interface.c:82
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "უცნობი შეცდომა (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119 ../parser_interface.c:96
#: ../parser_interface.c:100
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
#, c-format
msgid "%s: Unable to add \"%s\". "
msgstr "%s: \"%s\"-ის დამატების შეცდომა. "
msgstr ""
#: ../parser_interface.c:121 ../parser_interface.c:124
#: ../parser_interface.c:101 ../parser_interface.c:105
#: ../parser_interface.c:101
#, c-format
msgid "%s: Unable to replace \"%s\". "
msgstr "%s: \"%s\"-ის ჩანაცვლების შეცდომა. "
msgstr ""
#: ../parser_interface.c:126 ../parser_interface.c:129
#: ../parser_interface.c:106 ../parser_interface.c:110
#: ../parser_interface.c:106
#, c-format
msgid "%s: Unable to remove \"%s\". "
msgstr "%s: \"%s\"-ის წაშლის შეცდომა. "
msgstr ""
#: ../parser_interface.c:131 ../parser_interface.c:134
#: ../parser_interface.c:111 ../parser_interface.c:115
#: ../parser_interface.c:111
#, c-format
msgid "%s: Unable to write to stdout\n"
msgstr "%s: stdout-ში ჩაწერის შეცდომა\n"
msgstr ""
#: ../parser_interface.c:135 ../parser_interface.c:138
#: ../parser_interface.c:115 ../parser_interface.c:119
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: გამოტანის ფაილში ჩაწერის შეცდომა\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
#: ../parser_interface.c:118 ../parser_interface.c:142
#: ../parser_interface.c:123 ../parser_interface.c:147
#, c-format
msgid "%s: ASSERT: Invalid option: %d\n"
msgstr "%s: მტკიცება: არასწორი პარამეტრი: %d\n"
msgstr ""
#: ../parser_interface.c:147 ../parser_interface.c:150
#: ../parser_interface.c:127 ../parser_interface.c:132
#: ../parser_interface.c:127
#, c-format
msgid "Addition succeeded for \"%s\".\n"
msgstr "\"%s\"-სთვის დამატება წარმატებულია.\n"
msgstr ""
#: ../parser_interface.c:151 ../parser_interface.c:154
#: ../parser_interface.c:131 ../parser_interface.c:136
#: ../parser_interface.c:131
#, c-format
msgid "Replacement succeeded for \"%s\".\n"
msgstr "\"%s\"-სთვის ჩანაცვლება წარმატებულია.\n"
msgstr ""
#: ../parser_interface.c:155 ../parser_interface.c:158
#: ../parser_interface.c:135 ../parser_interface.c:140
#: ../parser_interface.c:135
#, c-format
msgid "Removal succeeded for \"%s\".\n"
msgstr "\"%s\"-სთვის წაშლა წარმატებულია.\n"
msgstr ""
#: ../parser_interface.c:251 ../parser_interface.c:254
#, c-format
msgid "PANIC bad increment buffer %p pos %p ext %p size %d res %p\n"
msgstr "პანიკა. არასწორი ზრდადი ბუფერი %p მდებ %p გაფართ %p ზომა %d რეს %p\n"
msgstr ""
#: ../parser_interface.c:656 ../parser_interface.c:658
#: ../parser_interface.c:446 ../parser_interface.c:476
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr "პროფილის %s ქსელის წესები არ მოქმედებს\n"
msgstr ""
#: ../parser_interface.c:666
msgid "Unknown pattern type\n"
msgstr "უცნობი ნიმუშის ტიპი\n"
msgstr ""
#: ../parser_interface.c:750 ../parser_interface.c:902
#: ../parser_interface.c:743 ../parser_interface.c:894
#: ../parser_interface.c:518 ../parser_interface.c:669
#, c-format
msgid "Unable to open %s - %s\n"
msgstr "%s-ის გახსნა შეუძლებელია - %s\n"
msgstr ""
#: ../parser_interface.c:776 ../parser_interface.c:768
#: ../parser_interface.c:543
#, c-format
msgid "Memory Allocation Error: Unable to remove ^%s\n"
msgstr "მეხსიერების გამოყოფის შეცდომა: ^%s-ის წაშლა შეუძლებელია\n"
msgstr ""
#: ../parser_interface.c:789 ../parser_interface.c:781
#: ../parser_interface.c:556
#, c-format
msgid "Memory Allocation Error: Unable to remove %s:%s."
msgstr "მეხსიერების გამოყოფის შეცდომა: %s-ის წაშლა შეუძლებელია: %s."
msgstr ""
#: ../parser_interface.c:810 ../parser_interface.c:802
msgid "unable to create work area\n"
msgstr "სამუშაო ფართობის შექმნა შეუძლებელია\n"
msgstr ""
#: ../parser_interface.c:818 ../parser_interface.c:810
#, c-format
msgid "unable to serialize profile %s\n"
msgstr "პროფილის %s სერიალიზაცია შეუძლებელია\n"
msgstr ""
#: ../parser_interface.c:829 ../parser_interface.c:916
#: ../parser_interface.c:821 ../parser_interface.c:908
#: ../parser_interface.c:582
#, c-format
msgid "%s: Unable to write entire profile entry\n"
msgstr "%s: სრული პროფილის ელემენტის ჩაწერა შეუძლებელია\n"
msgstr ""
#: ../parser_interface.c:839 ../parser_interface.c:831
#: ../parser_interface.c:593 ../parser_interface.c:579
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr "%s: სრული პროფილის ელემენტის კეშში ჩაწერა შეუძლებელია\n"
msgstr ""
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr "'%s'-ის გახსნის შეცდომა"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173 parser_lex.l:174
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr "fstat-ის შეცდომა '%s'-სთვის"
msgstr ""
#: parser_lex.l:121
#, c-format
msgid "opendir failed '%s'"
msgstr "opendir -ის შეცდომა '%s'-სთვის"
msgstr ""
#: parser_lex.l:152
#, c-format
msgid "stat failed for '%s'"
msgstr "%s-სთვის stat()-ის შეცდომა"
msgstr ""
#: parser_lex.l:155 parser_lex.l:133 parser_lex.l:139
#, c-format
msgid "Could not open '%s' in '%s'"
msgstr "'%s'-ის '%s'-ში გახსნის შეცდომა"
msgstr ""
#: parser_lex.l:284 parser_lex.l:322 parser_lex.l:362 parser_lex.l:399
#: parser_lex.l:469 parser_lex.l:655 parser_lex.l:586 parser_lex.l:638
#, c-format
msgid "Found unexpected character: '%s'"
msgstr "ნაპოვნია მოულოდნელი სიმბოლო: '%s'"
msgstr ""
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428 parser_lex.l:474
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr "ცვლადის სახელებს ბოლოში მიწერილი მძიმეების მხარდაჭერა არ გააჩნია"
msgstr ""
#: parser_lex.l:420
#, c-format
msgid "(network_mode) Found unexpected character: '%s'"
msgstr "(network_mode) ნაპოვნია მოულოდნელი სიმბოლო: '%s'"
msgstr ""
#: ../parser_main.c:333 ../parser_common.c:61 ../parser_common.c:106
#, c-format
msgid "Warning from %s (%s%sline %d): %s"
msgstr "გაფრთხილება %s-დან (%s%s ხაზი %d): %s"
msgstr ""
#: ../parser_main.c:531
#, c-format
msgid "%s: Could not allocate memory for subdomainbase mount point\n"
msgstr ""
"%s: მეხსიერების გამოყოფის შეცდომა subdomainbase მიმაგრების წერტილისთვის\n"
#: ../parser_main.c:577 ../parser_main.c:616 ../parser_main.c:479
#: ../parser_main.c:1444
#, c-format
msgid ""
"Warning: unable to find a suitable fs in %s, is it mounted?\n"
"Use --subdomainfs to override.\n"
msgstr ""
"გაფრთხილება: %s-ში შესაბამისი FS ვერ ვიპოვე. მიმაგრებულია?\n"
"გადასაფარად გამოიყენეთ --subdomainfs.\n"
#: ../parser_main.c:597 ../parser_main.c:635 ../parser_main.c:498
#: ../parser_main.c:822
#, c-format
msgid ""
"%s: Sorry. You need root privileges to run this program.\n"
"\n"
msgstr ""
"%s: უკაცრავად, მაგრამ ამ პროგრამის გასაშვებად root-ის პრივილეგიები "
"დაგჭირდებათ.\n"
"\n"
#: ../parser_main.c:604 ../parser_main.c:642 ../parser_main.c:505
#: ../parser_main.c:828
#, c-format
msgid ""
"%s: Warning! You've set this program setuid root.\n"
"Anybody who can run this program can update your AppArmor profiles.\n"
"\n"
msgstr ""
"%s: გაფრთხილება: პროგრამაზე setuid root დააყენეთ.\n"
"ყველა, ვინც ამ პროგრამას გაუშვებს, AppArmor-ის პროფილების განახლება "
"შეეძლება.\n"
"\n"
#: ../parser_main.c:704 ../parser_main.c:813 ../parser_main.c:836
#: ../parser_main.c:946 ../parser_main.c:860 ../parser_main.c:1038
#: ../parser_main.c:946 ../parser_main.c:860
#, c-format
msgid "Error: Could not read profile %s: %s.\n"
msgstr "შეცდომა: პროფილის '%s' წაკითხვის შეცდომა: %s.\n"
msgstr ""
#: ../parser_main.c:718 ../parser_misc.c:270 parser_yacc.y:227
#: parser_yacc.y:374 parser_yacc.y:386 parser_yacc.y:484 parser_yacc.y:586
@@ -314,36 +288,26 @@ msgstr "შეცდომა: პროფილის '%s' წაკითხ
#: parser_yacc.y:1166 parser_yacc.y:1170 parser_yacc.y:1180 parser_yacc.y:1190
#: parser_yacc.y:1298 parser_yacc.y:1376 parser_yacc.y:1479 parser_yacc.y:1490
#: parser_yacc.y:1565 parser_yacc.y:1583 parser_yacc.y:1590 parser_yacc.y:1639
#: ../network.c:314 ../af_unix.cc:203 ../parser_misc.c:215 ../parser_misc.c:939
#: parser_yacc.y:343 parser_yacc.y:367 parser_yacc.y:533 parser_yacc.y:543
#: parser_yacc.y:660 parser_yacc.y:741 parser_yacc.y:750 parser_yacc.y:1171
#: parser_yacc.y:1219 parser_yacc.y:1255 parser_yacc.y:1264 parser_yacc.y:1268
#: parser_yacc.y:1278 parser_yacc.y:1288 parser_yacc.y:1382 parser_yacc.y:1460
#: parser_yacc.y:1592 parser_yacc.y:1597 parser_yacc.y:1674 parser_yacc.y:1692
#: parser_yacc.y:1699 parser_yacc.y:1748 ../network.c:315 ../af_unix.cc:194
#: ../network.c:314 ../af_unix.cc:203
msgid "Memory allocation error."
msgstr "მეხსიერების გამოყოფის შეცდომა."
msgstr ""
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#: ../parser_main.c:975
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr "დაკეშილი ჩატვირთვა \"%s\"-სთვის წარმატებულია.\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#: ../parser_main.c:979
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr "დაკეშილი თავიდან ჩატვირთვა \"%s\"-სთვის წარმატებულია.\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#: ../parser_main.c:1132
#, c-format
msgid "%s: Errors found in file. Aborting.\n"
msgstr "%s: ფაილში აღმოჩენილია შეცდომები. მუშაობის დასრულება.\n"
msgstr ""
#: ../parser_misc.c:426 ../parser_misc.c:597 ../parser_misc.c:339
#: ../parser_misc.c:532
msgid ""
"Uppercase qualifiers \"RWLIMX\" are deprecated, please convert to lowercase\n"
"See the apparmor.d(5) manpage for details.\n"
@@ -351,17 +315,14 @@ msgstr ""
#: ../parser_misc.c:467 ../parser_misc.c:474 ../parser_misc.c:638
#: ../parser_misc.c:645 ../parser_misc.c:380 ../parser_misc.c:387
#: ../parser_misc.c:573 ../parser_misc.c:580
msgid "Conflict 'a' and 'w' perms are mutually exclusive."
msgstr "წვდომები 'a' და 'w' ურთიერთგამომრიცხავია."
msgstr ""
#: ../parser_misc.c:491 ../parser_misc.c:662 ../parser_misc.c:404
#: ../parser_misc.c:597
msgid "Exec qualifier 'i' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:502 ../parser_misc.c:673 ../parser_misc.c:415
#: ../parser_misc.c:608
#, c-format
msgid ""
"Unconfined exec qualifier (%c%c) allows some dangerous environment variables "
@@ -370,176 +331,163 @@ msgstr ""
#: ../parser_misc.c:510 ../parser_misc.c:551 ../parser_misc.c:681
#: ../parser_misc.c:722 ../parser_misc.c:423 ../parser_misc.c:464
#: ../parser_misc.c:616 ../parser_misc.c:657
#, c-format
msgid "Exec qualifier '%c' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:537 ../parser_misc.c:545 ../parser_misc.c:708
#: ../parser_misc.c:716 ../parser_misc.c:450 ../parser_misc.c:458
#: ../parser_misc.c:643 ../parser_misc.c:651
#, c-format
msgid ""
"Exec qualifier '%c%c' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:593 ../parser_misc.c:764 ../parser_misc.c:506
#: ../parser_misc.c:699
#, c-format
msgid "Internal: unexpected mode character '%c' in input"
msgstr "შიდა: შეყვანაში აღმოჩენილია მოულოდნელი რეჟიმის სიმბოლო '%c'"
msgstr ""
#: ../parser_misc.c:615 ../parser_misc.c:786 ../parser_misc.c:528
#: ../parser_misc.c:721
#, c-format
msgid "Internal error generated invalid perm 0x%llx\n"
msgstr "შიდა შეცდომის მიერ გენერირებული არასწორი წვდომა 0x%llx\n"
msgstr ""
#: ../parser_misc.c:865 ../parser_symtab.c:561 ../parser_regex.c:626
#: ../parser_variable.c:229
#, c-format
msgid "AppArmor parser error: %s\n"
msgstr "AppArmor-ის დამმუშავებლის შეცდომა: %s\n"
msgstr ""
#: ../parser_merge.c:92 ../parser_merge.c:91 ../parser_merge.c:83
#: ../parser_merge.c:71
msgid "Couldn't merge entries. Out of Memory\n"
msgstr "ელემენტების შერწყმა შეუძლებელია. არასაკმარისი მეხსიერება\n"
msgstr ""
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#: ../parser_merge.c:93
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr ""
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
msgstr "პროფილის მიმაგრება '/'-ით უნდა იწყებოდეს."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348 parser_yacc.y:407
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
"პროფილის სახელი '/'-ით, სახელის სივრცით ან საკვანძო სიტყვებიდან 'profile' ან "
"'hat' უნდა იწყებოდეს."
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384 parser_yacc.y:449
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
msgid "Failed to create alias %s -> %s\n"
msgstr "შეცდომა ფსევდონიმის (%s) შექმნისას -> %s\n"
msgstr ""
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506 parser_yacc.y:581
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
"პროფილის ალამი chroot_relative კონფლიქტშია ალამთან namespace_relative"
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510 parser_yacc.y:585
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr "პროფილის ალამი mediate_deleted კონფლიქტშია ალამთან delegate_deleted"
msgstr ""
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513 parser_yacc.y:588
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
"პროფილის ალამი attach_disconnect კონფლიქტშია ალამთან no_attach_disconnected"
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516 parser_yacc.y:591
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr "პროფილის ალამი chroot_attach კონფლიქტშია ალამთან chroot_no_attach"
msgstr ""
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530 parser_yacc.y:607
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
msgstr "პროფილის ალამი 'debug' აღარ გამოიყენება."
msgstr ""
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552 parser_yacc.y:629
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552
#, c-format
msgid "Invalid profile flag: %s."
msgstr "არასწორი პროფილის ალამი: %s."
msgstr ""
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
#: parser_yacc.y:673
msgid "Assert: `rule' returned NULL."
msgstr ""
#: parser_yacc.y:501 parser_yacc.y:546 parser_yacc.y:552 parser_yacc.y:584
#: parser_yacc.y:598 parser_yacc.y:630 parser_yacc.y:677 parser_yacc.y:709
#: parser_yacc.y:598 parser_yacc.y:630
msgid ""
"Invalid mode, in deny rules 'x' must not be preceded by exec qualifier 'i', "
"'p', or 'u'"
msgstr ""
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602 parser_yacc.y:681
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602
msgid ""
"Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', 'c', or 'u'"
msgstr ""
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633 parser_yacc.y:712
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633
msgid "Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', or 'u'"
msgstr ""
#: parser_yacc.y:574 parser_yacc.y:612 parser_yacc.y:614 parser_yacc.y:660
#: parser_yacc.y:739
msgid "Assert: `network_rule' return invalid protocol."
msgstr ""
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786 parser_yacc.y:867
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr ""
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810 parser_yacc.y:905
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
msgstr ""
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819 parser_yacc.y:914
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr ""
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992 parser_yacc.y:1077
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
msgid "Unset boolean variable %s used in if-expression"
msgstr ""
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092 parser_yacc.y:1181
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092
msgid "unsafe rule missing exec permissions"
msgstr ""
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060 parser_yacc.y:1148
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060
msgid "subset can only be used with link rules."
msgstr ""
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062 parser_yacc.y:1150
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062
msgid "link and exec perms conflict on a file rule using ->"
msgstr ""
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064 parser_yacc.y:1152
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064
msgid "link perms are not allowed on a named profile transition.\n"
msgstr ""
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109 parser_yacc.y:1198
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109
#, c-format
msgid "missing an end of line character? (entry: %s)"
msgstr ""
#: parser_yacc.y:975 parser_yacc.y:985 parser_yacc.y:1057 parser_yacc.y:1067
#: parser_yacc.y:1145 parser_yacc.y:1155 parser_yacc.y:1234 parser_yacc.y:1244
#: parser_yacc.y:1145 parser_yacc.y:1155
msgid "Invalid network entry."
msgstr "არასწორი ქსელის ჩანაწერი."
msgstr ""
#: parser_yacc.y:1039 parser_yacc.y:1048 parser_yacc.y:1254 parser_yacc.y:1510
#: parser_yacc.y:1617
#, c-format
msgid "Invalid capability %s."
msgstr "არასწორი შესაძლებლობა %s."
msgstr ""
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525 parser_yacc.y:1637
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr "AppArmor-ის დამმუშავებლის შეცდომა. %s%s%s ხაზზე ნომრით %d: %s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr "AppArmor-ის დამმუშავებლის შეცდომა. %s%s ხაზზე ნომრით %d: %s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
@@ -547,20 +495,17 @@ msgid "%s: Illegal open {, nesting groupings not allowed\n"
msgstr ""
#: ../parser_regex.c:265 ../parser_regex.c:274 ../parser_regex.c:278
#: ../parser_regex.c:306
#, c-format
msgid "%s: Regex grouping error: Invalid number of items between {}\n"
msgstr ""
#: ../parser_regex.c:271 ../parser_regex.c:280 ../parser_regex.c:284
#: ../parser_regex.c:312
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close }, no matching open { detected\n"
msgstr ""
#: ../parser_regex.c:337 ../parser_regex.c:343 ../parser_regex.c:361
#: ../parser_regex.c:403
#, c-format
msgid ""
"%s: Regex grouping error: Unclosed grouping or character class, expecting "
@@ -573,19 +518,16 @@ msgid "%s: Internal buffer overflow detected, %d characters exceeded\n"
msgstr ""
#: ../parser_regex.c:355 ../parser_regex.c:361 ../parser_regex.c:377
#: ../parser_regex.c:419
#, c-format
msgid "%s: Unable to parse input line '%s'\n"
msgstr ""
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#: ../parser_regex.c:487
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#: ../parser_policy.c:383
#, c-format
msgid "ERROR merging rules for profile %s, failed to load\n"
msgstr ""
@@ -599,19 +541,16 @@ msgid ""
msgstr ""
#: ../parser_policy.c:279 ../parser_policy.c:359 ../parser_policy.c:332
#: ../parser_policy.c:340
#, c-format
msgid "ERROR processing regexs for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:306 ../parser_policy.c:389 ../parser_policy.c:362
#: ../parser_policy.c:370
#, c-format
msgid "ERROR expanding variables for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:390 ../parser_policy.c:382 ../parser_policy.c:355
#: ../parser_policy.c:363
#, c-format
msgid "ERROR adding hat access rule for profile %s\n"
msgstr ""
@@ -641,35 +580,34 @@ msgstr ""
msgid "%s: Errors found in combining rules postprocessing. Aborting.\n"
msgstr ""
#: parser_lex.l:180 parser_lex.l:186 parser_lex.l:187
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr "ჩასასმელი საქაღალდის ('%s') '%s'-ში დამუშავება შეუძლებელია"
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr "თვისების ბუფერი სავსეა."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041 ../parser_main.c:1332 ../parser_main.c:1354
#: ../parser_misc.c:280 ../parser_misc.c:299 ../parser_misc.c:308
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "არასაკმარისი მეხსიერება"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
msgid "Can't create cache directory: %s\n"
msgstr "კეშის საქაღალდის შექმნის შეცდომა: %s\n"
msgstr ""
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr "ფაილი კეშის საქაღალდის მდებარეობაზე: %s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
msgid "Can't update cache directory: %s\n"
msgstr "კეშის საქაღალდის განახლების შეცდომა: %s\n"
msgstr ""
#: ../parser_misc.c:833
#, c-format
@@ -681,61 +619,61 @@ msgstr ""
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621 parser_yacc.y:700
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr "აკრძალვის პრეფიქსი დაშვებული არაა"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658 parser_yacc.y:737
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr "მფლობლის პრეფიქსი დაშვებული არაა"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr "მფლობლის პრეფიქსი მიმაგრების წესებში დაშვებული არაა"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr "მფლობლის პრეფიქსი dbus-ის წესებში დაშვებული არაა"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr "მფლობლის პრეფიქსი შესაძლებლობების წესებში დაშვებული არაა"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613 parser_yacc.y:1722
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr "არასწორი მიმაგრების პირობითი %s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628 parser_yacc.y:1737
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr "არასწორი მიმაგრების წესი"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635 parser_yacc.y:1744
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr "მიმაგრების წერტილის პირობები ამჟამად მხარდაჭერილი არაა"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650 parser_yacc.y:1759
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr "არასწორი pivotroot პირობითი '%s'"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236 ../parser_regex.c:264
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
#: ../parser_regex.c:257 ../parser_regex.c:256 ../parser_regex.c:284
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
#: ../parser_policy.c:366 ../parser_policy.c:339 ../parser_policy.c:347
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:396 ../parser_policy.c:369 ../parser_policy.c:377
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr ""
@@ -755,51 +693,51 @@ msgstr ""
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr ""
#: ../parser_misc.c:575 ../parser_misc.c:768
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr ""
#: ../parser_misc.c:599 ../parser_misc.c:792
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr ""
#: parser_yacc.y:703 parser_yacc.y:784
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr "მფლობლის პრეფიქსი მიმაგრების წესებზე დაშვებული არაა"
msgstr ""
#: parser_yacc.y:720 parser_yacc.y:801
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr "მფლობლის პრეფიქსი dbus-ის წესებზე დაშვებული არაა"
msgstr ""
#: parser_yacc.y:736 parser_yacc.y:817
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr "მფლობლის პრეფიქსი სიგნალის წესებზე დაშვებული არაა"
msgstr ""
#: parser_yacc.y:752 parser_yacc.y:833
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr "მფლობლის პრეფიქსი ptrace-ის წესებზე დაშვებული არაა"
msgstr ""
#: parser_yacc.y:768 parser_yacc.y:849 parser_yacc.y:869
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr "მფლობლის პრეფიქსი unix-ის წესებზე დაშვებული არაა"
msgstr ""
#: parser_yacc.y:794 parser_yacc.y:885
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr "მფლობლის პრეფიქსი შესაძლებლობების წესებზე დაშვებული არაა"
msgstr ""
#: parser_yacc.y:1293 parser_yacc.y:1377
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr "dbus-ის წესი: არასწორი პირობითი ჯგუფი %s=0"
msgstr ""
#: parser_yacc.y:1371 parser_yacc.y:1455
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr "unix-ის წესი: არასწორი პირობითი ჯგუფი %s=0"
msgstr ""
#: ../parser_regex.c:368 ../parser_regex.c:410
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr ""

View File

@@ -11,14 +11,14 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2020-07-13 00:17+0000\n"
"Last-Translator: Peter J. Mello <admin@petermello.net>\n"
"PO-Revision-Date: 2016-03-03 08:40+0000\n"
"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
"Language-Team: Portuguese <opensuse-pt@opensuse.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-07-14 05:50+0000\n"
"X-Generator: Launchpad (build 4809fcb62f445aaa3ae919f7f6c3cc7d156ea57a)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:32+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: pt\n"
#: ../parser_include.c:113 ../parser_include.c:111
@@ -230,7 +230,7 @@ msgstr "Encontrado caracter inesperado: '%s'"
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr "As declarações variáveis não aceitam vírgulas de seguimento"
msgstr ""
#: parser_lex.l:420
#, c-format
@@ -308,12 +308,12 @@ msgstr "Erro de alocação de memória."
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr "A carga em cache foi bem sucedida para \"%s\".\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr "A recarga em cache foi bem sucedida para \"%s\".\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#, c-format
@@ -390,7 +390,7 @@ msgstr "Não é possível intercalar as entradas. Memória Esgotada\n"
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr "perfil %s: fundiu a regra %s com modificadores conflitantes x\n"
msgstr ""
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
@@ -400,8 +400,6 @@ msgstr "Anexo de perfil deve começar com '/'."
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
"Os nomes dos perfis têm que começar com '/', espaço de nomes, ou palavra-"
"chave 'profile' ou 'hat'."
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
@@ -411,21 +409,19 @@ msgstr "Falha na criação da alcunha %s -> %s\n"
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
"A marcação do perfil chroot_relative conflitos com o namespace_relative"
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr "A marcação do perfil mediate_deleted conflitos com delegate_deleted"
msgstr ""
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
"A marcação do perfil attach_disconnected conflitos com no_attach_disconnected"
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr "A marcação do perfil chroot_attach conflitos com chroot_no_attach"
msgstr ""
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
@@ -519,12 +515,12 @@ msgstr "Capacidade inválida %s."
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr "Erro de analisador AppArmor para %s%s%s na linha %d: %s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr "Erro de analisador AppArmor,%s%s linha %d: %s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
@@ -569,7 +565,7 @@ msgstr "%s: Não foi possível analisar a linha de entrada '%s'\n"
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr "%s: Nome de perfil inválido '%s' - má expressão regular\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#, c-format
@@ -637,11 +633,11 @@ msgstr ""
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr "Não foi possível processar incluir pasta '%s' em '%s'"
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr "Amortecedor de características cheio."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041
@@ -656,7 +652,7 @@ msgstr "Não foi possível criar diretório de cache: %s\n"
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr "Ficheiro na localização da pasta do cache: %s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
@@ -666,137 +662,132 @@ msgstr "Não foi possível atualizar o diretório da cache: %s\n"
#: ../parser_misc.c:833
#, c-format
msgid "Internal: unexpected DBus mode character '%c' in input"
msgstr "Interno: carácter do modo D-Bus '%c' inesperado na entrada"
msgstr ""
#: ../parser_misc.c:857
#, c-format
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr "Erro interno gerado por permissão do D-Bus inválido 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr "Não é permitido prefixo deny"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr "Não é permitido prefixo owner"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr "Não é permitido prefixo owner nas regras de montar"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr "Não é permitido prefixo owner nas regras de D-Bus"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr "Não é permitido prefixo owner nas regras de capacidade"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr "montar condicional inválido %s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr "regra de montagem errada"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr "condições do ponto de montagem não suportadas atualmente"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr "pivotroot condicional inválido '%s'"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
"%s: Erro de agrupamento de expressões regulares: Fechamento inválido ], sem "
"abertura correspondente [ detectado\n"
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
"%s: Erro de agrupamento de expressões regulares: Excedido o máximo de "
"aninhamento de {}\n"
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
"O ERRO processando regras de policydb para perfil %s, falhou em carregar\n"
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr "O ERRO substituindo aliases para perfil %s, falhou em carregar\n"
msgstr ""
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr "%s: Não foi possível gravar %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr "Erro: Não pôde ler o perfil binário ou o ficheiro de cache %s: %s.\n"
msgstr ""
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr "Erro: Não foi possível ler o ficheiro de cache '%s', a ignorar...\n"
msgstr ""
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr "Interno: caractere inesperado do modo %s: '%c' na entrada"
msgstr ""
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr "Erro interno gerado permissão %s inválido 0x%x\n"
msgstr ""
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr "prefixo owner não permitido nas regras de montar"
msgstr ""
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr "prefixo owner não permitido nas regras de D-Bus"
msgstr ""
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr "prefixo owner não permitido nas regras do sinal"
msgstr ""
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr "prefixo owner não permitido nas regras de ptrace"
msgstr ""
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr "prefixo owner não permitido nas regras de unix"
msgstr ""
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr "prefixo owner não permitido nas regras de capacidade"
msgstr ""
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr "regra dbus: grupo condicional inválido %s=()"
msgstr ""
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr "regra unix: grupo condicional inválido %s=()"
msgstr ""
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr "%s: Erro de expressão regular: carácter de fuga '\\' seguinte\n"
msgstr ""

View File

@@ -6,143 +6,131 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2022-06-17 21:43+0000\n"
"Last-Translator: Isabella Rocha de Oliveira <Unknown>\n"
"PO-Revision-Date: 2013-11-15 03:51+0000\n"
"Last-Translator: Novell Language <Unknown>\n"
"Language-Team: Novell Language <language@novell.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2022-06-18 04:31+0000\n"
"X-Generator: Launchpad (build ae54683eb2eb8ed62cda30dc44e60c5387c78159)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:33+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: pt_BR\n"
#: ../parser_include.c:113 ../parser_include.c:111 ../parser_include.c:96
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "Erro: Sem memória.\n"
#: ../parser_include.c:123 ../parser_include.c:121 ../parser_include.c:106
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr "Erro: O diretório base %s não é um diretório; ignorando.\n"
#: ../parser_include.c:137 ../parser_include.c:122
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr ""
"Erro: Não foi possível adicionar o diretório %s ao caminho de pesquisa.\n"
#: ../parser_include.c:147 ../parser_include.c:151 ../parser_include.c:136
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "Erro: Não foi possível alocar memória.\n"
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
#: ../parser_interface.c:52
msgid "Bad write position\n"
msgstr "Posição de gravação incorreta\n"
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
#: ../parser_interface.c:55
msgid "Permission denied\n"
msgstr "Permissão negada\n"
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
#: ../parser_interface.c:58
msgid "Out of memory\n"
msgstr "Memória insuficiente\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
#: ../parser_interface.c:61
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "Não foi possível copiar perfil: Endereço de memória incorreto\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
#: ../parser_interface.c:64
msgid "Profile doesn't conform to protocol\n"
msgstr "Perfil não compatível com o protocolo\n"
#: ../parser_interface.c:84 ../parser_interface.c:87 ../parser_interface.c:64
#: ../parser_interface.c:67
msgid "Profile does not match signature\n"
msgstr "Perfil não corresponde à assinatura\n"
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
#: ../parser_interface.c:70
msgid "Profile version not supported by Apparmor module\n"
msgstr "Versão de perfil não suportada pelo módulo do AppArmor\n"
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
#: ../parser_interface.c:73
msgid "Profile already exists\n"
msgstr "O perfil já existe\n"
#: ../parser_interface.c:93 ../parser_interface.c:96 ../parser_interface.c:73
#: ../parser_interface.c:76
msgid "Profile doesn't exist\n"
msgstr "O perfil não existe\n"
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
#: ../parser_interface.c:79
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr "Permissão negada; tentou carregar um perfil enquanto restrito?\n"
msgstr ""
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#: ../parser_interface.c:82
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "Erro desconhecido (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119 ../parser_interface.c:96
#: ../parser_interface.c:100
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
#, c-format
msgid "%s: Unable to add \"%s\". "
msgstr "%s: Impossível adicionar \"%s\". "
#: ../parser_interface.c:121 ../parser_interface.c:124
#: ../parser_interface.c:101 ../parser_interface.c:105
#: ../parser_interface.c:101
#, c-format
msgid "%s: Unable to replace \"%s\". "
msgstr "%s: Impossível substituir \"%s\". "
#: ../parser_interface.c:126 ../parser_interface.c:129
#: ../parser_interface.c:106 ../parser_interface.c:110
#: ../parser_interface.c:106
#, c-format
msgid "%s: Unable to remove \"%s\". "
msgstr "%s: Impossível remover \"%s\". "
#: ../parser_interface.c:131 ../parser_interface.c:134
#: ../parser_interface.c:111 ../parser_interface.c:115
#: ../parser_interface.c:111
#, c-format
msgid "%s: Unable to write to stdout\n"
msgstr "%s: Impossível gravar em stdout\n"
#: ../parser_interface.c:135 ../parser_interface.c:138
#: ../parser_interface.c:115 ../parser_interface.c:119
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: Não é possível salvar no arquivo de saída\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
#: ../parser_interface.c:118 ../parser_interface.c:142
#: ../parser_interface.c:123 ../parser_interface.c:147
#, c-format
msgid "%s: ASSERT: Invalid option: %d\n"
msgstr "%s: DECLARAR: Opção inválida: %d\n"
#: ../parser_interface.c:147 ../parser_interface.c:150
#: ../parser_interface.c:127 ../parser_interface.c:132
#: ../parser_interface.c:127
#, c-format
msgid "Addition succeeded for \"%s\".\n"
msgstr "Adição bem-sucedida de \"%s\".\n"
#: ../parser_interface.c:151 ../parser_interface.c:154
#: ../parser_interface.c:131 ../parser_interface.c:136
#: ../parser_interface.c:131
#, c-format
msgid "Replacement succeeded for \"%s\".\n"
msgstr "Substituição bem-sucedida de \"%s\".\n"
#: ../parser_interface.c:155 ../parser_interface.c:158
#: ../parser_interface.c:135 ../parser_interface.c:140
#: ../parser_interface.c:135
#, c-format
msgid "Removal succeeded for \"%s\".\n"
msgstr "Remoção bem-sucedida de \"%s\".\n"
@@ -154,14 +142,14 @@ msgstr ""
"PÂNICO: buffer de incremento incorreto %p pos %p ext %p tamanho %d res %p\n"
#: ../parser_interface.c:656 ../parser_interface.c:658
#: ../parser_interface.c:446 ../parser_interface.c:476
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr "perfil %s regras de rede não impostas\n"
msgstr ""
#: ../parser_interface.c:666
msgid "Unknown pattern type\n"
msgstr "Tipo padrão desconhecido\n"
msgstr ""
#: ../parser_interface.c:750 ../parser_interface.c:902
#: ../parser_interface.c:743 ../parser_interface.c:894
@@ -199,35 +187,35 @@ msgid "%s: Unable to write entire profile entry\n"
msgstr "%s: Impossível gravar toda a entrada do perfil\n"
#: ../parser_interface.c:839 ../parser_interface.c:831
#: ../parser_interface.c:593 ../parser_interface.c:579
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr "%s: Não é possível gravar o perfil de entrada completo no cache\n"
msgstr ""
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr "Não foi possível abrir '%s'"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173 parser_lex.l:174
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr "fstat falhou para '%s'"
msgstr ""
#: parser_lex.l:121
#, c-format
msgid "opendir failed '%s'"
msgstr "opendir falhou '%s'"
msgstr ""
#: parser_lex.l:152
#, c-format
msgid "stat failed for '%s'"
msgstr "stat falhou para '%s'"
msgstr ""
#: parser_lex.l:155 parser_lex.l:133 parser_lex.l:139
#, c-format
msgid "Could not open '%s' in '%s'"
msgstr "Não foi possível abrir '%s' em '%s'"
msgstr ""
#: parser_lex.l:284 parser_lex.l:322 parser_lex.l:362 parser_lex.l:399
#: parser_lex.l:469 parser_lex.l:655 parser_lex.l:586 parser_lex.l:638
@@ -235,9 +223,9 @@ msgstr "Não foi possível abrir '%s' em '%s'"
msgid "Found unexpected character: '%s'"
msgstr "Caractere inesperado encontrado: '%s'"
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428 parser_lex.l:474
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr "Declarações de variável não aceitam vírgulas como último caractere"
msgstr ""
#: parser_lex.l:420
#, c-format
@@ -247,7 +235,7 @@ msgstr "(network_mode) Caractere inesperado encontrado: '%s'"
#: ../parser_main.c:333 ../parser_common.c:61 ../parser_common.c:106
#, c-format
msgid "Warning from %s (%s%sline %d): %s"
msgstr "Aviso de %s (%s%sline %d): %s"
msgstr ""
#: ../parser_main.c:531
#, c-format
@@ -256,7 +244,6 @@ msgstr ""
"%s: Impossível alocar memória para ponto de montagem de base de subdomínio\n"
#: ../parser_main.c:577 ../parser_main.c:616 ../parser_main.c:479
#: ../parser_main.c:1444
#, c-format
msgid ""
"Warning: unable to find a suitable fs in %s, is it mounted?\n"
@@ -266,7 +253,6 @@ msgstr ""
"Use --subdomainfs para anular.\n"
#: ../parser_main.c:597 ../parser_main.c:635 ../parser_main.c:498
#: ../parser_main.c:822
#, c-format
msgid ""
"%s: Sorry. You need root privileges to run this program.\n"
@@ -276,7 +262,6 @@ msgstr ""
"\n"
#: ../parser_main.c:604 ../parser_main.c:642 ../parser_main.c:505
#: ../parser_main.c:828
#, c-format
msgid ""
"%s: Warning! You've set this program setuid root.\n"
@@ -289,7 +274,7 @@ msgstr ""
"\n"
#: ../parser_main.c:704 ../parser_main.c:813 ../parser_main.c:836
#: ../parser_main.c:946 ../parser_main.c:860 ../parser_main.c:1038
#: ../parser_main.c:946 ../parser_main.c:860
#, c-format
msgid "Error: Could not read profile %s: %s.\n"
msgstr "Erro: Não foi possível ler o perfil %s: %s.\n"
@@ -311,36 +296,26 @@ msgstr "Erro: Não foi possível ler o perfil %s: %s.\n"
#: parser_yacc.y:1166 parser_yacc.y:1170 parser_yacc.y:1180 parser_yacc.y:1190
#: parser_yacc.y:1298 parser_yacc.y:1376 parser_yacc.y:1479 parser_yacc.y:1490
#: parser_yacc.y:1565 parser_yacc.y:1583 parser_yacc.y:1590 parser_yacc.y:1639
#: ../network.c:314 ../af_unix.cc:203 ../parser_misc.c:215 ../parser_misc.c:939
#: parser_yacc.y:343 parser_yacc.y:367 parser_yacc.y:533 parser_yacc.y:543
#: parser_yacc.y:660 parser_yacc.y:741 parser_yacc.y:750 parser_yacc.y:1171
#: parser_yacc.y:1219 parser_yacc.y:1255 parser_yacc.y:1264 parser_yacc.y:1268
#: parser_yacc.y:1278 parser_yacc.y:1288 parser_yacc.y:1382 parser_yacc.y:1460
#: parser_yacc.y:1592 parser_yacc.y:1597 parser_yacc.y:1674 parser_yacc.y:1692
#: parser_yacc.y:1699 parser_yacc.y:1748 ../network.c:315 ../af_unix.cc:194
#: ../network.c:314 ../af_unix.cc:203
msgid "Memory allocation error."
msgstr "Erro de alocação de memória."
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#: ../parser_main.c:975
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr "Cache carregado com sucesso para \"%s\".\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#: ../parser_main.c:979
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr "Cache recarregado com sucesso para \"%s\".\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#: ../parser_main.c:1132
#, c-format
msgid "%s: Errors found in file. Aborting.\n"
msgstr "%s: Erros encontrados no arquivo. Interrompendo.\n"
#: ../parser_misc.c:426 ../parser_misc.c:597 ../parser_misc.c:339
#: ../parser_misc.c:532
msgid ""
"Uppercase qualifiers \"RWLIMX\" are deprecated, please convert to lowercase\n"
"See the apparmor.d(5) manpage for details.\n"
@@ -351,19 +326,16 @@ msgstr ""
#: ../parser_misc.c:467 ../parser_misc.c:474 ../parser_misc.c:638
#: ../parser_misc.c:645 ../parser_misc.c:380 ../parser_misc.c:387
#: ../parser_misc.c:573 ../parser_misc.c:580
msgid "Conflict 'a' and 'w' perms are mutually exclusive."
msgstr "As permissões 'a' e 'w' de conflito são mutuamente exclusivas."
#: ../parser_misc.c:491 ../parser_misc.c:662 ../parser_misc.c:404
#: ../parser_misc.c:597
msgid "Exec qualifier 'i' invalid, conflicting qualifier already specified"
msgstr ""
"Qualificador de execução 'i' inválido. Qualificador em conflito já "
"especificado"
#: ../parser_misc.c:502 ../parser_misc.c:673 ../parser_misc.c:415
#: ../parser_misc.c:608
#, c-format
msgid ""
"Unconfined exec qualifier (%c%c) allows some dangerous environment variables "
@@ -375,7 +347,6 @@ msgstr ""
#: ../parser_misc.c:510 ../parser_misc.c:551 ../parser_misc.c:681
#: ../parser_misc.c:722 ../parser_misc.c:423 ../parser_misc.c:464
#: ../parser_misc.c:616 ../parser_misc.c:657
#, c-format
msgid "Exec qualifier '%c' invalid, conflicting qualifier already specified"
msgstr ""
@@ -384,7 +355,6 @@ msgstr ""
#: ../parser_misc.c:537 ../parser_misc.c:545 ../parser_misc.c:708
#: ../parser_misc.c:716 ../parser_misc.c:450 ../parser_misc.c:458
#: ../parser_misc.c:643 ../parser_misc.c:651
#, c-format
msgid ""
"Exec qualifier '%c%c' invalid, conflicting qualifier already specified"
@@ -393,13 +363,11 @@ msgstr ""
"especificado"
#: ../parser_misc.c:593 ../parser_misc.c:764 ../parser_misc.c:506
#: ../parser_misc.c:699
#, c-format
msgid "Internal: unexpected mode character '%c' in input"
msgstr "Interno: caractere '%c' inesperado de modo na entrada"
#: ../parser_misc.c:615 ../parser_misc.c:786 ../parser_misc.c:528
#: ../parser_misc.c:721
#, c-format
msgid "Internal error generated invalid perm 0x%llx\n"
msgstr "Erro interno gerou permissão inválida 0x%llx\n"
@@ -411,70 +379,60 @@ msgid "AppArmor parser error: %s\n"
msgstr "Erro do analisador do AppArmor: %s\n"
#: ../parser_merge.c:92 ../parser_merge.c:91 ../parser_merge.c:83
#: ../parser_merge.c:71
msgid "Couldn't merge entries. Out of Memory\n"
msgstr "Impossível mesclar entradas. Memória Insuficiente\n"
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#: ../parser_merge.c:93
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr "perfil % s: mesclou regra %s com conflitantes x modificadores\n"
msgstr ""
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
msgstr "O anexo do perfil deve começar com um '/'."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348 parser_yacc.y:407
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
"Nomes de perfil devem começar com um '/', namespace ou palavra-chave "
"'perfil' ou 'chapéu'."
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384 parser_yacc.y:449
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
msgid "Failed to create alias %s -> %s\n"
msgstr "Falha ao criar o álias %s -> %s\n"
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506 parser_yacc.y:581
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
"Sinalizador de perfil chroot_relative está em conflito com namespace_relative"
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510 parser_yacc.y:585
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr ""
"Sinalizador de perfil mediate_deleted está em conflito com delegate_deleted"
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513 parser_yacc.y:588
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
"Sinalizador de perfil attach_disconnected está em conflito com "
"no_attach_disconnected"
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516 parser_yacc.y:591
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr ""
"Sinalizador de perfil chroot_attach está em conflito com chroot_no_attach"
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530 parser_yacc.y:607
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
msgstr "O flag de perfil 'debug' não é mais válido."
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552 parser_yacc.y:629
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552
#, c-format
msgid "Invalid profile flag: %s."
msgstr "Flag de perfil inválido: %s."
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
#: parser_yacc.y:673
msgid "Assert: `rule' returned NULL."
msgstr "Declarar: `rule' retornou NULL."
#: parser_yacc.y:501 parser_yacc.y:546 parser_yacc.y:552 parser_yacc.y:584
#: parser_yacc.y:598 parser_yacc.y:630 parser_yacc.y:677 parser_yacc.y:709
#: parser_yacc.y:598 parser_yacc.y:630
msgid ""
"Invalid mode, in deny rules 'x' must not be preceded by exec qualifier 'i', "
"'p', or 'u'"
@@ -482,84 +440,82 @@ msgstr ""
"Modo inválido. Nas regras de negação, o 'x' não deve ser precedido pelo "
"qualificador de execução 'i', 'p' ou 'u'"
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602 parser_yacc.y:681
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602
msgid ""
"Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', 'c', or 'u'"
msgstr ""
"Modo inválido. O 'x' deve ser precedido pelo qualificador de execução 'i', "
"'p','c' ou 'u'"
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633 parser_yacc.y:712
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633
msgid "Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', or 'u'"
msgstr ""
"Modo inválido; 'x' deve ser precedido pelo qualificador de execução 'i', 'p' "
"ou 'u'"
#: parser_yacc.y:574 parser_yacc.y:612 parser_yacc.y:614 parser_yacc.y:660
#: parser_yacc.y:739
msgid "Assert: `network_rule' return invalid protocol."
msgstr "Declarar: `network_rule' retornou um protocolo inválido."
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786 parser_yacc.y:867
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr "Declarar: `change_profile' retornou NULL."
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810 parser_yacc.y:905
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
msgstr "Declarar: 'hat rule' retornou NULL."
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819 parser_yacc.y:914
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr "Declaração: a regra 'local_profile' retornou NULO."
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992 parser_yacc.y:1077
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
msgid "Unset boolean variable %s used in if-expression"
msgstr "Cancelar a definição da variável booleana %s usada na expressão if"
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092 parser_yacc.y:1181
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092
msgid "unsafe rule missing exec permissions"
msgstr "permissões de execução não seguras com regra ausente"
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060 parser_yacc.y:1148
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060
msgid "subset can only be used with link rules."
msgstr "subconjunto somente deve ser usado com regras de link."
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062 parser_yacc.y:1150
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062
msgid "link and exec perms conflict on a file rule using ->"
msgstr ""
"conflito de permissões de link e execução em uma regra de arquivo usando ->"
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064 parser_yacc.y:1152
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064
msgid "link perms are not allowed on a named profile transition.\n"
msgstr ""
"permissões de link não são permitidas em uma transição de perfil nomeada.\n"
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109 parser_yacc.y:1198
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109
#, c-format
msgid "missing an end of line character? (entry: %s)"
msgstr "caractere de fim de linha ausente? (entrada: %s)"
#: parser_yacc.y:975 parser_yacc.y:985 parser_yacc.y:1057 parser_yacc.y:1067
#: parser_yacc.y:1145 parser_yacc.y:1155 parser_yacc.y:1234 parser_yacc.y:1244
#: parser_yacc.y:1145 parser_yacc.y:1155
msgid "Invalid network entry."
msgstr "Entrada de rede inválida."
#: parser_yacc.y:1039 parser_yacc.y:1048 parser_yacc.y:1254 parser_yacc.y:1510
#: parser_yacc.y:1617
#, c-format
msgid "Invalid capability %s."
msgstr "Recurso inválido %s."
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525 parser_yacc.y:1637
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr "Erro do analisador AppArmor para %s%s%s na linha %d: %s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr "Erro do analisador AppArmor,%s%s linha %d: %s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
@@ -567,7 +523,6 @@ msgid "%s: Illegal open {, nesting groupings not allowed\n"
msgstr "%s: Abertura ilegal {, agrupamentos aninhados não permitidos\n"
#: ../parser_regex.c:265 ../parser_regex.c:274 ../parser_regex.c:278
#: ../parser_regex.c:306
#, c-format
msgid "%s: Regex grouping error: Invalid number of items between {}\n"
msgstr ""
@@ -575,7 +530,6 @@ msgstr ""
"{}\n"
#: ../parser_regex.c:271 ../parser_regex.c:280 ../parser_regex.c:284
#: ../parser_regex.c:312
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close }, no matching open { detected\n"
@@ -584,7 +538,6 @@ msgstr ""
"abertura correspondente { detectada\n"
#: ../parser_regex.c:337 ../parser_regex.c:343 ../parser_regex.c:361
#: ../parser_regex.c:403
#, c-format
msgid ""
"%s: Regex grouping error: Unclosed grouping or character class, expecting "
@@ -599,19 +552,16 @@ msgid "%s: Internal buffer overflow detected, %d characters exceeded\n"
msgstr "%s: Overflow de buffer interno detectado; %d caracteres excedidos\n"
#: ../parser_regex.c:355 ../parser_regex.c:361 ../parser_regex.c:377
#: ../parser_regex.c:419
#, c-format
msgid "%s: Unable to parse input line '%s'\n"
msgstr "%s: Impossível analisar linha de entrada '%s'\n"
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#: ../parser_regex.c:487
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr "%s: Nome do perfil inválido '%s' - expressão regular inválida\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#: ../parser_policy.c:383
#, c-format
msgid "ERROR merging rules for profile %s, failed to load\n"
msgstr "ERRO ao fundir regras para o perfil %s; falha ao carregar\n"
@@ -629,7 +579,6 @@ msgstr ""
"\t'**' somente podem ser usados no final de uma regra.\n"
#: ../parser_policy.c:279 ../parser_policy.c:359 ../parser_policy.c:332
#: ../parser_policy.c:340
#, c-format
msgid "ERROR processing regexs for profile %s, failed to load\n"
msgstr ""
@@ -637,13 +586,11 @@ msgstr ""
"carregar\n"
#: ../parser_policy.c:306 ../parser_policy.c:389 ../parser_policy.c:362
#: ../parser_policy.c:370
#, c-format
msgid "ERROR expanding variables for profile %s, failed to load\n"
msgstr "ERRO ao expandir variáveis para o perfil %s; falha ao carregar\n"
#: ../parser_policy.c:390 ../parser_policy.c:382 ../parser_policy.c:355
#: ../parser_policy.c:363
#, c-format
msgid "ERROR adding hat access rule for profile %s\n"
msgstr "ERRO ao adicionar a regra de acesso hat para o perfil %s\n"
@@ -677,170 +624,164 @@ msgstr ""
"%s: Erros encontrados no pós-processamento de regras de combinação. "
"Interrompendo.\n"
#: parser_lex.l:180 parser_lex.l:186 parser_lex.l:187
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr "Não foi possível processar a inclusão do diretório '%s' em '%s'"
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr "Recurso buffer está lotado."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041 ../parser_main.c:1332 ../parser_main.c:1354
#: ../parser_misc.c:280 ../parser_misc.c:299 ../parser_misc.c:308
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "Memória insuficiente"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
msgid "Can't create cache directory: %s\n"
msgstr "Não é possível criar o diretório de cache: %s\n"
msgstr ""
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr "Arquivo no local do diretório de cache: %s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
msgid "Can't update cache directory: %s\n"
msgstr "Não é possível atualizar o diretório de cache: %s\n"
msgstr ""
#: ../parser_misc.c:833
#, c-format
msgid "Internal: unexpected DBus mode character '%c' in input"
msgstr "Interno: caractere mode DBus '%c' inesperado na entrada"
msgstr ""
#: ../parser_misc.c:857
#, c-format
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr "Erro interno gerou DBus perm 0x%x inválido\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621 parser_yacc.y:700
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr "Prefixo deny não é permitido"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658 parser_yacc.y:737
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr "Prefixo owner não é permitido"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr "Prefixo owner não é permitido em regras de montagem"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr "Prefixo owner não é permitido em regras de dbus"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr "Prefixo owner não é permitido em regras de capacidade"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613 parser_yacc.y:1722
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr "montagem condicional inválida %s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628 parser_yacc.y:1737
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr "regra de montagem inválida"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635 parser_yacc.y:1744
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr "condições do ponto de montagem não são suportadas atualmente"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650 parser_yacc.y:1759
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr "pivotroot condicional inválido '%s'"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236 ../parser_regex.c:264
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
"%s: Erro de agrupamento de regex: Fechamento inválido ], nenhuma abertura "
"compatível ] foi detectada\n"
#: ../parser_regex.c:257 ../parser_regex.c:256 ../parser_regex.c:284
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
"%s: Erro de agrupamento de regex: Excedeu o aninhamento máximo de {}\n"
#: ../parser_policy.c:366 ../parser_policy.c:339 ../parser_policy.c:347
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
"ERRO processando regras do policydb para o perfil %s, falha ao carregar\n"
#: ../parser_policy.c:396 ../parser_policy.c:369 ../parser_policy.c:377
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr "Erro substituindo pseudônimos para o perfil %s, falha ao carregar\n"
msgstr ""
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr "%s: Não foi possível escrever %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr ""
"Erro: Não foi possível ler o perfil binário ou arquivo cache %s: %s.\n"
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr "Erro: Não foi possível ler o arquivo cache '%s', pulando...\n"
msgstr ""
#: ../parser_misc.c:575 ../parser_misc.c:768
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr "Interno: modo %s caractere '%c' inesperado na entrada"
msgstr ""
#: ../parser_misc.c:599 ../parser_misc.c:792
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr "Erro interno gerou %s perm 0x%x inválido\n"
msgstr ""
#: parser_yacc.y:703 parser_yacc.y:784
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr "prefixo owner não permitido em regras de montagem"
msgstr ""
#: parser_yacc.y:720 parser_yacc.y:801
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr "prefixo owner não permitido em regras dbus"
msgstr ""
#: parser_yacc.y:736 parser_yacc.y:817
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr "prefixo owner não permitido em regras de sinal"
msgstr ""
#: parser_yacc.y:752 parser_yacc.y:833
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr "prefixo owner não permitido em regras ptrace"
msgstr ""
#: parser_yacc.y:768 parser_yacc.y:849 parser_yacc.y:869
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr "prefixo owner não permitido em regras unix"
msgstr ""
#: parser_yacc.y:794 parser_yacc.y:885
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr "prefixo owner não permitido em regras de capacidade"
msgstr ""
#: parser_yacc.y:1293 parser_yacc.y:1377
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr "regra dbus: grupo condicional inválido %s=()"
msgstr ""
#: parser_yacc.y:1371 parser_yacc.y:1455
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr "regra unix: grupo condicional inválido %s=()"
msgstr ""
#: ../parser_regex.c:368 ../parser_regex.c:410
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr "%s: Erro regex: caractere de escape à direita '\\'\n"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -11,142 +11,130 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2022-04-25 20:47+0000\n"
"Last-Translator: Sabri Ünal <Unknown>\n"
"PO-Revision-Date: 2013-11-15 03:41+0000\n"
"Last-Translator: Ömer Kehri <Unknown>\n"
"Language-Team: turkish <i18n@suse.de>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2022-04-26 06:26+0000\n"
"X-Generator: Launchpad (build 1445a2883c2be41f8e3d484e7c1c2b98b0a1caf9)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:33+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: tr\n"
#: ../parser_include.c:113 ../parser_include.c:111 ../parser_include.c:96
#: ../parser_include.c:113 ../parser_include.c:111
msgid "Error: Out of memory.\n"
msgstr "Hata: Yetersiz bellek.\n"
#: ../parser_include.c:123 ../parser_include.c:121 ../parser_include.c:106
#: ../parser_include.c:123 ../parser_include.c:121
#, c-format
msgid "Error: basedir %s is not a directory, skipping.\n"
msgstr "Hata: %s temel dizini bir dizin değil, atlanıyor.\n"
#: ../parser_include.c:137 ../parser_include.c:122
#: ../parser_include.c:137
#, c-format
msgid "Error: Could not add directory %s to search path.\n"
msgstr "Hata: %s dizini arama yollarına eklenemedi.\n"
#: ../parser_include.c:147 ../parser_include.c:151 ../parser_include.c:136
#: ../parser_include.c:147 ../parser_include.c:151
msgid "Error: Could not allocate memory.\n"
msgstr "Hata: Bellek tahsis edilemedi.\n"
#: ../parser_interface.c:69 ../parser_interface.c:72 ../parser_interface.c:49
#: ../parser_interface.c:52
msgid "Bad write position\n"
msgstr "Hatalı yazma pozisyonu\n"
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
#: ../parser_interface.c:55
msgid "Permission denied\n"
msgstr "İzin verilmedi\n"
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
#: ../parser_interface.c:58
msgid "Out of memory\n"
msgstr "Yetersiz bellek\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
#: ../parser_interface.c:61
msgid "Couldn't copy profile: Bad memory address\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
#: ../parser_interface.c:64
msgid "Profile doesn't conform to protocol\n"
msgstr "Profil protokole uymuyor\n"
#: ../parser_interface.c:84 ../parser_interface.c:87 ../parser_interface.c:64
#: ../parser_interface.c:67
msgid "Profile does not match signature\n"
msgstr "Profil imzası tutmuyor\n"
#: ../parser_interface.c:87 ../parser_interface.c:90 ../parser_interface.c:67
#: ../parser_interface.c:70
msgid "Profile version not supported by Apparmor module\n"
msgstr "Profil sürümü Apparmor modülü tarafından desteklenmiyor\n"
#: ../parser_interface.c:90 ../parser_interface.c:93 ../parser_interface.c:70
#: ../parser_interface.c:73
msgid "Profile already exists\n"
msgstr "Profil zaten mevcut\n"
#: ../parser_interface.c:93 ../parser_interface.c:96 ../parser_interface.c:73
#: ../parser_interface.c:76
msgid "Profile doesn't exist\n"
msgstr "Profil mevcut değil\n"
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
#: ../parser_interface.c:79
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr ""
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#: ../parser_interface.c:82
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "Bilinmeyen hata (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119 ../parser_interface.c:96
#: ../parser_interface.c:100
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
#, c-format
msgid "%s: Unable to add \"%s\". "
msgstr "%s: \"%s\" eklenemedi. "
#: ../parser_interface.c:121 ../parser_interface.c:124
#: ../parser_interface.c:101 ../parser_interface.c:105
#: ../parser_interface.c:101
#, c-format
msgid "%s: Unable to replace \"%s\". "
msgstr "%s: \"%s\" değiştirilemedi. "
#: ../parser_interface.c:126 ../parser_interface.c:129
#: ../parser_interface.c:106 ../parser_interface.c:110
#: ../parser_interface.c:106
#, c-format
msgid "%s: Unable to remove \"%s\". "
msgstr "%s: \"%s\" silinemedi. "
#: ../parser_interface.c:131 ../parser_interface.c:134
#: ../parser_interface.c:111 ../parser_interface.c:115
#: ../parser_interface.c:111
#, c-format
msgid "%s: Unable to write to stdout\n"
msgstr "%s: stdout'a yazılamadı.\n"
#: ../parser_interface.c:135 ../parser_interface.c:138
#: ../parser_interface.c:115 ../parser_interface.c:119
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: çıkış dosyasına yazılamıyor\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
#: ../parser_interface.c:118 ../parser_interface.c:142
#: ../parser_interface.c:123 ../parser_interface.c:147
#, c-format
msgid "%s: ASSERT: Invalid option: %d\n"
msgstr "%s: ASSERT: Geçersiz seçenek: %d\n"
#: ../parser_interface.c:147 ../parser_interface.c:150
#: ../parser_interface.c:127 ../parser_interface.c:132
#: ../parser_interface.c:127
#, c-format
msgid "Addition succeeded for \"%s\".\n"
msgstr "\"%s\" için ekleme başarılı oldu.\n"
#: ../parser_interface.c:151 ../parser_interface.c:154
#: ../parser_interface.c:131 ../parser_interface.c:136
#: ../parser_interface.c:131
#, c-format
msgid "Replacement succeeded for \"%s\".\n"
msgstr "\"%s\" için değiştirme başarılı oldu.\n"
#: ../parser_interface.c:155 ../parser_interface.c:158
#: ../parser_interface.c:135 ../parser_interface.c:140
#: ../parser_interface.c:135
#, c-format
msgid "Removal succeeded for \"%s\".\n"
msgstr "\"%s\" için silme başarılı oldu.\n"
@@ -158,7 +146,7 @@ msgstr ""
"PANİK hatalı arttırma arabelleği %p pozisyon %p ext %p boyut %d res %p\n"
#: ../parser_interface.c:656 ../parser_interface.c:658
#: ../parser_interface.c:446 ../parser_interface.c:476
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr ""
@@ -203,7 +191,7 @@ msgid "%s: Unable to write entire profile entry\n"
msgstr "%s: Profil girdisinin tamamı yazılamadı\n"
#: ../parser_interface.c:839 ../parser_interface.c:831
#: ../parser_interface.c:593 ../parser_interface.c:579
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr ""
@@ -211,9 +199,9 @@ msgstr ""
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr "'%s' açılamadı"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173 parser_lex.l:174
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr ""
@@ -239,7 +227,7 @@ msgstr ""
msgid "Found unexpected character: '%s'"
msgstr "Beklenmeyen karakter bulundu: '%s'"
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428 parser_lex.l:474
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr ""
@@ -259,7 +247,6 @@ msgid "%s: Could not allocate memory for subdomainbase mount point\n"
msgstr "%s: subdomainbase bağlantı noktası için bellek ayrılamadı\n"
#: ../parser_main.c:577 ../parser_main.c:616 ../parser_main.c:479
#: ../parser_main.c:1444
#, c-format
msgid ""
"Warning: unable to find a suitable fs in %s, is it mounted?\n"
@@ -267,7 +254,6 @@ msgid ""
msgstr ""
#: ../parser_main.c:597 ../parser_main.c:635 ../parser_main.c:498
#: ../parser_main.c:822
#, c-format
msgid ""
"%s: Sorry. You need root privileges to run this program.\n"
@@ -277,7 +263,6 @@ msgstr ""
"\n"
#: ../parser_main.c:604 ../parser_main.c:642 ../parser_main.c:505
#: ../parser_main.c:828
#, c-format
msgid ""
"%s: Warning! You've set this program setuid root.\n"
@@ -289,7 +274,7 @@ msgstr ""
"\n"
#: ../parser_main.c:704 ../parser_main.c:813 ../parser_main.c:836
#: ../parser_main.c:946 ../parser_main.c:860 ../parser_main.c:1038
#: ../parser_main.c:946 ../parser_main.c:860
#, c-format
msgid "Error: Could not read profile %s: %s.\n"
msgstr "Hata: %s profili okunamadı: %s.\n"
@@ -311,36 +296,26 @@ msgstr "Hata: %s profili okunamadı: %s.\n"
#: parser_yacc.y:1166 parser_yacc.y:1170 parser_yacc.y:1180 parser_yacc.y:1190
#: parser_yacc.y:1298 parser_yacc.y:1376 parser_yacc.y:1479 parser_yacc.y:1490
#: parser_yacc.y:1565 parser_yacc.y:1583 parser_yacc.y:1590 parser_yacc.y:1639
#: ../network.c:314 ../af_unix.cc:203 ../parser_misc.c:215 ../parser_misc.c:939
#: parser_yacc.y:343 parser_yacc.y:367 parser_yacc.y:533 parser_yacc.y:543
#: parser_yacc.y:660 parser_yacc.y:741 parser_yacc.y:750 parser_yacc.y:1171
#: parser_yacc.y:1219 parser_yacc.y:1255 parser_yacc.y:1264 parser_yacc.y:1268
#: parser_yacc.y:1278 parser_yacc.y:1288 parser_yacc.y:1382 parser_yacc.y:1460
#: parser_yacc.y:1592 parser_yacc.y:1597 parser_yacc.y:1674 parser_yacc.y:1692
#: parser_yacc.y:1699 parser_yacc.y:1748 ../network.c:315 ../af_unix.cc:194
#: ../network.c:314 ../af_unix.cc:203
msgid "Memory allocation error."
msgstr "Bellek ayırma hatası."
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#: ../parser_main.c:975
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#: ../parser_main.c:979
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#: ../parser_main.c:1132
#, c-format
msgid "%s: Errors found in file. Aborting.\n"
msgstr "%s: Dosyada hatalar bulundu. Durduruluyor.\n"
#: ../parser_misc.c:426 ../parser_misc.c:597 ../parser_misc.c:339
#: ../parser_misc.c:532
msgid ""
"Uppercase qualifiers \"RWLIMX\" are deprecated, please convert to lowercase\n"
"See the apparmor.d(5) manpage for details.\n"
@@ -351,18 +326,15 @@ msgstr ""
#: ../parser_misc.c:467 ../parser_misc.c:474 ../parser_misc.c:638
#: ../parser_misc.c:645 ../parser_misc.c:380 ../parser_misc.c:387
#: ../parser_misc.c:573 ../parser_misc.c:580
msgid "Conflict 'a' and 'w' perms are mutually exclusive."
msgstr ""
#: ../parser_misc.c:491 ../parser_misc.c:662 ../parser_misc.c:404
#: ../parser_misc.c:597
msgid "Exec qualifier 'i' invalid, conflicting qualifier already specified"
msgstr ""
"Çalıştırma niteleyicisi 'i' geçersiz, çakışan niteleyici zaten belirtilmiş"
#: ../parser_misc.c:502 ../parser_misc.c:673 ../parser_misc.c:415
#: ../parser_misc.c:608
#, c-format
msgid ""
"Unconfined exec qualifier (%c%c) allows some dangerous environment variables "
@@ -371,7 +343,6 @@ msgstr ""
#: ../parser_misc.c:510 ../parser_misc.c:551 ../parser_misc.c:681
#: ../parser_misc.c:722 ../parser_misc.c:423 ../parser_misc.c:464
#: ../parser_misc.c:616 ../parser_misc.c:657
#, c-format
msgid "Exec qualifier '%c' invalid, conflicting qualifier already specified"
msgstr ""
@@ -379,20 +350,17 @@ msgstr ""
#: ../parser_misc.c:537 ../parser_misc.c:545 ../parser_misc.c:708
#: ../parser_misc.c:716 ../parser_misc.c:450 ../parser_misc.c:458
#: ../parser_misc.c:643 ../parser_misc.c:651
#, c-format
msgid ""
"Exec qualifier '%c%c' invalid, conflicting qualifier already specified"
msgstr ""
#: ../parser_misc.c:593 ../parser_misc.c:764 ../parser_misc.c:506
#: ../parser_misc.c:699
#, c-format
msgid "Internal: unexpected mode character '%c' in input"
msgstr "Dahili: girdide beklenmeyen mod karakteri '%c'"
#: ../parser_misc.c:615 ../parser_misc.c:786 ../parser_misc.c:528
#: ../parser_misc.c:721
#, c-format
msgid "Internal error generated invalid perm 0x%llx\n"
msgstr ""
@@ -404,12 +372,10 @@ msgid "AppArmor parser error: %s\n"
msgstr "AppArmor inceleyici hatası: %s\n"
#: ../parser_merge.c:92 ../parser_merge.c:91 ../parser_merge.c:83
#: ../parser_merge.c:71
msgid "Couldn't merge entries. Out of Memory\n"
msgstr "Girdiler birleştirilemiyor. Yetersiz bellek\n"
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#: ../parser_merge.c:93
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr ""
@@ -418,120 +384,117 @@ msgstr ""
msgid "Profile attachment must begin with a '/'."
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348 parser_yacc.y:407
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr ""
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384 parser_yacc.y:449
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
msgid "Failed to create alias %s -> %s\n"
msgstr ""
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506 parser_yacc.y:581
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr ""
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510 parser_yacc.y:585
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr ""
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513 parser_yacc.y:588
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr ""
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516 parser_yacc.y:591
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr ""
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530 parser_yacc.y:607
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
msgstr ""
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552 parser_yacc.y:629
#: parser_yacc.y:463 parser_yacc.y:506 parser_yacc.y:552
#, c-format
msgid "Invalid profile flag: %s."
msgstr ""
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
#: parser_yacc.y:673
msgid "Assert: `rule' returned NULL."
msgstr "Assert: `rule' NULL döndürdü."
#: parser_yacc.y:501 parser_yacc.y:546 parser_yacc.y:552 parser_yacc.y:584
#: parser_yacc.y:598 parser_yacc.y:630 parser_yacc.y:677 parser_yacc.y:709
#: parser_yacc.y:598 parser_yacc.y:630
msgid ""
"Invalid mode, in deny rules 'x' must not be preceded by exec qualifier 'i', "
"'p', or 'u'"
msgstr ""
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602 parser_yacc.y:681
#: parser_yacc.y:524 parser_yacc.y:556 parser_yacc.y:602
msgid ""
"Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', 'c', or 'u'"
msgstr ""
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633 parser_yacc.y:712
#: parser_yacc.y:549 parser_yacc.y:587 parser_yacc.y:633
msgid "Invalid mode, 'x' must be preceded by exec qualifier 'i', 'p', or 'u'"
msgstr ""
"Geçersiz mod; 'x', çalıştırma değişkenleri 'i', 'p' ya da 'u'dan sonra "
"gelmelidir."
#: parser_yacc.y:574 parser_yacc.y:612 parser_yacc.y:614 parser_yacc.y:660
#: parser_yacc.y:739
msgid "Assert: `network_rule' return invalid protocol."
msgstr ""
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786 parser_yacc.y:867
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr ""
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810 parser_yacc.y:905
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
msgstr "Assert: `hat rule' NULL döndürdü."
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819 parser_yacc.y:914
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr ""
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992 parser_yacc.y:1077
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
msgid "Unset boolean variable %s used in if-expression"
msgstr "If deyimi içinde ayarlanmamış boolean değişkeni %s"
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092 parser_yacc.y:1181
#: parser_yacc.y:882 parser_yacc.y:986 parser_yacc.y:1092
msgid "unsafe rule missing exec permissions"
msgstr ""
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060 parser_yacc.y:1148
#: parser_yacc.y:901 parser_yacc.y:954 parser_yacc.y:1060
msgid "subset can only be used with link rules."
msgstr ""
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062 parser_yacc.y:1150
#: parser_yacc.y:903 parser_yacc.y:956 parser_yacc.y:1062
msgid "link and exec perms conflict on a file rule using ->"
msgstr ""
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064 parser_yacc.y:1152
#: parser_yacc.y:905 parser_yacc.y:958 parser_yacc.y:1064
msgid "link perms are not allowed on a named profile transition.\n"
msgstr ""
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109 parser_yacc.y:1198
#: parser_yacc.y:921 parser_yacc.y:1003 parser_yacc.y:1109
#, c-format
msgid "missing an end of line character? (entry: %s)"
msgstr "eksik satır sonu karakteri? (girdi: %s)"
#: parser_yacc.y:975 parser_yacc.y:985 parser_yacc.y:1057 parser_yacc.y:1067
#: parser_yacc.y:1145 parser_yacc.y:1155 parser_yacc.y:1234 parser_yacc.y:1244
#: parser_yacc.y:1145 parser_yacc.y:1155
msgid "Invalid network entry."
msgstr ""
#: parser_yacc.y:1039 parser_yacc.y:1048 parser_yacc.y:1254 parser_yacc.y:1510
#: parser_yacc.y:1617
#, c-format
msgid "Invalid capability %s."
msgstr ""
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525 parser_yacc.y:1637
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr ""
@@ -547,13 +510,11 @@ msgid "%s: Illegal open {, nesting groupings not allowed\n"
msgstr "%s: Kural dışıık {, iç içe konan gruplamalara izin verilmez\n"
#: ../parser_regex.c:265 ../parser_regex.c:274 ../parser_regex.c:278
#: ../parser_regex.c:306
#, c-format
msgid "%s: Regex grouping error: Invalid number of items between {}\n"
msgstr "%s: Regex gruplama hatası: {} içinde geçersiz öğe sayısı\n"
#: ../parser_regex.c:271 ../parser_regex.c:280 ../parser_regex.c:284
#: ../parser_regex.c:312
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close }, no matching open { detected\n"
@@ -562,7 +523,6 @@ msgstr ""
"bulunamadı\n"
#: ../parser_regex.c:337 ../parser_regex.c:343 ../parser_regex.c:361
#: ../parser_regex.c:403
#, c-format
msgid ""
"%s: Regex grouping error: Unclosed grouping or character class, expecting "
@@ -577,19 +537,16 @@ msgid "%s: Internal buffer overflow detected, %d characters exceeded\n"
msgstr "%s: Dahili ara bellek taşması saptandı, %d karakter aşıldı\n"
#: ../parser_regex.c:355 ../parser_regex.c:361 ../parser_regex.c:377
#: ../parser_regex.c:419
#, c-format
msgid "%s: Unable to parse input line '%s'\n"
msgstr "%s: Giriş satırı '%s' incelenemedi\n"
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#: ../parser_regex.c:487
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#: ../parser_policy.c:383
#, c-format
msgid "ERROR merging rules for profile %s, failed to load\n"
msgstr ""
@@ -608,20 +565,17 @@ msgstr ""
"\t'**' sadece bir kuralın sonunda kullanılabilir.\n"
#: ../parser_policy.c:279 ../parser_policy.c:359 ../parser_policy.c:332
#: ../parser_policy.c:340
#, c-format
msgid "ERROR processing regexs for profile %s, failed to load\n"
msgstr "HATA: %s profilinin regex'leri işlenemedi, yükleme başarısız oldu\n"
#: ../parser_policy.c:306 ../parser_policy.c:389 ../parser_policy.c:362
#: ../parser_policy.c:370
#, c-format
msgid "ERROR expanding variables for profile %s, failed to load\n"
msgstr ""
"HATA: %s profili için değişkenler genişletilemedi, yükleme başarısız oldu\n"
#: ../parser_policy.c:390 ../parser_policy.c:382 ../parser_policy.c:355
#: ../parser_policy.c:363
#, c-format
msgid "ERROR adding hat access rule for profile %s\n"
msgstr ""
@@ -652,7 +606,7 @@ msgid "%s: Errors found in combining rules postprocessing. Aborting.\n"
msgstr ""
"%s: Kural birleştirme sonrası işlemlerde hata bulundu. Durduruluyor.\n"
#: parser_lex.l:180 parser_lex.l:186 parser_lex.l:187
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr ""
@@ -662,10 +616,9 @@ msgid "Feature buffer full."
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041 ../parser_main.c:1332 ../parser_main.c:1354
#: ../parser_misc.c:280 ../parser_misc.c:299 ../parser_misc.c:308
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "Yetersiz bellek"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
@@ -692,11 +645,11 @@ msgstr ""
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621 parser_yacc.y:700
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658 parser_yacc.y:737
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr ""
@@ -712,41 +665,41 @@ msgstr ""
msgid "owner prefix not allow on capability rules"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613 parser_yacc.y:1722
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628 parser_yacc.y:1737
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635 parser_yacc.y:1744
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650 parser_yacc.y:1759
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236 ../parser_regex.c:264
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr ""
#: ../parser_regex.c:257 ../parser_regex.c:256 ../parser_regex.c:284
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr ""
#: ../parser_policy.c:366 ../parser_policy.c:339 ../parser_policy.c:347
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr ""
#: ../parser_policy.c:396 ../parser_policy.c:369 ../parser_policy.c:377
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr ""
@@ -766,51 +719,51 @@ msgstr ""
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr ""
#: ../parser_misc.c:575 ../parser_misc.c:768
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr ""
#: ../parser_misc.c:599 ../parser_misc.c:792
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr ""
#: parser_yacc.y:703 parser_yacc.y:784
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr ""
#: parser_yacc.y:720 parser_yacc.y:801
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr ""
#: parser_yacc.y:736 parser_yacc.y:817
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr ""
#: parser_yacc.y:752 parser_yacc.y:833
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr ""
#: parser_yacc.y:768 parser_yacc.y:849 parser_yacc.y:869
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr ""
#: parser_yacc.y:794 parser_yacc.y:885
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr ""
#: parser_yacc.y:1293 parser_yacc.y:1377
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr ""
#: parser_yacc.y:1371 parser_yacc.y:1455
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr ""
#: ../parser_regex.c:368 ../parser_regex.c:410
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr ""

View File

@@ -13,14 +13,14 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2020-05-19 21:52+0000\n"
"Last-Translator: Nazarii Ritter <nazariy.ritter@gmail.com>\n"
"PO-Revision-Date: 2013-11-15 12:27+0000\n"
"Last-Translator: yurchor <Unknown>\n"
"Language-Team: Ukrainian <translation@linux.org.ua>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2020-05-20 05:42+0000\n"
"X-Generator: Launchpad (build 0385b538081bc4718df6fb844a3afc89729c94ce)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:33+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: uk\n"
#: ../parser_include.c:113 ../parser_include.c:111
@@ -747,29 +747,27 @@ msgstr "ПОМИЛКА заміри псевдонімів для профілю
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr "%s: Неможливо записати %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr ""
"Помилка: Не вдалося прочитати бінарний профіль або файл кешу %s: %s.\n"
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr "Помилка: Не вдалося прочитати файл кешу '%s', пропуск…\n"
msgstr ""
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr ""
"Внутрішня помилка: неочікуваний режим %s символу «%c» у вхідних даних"
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr "Внутрішня помилка, спричинена невірним дозволом %s 0x%x\n"
msgstr ""
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"

View File

@@ -6,14 +6,14 @@ msgstr ""
"Project-Id-Version: apparmor-parser\n"
"Report-Msgid-Bugs-To: <apparmor@lists.ubuntu.com>\n"
"POT-Creation-Date: 2014-09-13 00:11-0700\n"
"PO-Revision-Date: 2022-01-15 11:52+0000\n"
"Last-Translator: Yulin Yang <yylteam@icloud.com>\n"
"PO-Revision-Date: 2013-11-15 04:12+0000\n"
"Last-Translator: Novell Language <Unknown>\n"
"Language-Team: Novell Language <language@novell.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2022-01-16 04:32+0000\n"
"X-Generator: Launchpad (build 0072e2709f85567cc6c8d33e98acde9fcc09f491)\n"
"X-Launchpad-Export-Date: 2019-04-18 05:33+0000\n"
"X-Generator: Launchpad (build 18928)\n"
"Language: zh_CN\n"
#: ../parser_include.c:113 ../parser_include.c:111
@@ -40,7 +40,7 @@ msgstr "写入位置无效\n"
#: ../parser_interface.c:72 ../parser_interface.c:75 ../parser_interface.c:52
msgid "Permission denied\n"
msgstr "权限不足\n"
msgstr "拒绝许可权限\n"
#: ../parser_interface.c:75 ../parser_interface.c:78 ../parser_interface.c:55
msgid "Out of memory\n"
@@ -48,7 +48,7 @@ msgstr "内存不足\n"
#: ../parser_interface.c:78 ../parser_interface.c:81 ../parser_interface.c:58
msgid "Couldn't copy profile: Bad memory address\n"
msgstr "无法复制配置文件:内存地址不正确\n"
msgstr ""
#: ../parser_interface.c:81 ../parser_interface.c:84 ../parser_interface.c:61
msgid "Profile doesn't conform to protocol\n"
@@ -72,12 +72,12 @@ msgstr "配置文件不存在\n"
#: ../parser_interface.c:96 ../parser_interface.c:99 ../parser_interface.c:76
msgid "Permission denied; attempted to load a profile while confined?\n"
msgstr "权限被拒绝;试图在受限时加载配置文件?\n"
msgstr ""
#: ../parser_interface.c:99 ../parser_interface.c:102 ../parser_interface.c:79
#, c-format
msgid "Unknown error (%d): %s\n"
msgstr "未知错误 (%d): %s\n"
msgstr ""
#: ../parser_interface.c:116 ../parser_interface.c:119
#: ../parser_interface.c:96
@@ -101,13 +101,13 @@ msgstr "%s: 无法去除\"%s\"。 "
#: ../parser_interface.c:111
#, c-format
msgid "%s: Unable to write to stdout\n"
msgstr "%s: 无法写入到标准输出\n"
msgstr "%s: 无法写入 stdout\n"
#: ../parser_interface.c:135 ../parser_interface.c:138
#: ../parser_interface.c:115
#, c-format
msgid "%s: Unable to write to output file\n"
msgstr "%s: 无法写入输出文件\n"
msgstr ""
#: ../parser_interface.c:138 ../parser_interface.c:162
#: ../parser_interface.c:141 ../parser_interface.c:165
@@ -143,11 +143,11 @@ msgstr "PANIC 无效的递增缓冲区:%p pos %p ext %p size %d res %p\n"
#: ../parser_interface.c:446
#, c-format
msgid "profile %s network rules not enforced\n"
msgstr "配置文件%s网络规则未强制执行\n"
msgstr ""
#: ../parser_interface.c:666
msgid "Unknown pattern type\n"
msgstr "未知模式类型\n"
msgstr ""
#: ../parser_interface.c:750 ../parser_interface.c:902
#: ../parser_interface.c:743 ../parser_interface.c:894
@@ -188,32 +188,32 @@ msgstr "%s: 无法写入整个配置文件项\n"
#: ../parser_interface.c:593
#, c-format
msgid "%s: Unable to write entire profile entry to cache\n"
msgstr "%s: 无法将整个配置文件项写入缓存\n"
msgstr ""
#: parser_lex.l:100 parser_lex.l:163 parser_lex.l:169
#, c-format
msgid "Could not open '%s'"
msgstr "无法打开“%s”"
msgstr ""
#: parser_lex.l:104 parser_lex.l:167 parser_lex.l:173
#, c-format
msgid "fstat failed for '%s'"
msgstr "\"%s\"的 fstat 失败"
msgstr ""
#: parser_lex.l:121
#, c-format
msgid "opendir failed '%s'"
msgstr "打开目录\"%s\"失败"
msgstr ""
#: parser_lex.l:152
#, c-format
msgid "stat failed for '%s'"
msgstr "\"%s\"的 stat 失败"
msgstr ""
#: parser_lex.l:155 parser_lex.l:133 parser_lex.l:139
#, c-format
msgid "Could not open '%s' in '%s'"
msgstr "无法在\"%2$s\"中打开\"%1$s\""
msgstr ""
#: parser_lex.l:284 parser_lex.l:322 parser_lex.l:362 parser_lex.l:399
#: parser_lex.l:469 parser_lex.l:655 parser_lex.l:586 parser_lex.l:638
@@ -223,7 +223,7 @@ msgstr "发现意外字符: '%s'"
#: parser_lex.l:386 parser_lex.l:418 parser_lex.l:428
msgid "Variable declarations do not accept trailing commas"
msgstr "变量声明不接受尾随逗号"
msgstr ""
#: parser_lex.l:420
#, c-format
@@ -233,7 +233,7 @@ msgstr "(network_mode) 发现意外字符:“%s”"
#: ../parser_main.c:333 ../parser_common.c:61 ../parser_common.c:106
#, c-format
msgid "Warning from %s (%s%sline %d): %s"
msgstr "来自%s%s%s行 %d的警告%s"
msgstr ""
#: ../parser_main.c:531
#, c-format
@@ -299,12 +299,12 @@ msgstr "内存分配错误。"
#: ../parser_main.c:740 ../parser_main.c:872 ../parser_main.c:757
#, c-format
msgid "Cached load succeeded for \"%s\".\n"
msgstr "\"%s\"的缓存加载成功。\n"
msgstr ""
#: ../parser_main.c:744 ../parser_main.c:876 ../parser_main.c:761
#, c-format
msgid "Cached reload succeeded for \"%s\".\n"
msgstr "\"%s\"的缓存重加载成功。\n"
msgstr ""
#: ../parser_main.c:910 ../parser_main.c:1058 ../parser_main.c:967
#, c-format
@@ -372,16 +372,16 @@ msgstr "无法合并项。内存不足\n"
#: ../parser_merge.c:111 ../parser_merge.c:113 ../parser_merge.c:105
#, c-format
msgid "profile %s: has merged rule %s with conflicting x modifiers\n"
msgstr "配置文件%s已将规则%s与冲突的x修饰符合并\n"
msgstr ""
#: parser_yacc.y:236 parser_yacc.y:277 parser_yacc.y:320
msgid "Profile attachment must begin with a '/'."
msgstr "配置文件附件必须以\"/\"开头。"
msgstr ""
#: parser_yacc.y:260 parser_yacc.y:302 parser_yacc.y:348
msgid ""
"Profile names must begin with a '/', namespace or keyword 'profile' or 'hat'."
msgstr "配置文件名称必须以\"/\"、命名空间或关键字\"profile\"或\"hat\"开头。"
msgstr ""
#: parser_yacc.y:296 parser_yacc.y:338 parser_yacc.y:384
#, c-format
@@ -390,20 +390,20 @@ msgstr "无法创建别名 %s -> %s\n"
#: parser_yacc.y:417 parser_yacc.y:460 parser_yacc.y:506
msgid "Profile flag chroot_relative conflicts with namespace_relative"
msgstr "配置文件标志 chroot_relative 与 namespace_relative 冲突"
msgstr ""
#: parser_yacc.y:421 parser_yacc.y:464 parser_yacc.y:510
msgid "Profile flag mediate_deleted conflicts with delegate_deleted"
msgstr "配置文件标志 mediate_deleted 与 delegate_deleted 冲突"
msgstr ""
#: parser_yacc.y:424 parser_yacc.y:467 parser_yacc.y:513
msgid ""
"Profile flag attach_disconnected conflicts with no_attach_disconnected"
msgstr "配置文件标志 attach_disconnected 与 no_attach_disconnected 冲突"
msgstr ""
#: parser_yacc.y:427 parser_yacc.y:470 parser_yacc.y:516
msgid "Profile flag chroot_attach conflicts with chroot_no_attach"
msgstr "配置文件标志 chroot_attach 与 chroot_no_attach 冲突"
msgstr ""
#: parser_yacc.y:441 parser_yacc.y:484 parser_yacc.y:530
msgid "Profile flag 'debug' is no longer valid."
@@ -416,7 +416,7 @@ msgstr "无效的配置文件标志:%s。"
#: parser_yacc.y:498 parser_yacc.y:520 parser_yacc.y:548 parser_yacc.y:594
msgid "Assert: `rule' returned NULL."
msgstr "声明:`rule'返回空值(NULL)。"
msgstr "声明:`rule'返回 NULL。"
#: parser_yacc.y:501 parser_yacc.y:546 parser_yacc.y:552 parser_yacc.y:584
#: parser_yacc.y:598 parser_yacc.y:630
@@ -440,15 +440,15 @@ msgstr "声明“network_rule”返回无效协议。"
#: parser_yacc.y:649 parser_yacc.y:696 parser_yacc.y:786
msgid "Assert: `change_profile' returned NULL."
msgstr "声明“change_profile”返回空值(NULL)。"
msgstr "声明“change_profile”返回 NULL。"
#: parser_yacc.y:680 parser_yacc.y:720 parser_yacc.y:810
msgid "Assert: 'hat rule' returned NULL."
msgstr "声明:'hat rule'返回空值(NULL)。"
msgstr "声明:'hat rule'返回 NULL。"
#: parser_yacc.y:689 parser_yacc.y:729 parser_yacc.y:819
msgid "Assert: 'local_profile rule' returned NULL."
msgstr "声明“local_profile rule”返回空值(NULL)。"
msgstr "声明“local_profile rule”返回 NULL。"
#: parser_yacc.y:824 parser_yacc.y:885 parser_yacc.y:992
#, c-format
@@ -489,12 +489,12 @@ msgstr "功能 %s 无效。"
#: parser_yacc.y:1066 parser_yacc.y:1269 parser_yacc.y:1525
#, c-format
msgid "AppArmor parser error for %s%s%s at line %d: %s\n"
msgstr "第 %4$d 行 %1$s%2$s%3$s 的AppArmor分析器错误%5$s\n"
msgstr ""
#: parser_yacc.y:1072 parser_yacc.y:1275 parser_yacc.y:1531
#, c-format
msgid "AppArmor parser error,%s%s line %d: %s\n"
msgstr "AppArmor分析器错误在 %s%s 行 %d%s\n"
msgstr ""
#: ../parser_regex.c:244
#, c-format
@@ -532,7 +532,7 @@ msgstr "%s: 无法对输入行'%s'进行语法分析\n"
#: ../parser_regex.c:397 ../parser_regex.c:405 ../parser_regex.c:421
#, c-format
msgid "%s: Invalid profile name '%s' - bad regular expression\n"
msgstr "%s: 配置文件名称\"%s\"无效-错误的正则表达式\n"
msgstr ""
#: ../parser_policy.c:202 ../parser_policy.c:402 ../parser_policy.c:375
#, c-format
@@ -593,161 +593,161 @@ msgstr "%s: 在组合规则后处理中发现错误。正在中止。\n"
#: parser_lex.l:180 parser_lex.l:186
#, c-format
msgid "Could not process include directory '%s' in '%s'"
msgstr "无法处理\"%s\"中的包含目录\"%s\""
msgstr ""
#: ../parser_main.c:660 ../parser_main.c:523
msgid "Feature buffer full."
msgstr "功能缓冲区已满。"
msgstr ""
#: ../parser_main.c:1115 ../parser_main.c:1132 ../parser_main.c:1024
#: ../parser_main.c:1041
msgid "Out of memory"
msgstr "内存不足"
msgstr ""
#: ../parser_main.c:1182 ../parser_main.c:1091
#, c-format
msgid "Can't create cache directory: %s\n"
msgstr "无法创建目录:%s\n"
msgstr ""
#: ../parser_main.c:1185 ../parser_main.c:1094
#, c-format
msgid "File in cache directory location: %s\n"
msgstr "缓存目录位置中的文件:%s\n"
msgstr ""
#: ../parser_main.c:1188 ../parser_main.c:1097
#, c-format
msgid "Can't update cache directory: %s\n"
msgstr "无法更新缓存目录:%s\n"
msgstr ""
#: ../parser_misc.c:833
#, c-format
msgid "Internal: unexpected DBus mode character '%c' in input"
msgstr "内部输入中意外的DBus模式字符\"%c\""
msgstr ""
#: ../parser_misc.c:857
#, c-format
msgid "Internal error generated invalid DBus perm 0x%x\n"
msgstr "内部错误生成了无效的DBus perm 0x%x\n"
msgstr ""
#: parser_yacc.y:575 parser_yacc.y:621
msgid "deny prefix not allowed"
msgstr "不允许使用拒绝前缀"
msgstr ""
#: parser_yacc.y:612 parser_yacc.y:658
msgid "owner prefix not allowed"
msgstr "不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:660
msgid "owner prefix not allow on mount rules"
msgstr "装载规则中不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:677
msgid "owner prefix not allow on dbus rules"
msgstr "dbus规则上不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:704
msgid "owner prefix not allow on capability rules"
msgstr "不允许在功能规则上使用所有者前缀"
msgstr ""
#: parser_yacc.y:1357 parser_yacc.y:1613
#, c-format
msgid "invalid mount conditional %s%s"
msgstr "无效的装载条件%s%s"
msgstr ""
#: parser_yacc.y:1374 parser_yacc.y:1628
msgid "bad mount rule"
msgstr "错误的装载规则"
msgstr ""
#: parser_yacc.y:1381 parser_yacc.y:1635
msgid "mount point conditions not currently supported"
msgstr "当前不支持装载点条件"
msgstr ""
#: parser_yacc.y:1398 parser_yacc.y:1650
#, c-format
msgid "invalid pivotroot conditional '%s'"
msgstr "无效的pivotroot条件\"%s\""
msgstr ""
#: ../parser_regex.c:241 ../parser_regex.c:236
#, c-format
msgid ""
"%s: Regex grouping error: Invalid close ], no matching open [ detected\n"
msgstr "%s: 正则表达式分组错误:无效的关闭\"]\",未检测到匹配的打开\"[\"\n"
msgstr ""
#: ../parser_regex.c:257 ../parser_regex.c:256
#, c-format
msgid "%s: Regex grouping error: Exceeded maximum nesting of {}\n"
msgstr "%s: 正则表达式分组错误:超过了{}的最大嵌套\n"
msgstr ""
#: ../parser_policy.c:366 ../parser_policy.c:339
#, c-format
msgid "ERROR processing policydb rules for profile %s, failed to load\n"
msgstr "处理配置文件 %s 的policydb规则时出错加载失败\n"
msgstr ""
#: ../parser_policy.c:396 ../parser_policy.c:369
#, c-format
msgid "ERROR replacing aliases for profile %s, failed to load\n"
msgstr "替换配置文件 %s 的别名时出错,加载失败\n"
msgstr ""
#: ../parser_interface.c:635 ../parser_interface.c:638
#, c-format
msgid "%s: Unable to write %s\n"
msgstr "%s: 无法写入 %s\n"
msgstr ""
#: ../parser_main.c:721
#, c-format
msgid "Error: Could not read binary profile or cache file %s: %s.\n"
msgstr "错误:无法读取二进制配置文件或缓存文件 %s%s。\n"
msgstr ""
#: ../parser_main.c:811
#, c-format
msgid "Error: Could not read cache file '%s', skipping...\n"
msgstr "错误:无法读取缓存文件\"%s\",正在跳过...\n"
msgstr ""
#: ../parser_misc.c:575
#, c-format
msgid "Internal: unexpected %s mode character '%c' in input"
msgstr "内部:输入中出现意外的 %s 模式字符\"%c\""
msgstr ""
#: ../parser_misc.c:599
#, c-format
msgid "Internal error generated invalid %s perm 0x%x\n"
msgstr "内部错误,生成了无效的 %s perm 0x%x\n"
msgstr ""
#: parser_yacc.y:703
msgid "owner prefix not allowed on mount rules"
msgstr "装载规则上不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:720
msgid "owner prefix not allowed on dbus rules"
msgstr "dbus规则上不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:736
msgid "owner prefix not allowed on signal rules"
msgstr "信号规则中不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:752
msgid "owner prefix not allowed on ptrace rules"
msgstr "ptrace规则上不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:768
msgid "owner prefix not allowed on unix rules"
msgstr "unix规则上不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:794
msgid "owner prefix not allowed on capability rules"
msgstr "功能规则上不允许使用所有者前缀"
msgstr ""
#: parser_yacc.y:1293
#, c-format
msgid "dbus rule: invalid conditional group %s=()"
msgstr "dbus规则无效的条件组 %s=()"
msgstr ""
#: parser_yacc.y:1371
#, c-format
msgid "unix rule: invalid conditional group %s=()"
msgstr "unix规则无效的条件组 %s=()"
msgstr ""
#: ../parser_regex.c:368
#, c-format
msgid "%s: Regex error: trailing '\\' escape character\n"
msgstr "%s: 正则表达式错误:尾随\"\\\"转义字符\n"
msgstr ""

View File

@@ -21,8 +21,6 @@
#include <vector>
#include <algorithm>
using namespace std;
const char *profile_mode_table[] = {
"",
"enforce",
@@ -78,7 +76,6 @@ void ProfileList::dump_profile_names(bool children)
Profile::~Profile()
{
hat_table.clear();
flags.clear();
free_cod_entries(entries);
free_cond_entry_list(xattrs);
@@ -98,6 +95,8 @@ Profile::~Profile()
free(name);
if (attachment)
free(attachment);
if (flags.disconnected_path)
free(flags.disconnected_path);
if (ns)
free(ns);
for (int i = (AA_EXEC_LOCAL >> 10) + 1; i < AA_EXEC_COUNT; i++)

View File

@@ -42,16 +42,16 @@ struct deref_profileptr_lt {
class ProfileList {
public:
std::set<Profile *, deref_profileptr_lt> list;
set<Profile *, deref_profileptr_lt> list;
typedef std::set<Profile *, deref_profileptr_lt>::iterator iterator;
typedef set<Profile *, deref_profileptr_lt>::iterator iterator;
iterator begin() { return list.begin(); }
iterator end() { return list.end(); }
ProfileList() { };
virtual ~ProfileList() { clear(); }
virtual bool empty(void) { return list.empty(); }
virtual std::pair<ProfileList::iterator,bool> insert(Profile *);
virtual pair<ProfileList::iterator,bool> insert(Profile *);
virtual void erase(ProfileList::iterator pos);
void clear(void);
void dump(void);
@@ -159,7 +159,6 @@ public:
int audit;
int path;
char *disconnected_path;
char *disconnected_ipc;
int signal;
int error;
@@ -171,16 +170,9 @@ public:
audit = 0;
path = 0;
disconnected_path = NULL;
disconnected_ipc = NULL;
signal = 0;
error = 0;
}
void clear(void) {
free(disconnected_path);
free(disconnected_ipc);
}
void init(const char *str)
{
init();
@@ -224,12 +216,6 @@ public:
yyerror("unknown error code specified for error=\'%s\'\n", str + 6);
} else if (strcmp(str, "interruptible") == 0) {
flags |= FLAG_INTERRUPTIBLE;
} else if (strcmp(str, "attach_disconnected.ipc") == 0) {
path |= PATH_IPC_ATTACH;
} else if (strncmp(str, "attach_disconnected.ipc=", 24) == 0) {
/* TODO: make this a proper parse */
path |= PATH_IPC_ATTACH;
disconnected_ipc = strdup(str + 24);
} else {
yyerror(_("Invalid profile flag: %s."), str);
}
@@ -251,8 +237,6 @@ public:
os << ", kill.signal=" << signal;
if (error)
os << ", error=" << find_error_name_mapping(error);
if (disconnected_ipc)
os << ", attach_disconnected.ipc=" << disconnected_ipc;
if (flags & FLAG_PROMPT_COMPAT)
os << ", prompt_dev";
@@ -293,9 +277,6 @@ public:
if ((path & (PATH_ATTACH | PATH_NO_ATTACH)) ==
(PATH_ATTACH | PATH_NO_ATTACH))
yyerror(_("Profile flag attach_disconnected conflicts with no_attach_disconnected"));
if ((path & (PATH_IPC_ATTACH | PATH_NO_ATTACH)) ==
(PATH_IPC_ATTACH | PATH_NO_ATTACH))
yyerror(_("Profile flag attach_disconnected.ipc conflicts with no_attach_disconnected"));
if ((path & (PATH_CHROOT_NSATTACH | PATH_CHROOT_NO_ATTACH)) ==
(PATH_CHROOT_NSATTACH | PATH_CHROOT_NO_ATTACH))
yyerror(_("Profile flag chroot_attach conflicts with chroot_no_attach"));
@@ -307,17 +288,7 @@ public:
}
// same ignore rhs.disconnect_path
} else {
disconnected_path = strdup(rhs.disconnected_path);
}
}
if (rhs.disconnected_ipc) {
if (disconnected_ipc) {
if (strcmp(disconnected_ipc, rhs.disconnected_ipc) != 0) {
yyerror(_("Profile flag attach_disconnected set to conflicting values: '%s' and '%s'"), disconnected_ipc, rhs.disconnected_ipc);
}
// same so do nothing
} else {
disconnected_ipc = strdup(rhs.disconnected_ipc);
disconnected_path = rhs.disconnected_path;
}
}
if (rhs.signal) {
@@ -374,7 +345,7 @@ struct dfa_stuff {
void *dfa;
size_t size;
size_t file_start; /* special start in welded dfa */
std::vector <aa_perms> perms_table;
vector <aa_perms> perms_table;
dfa_stuff(void): rules(NULL), dfa(NULL), size(0) { }
};
@@ -388,7 +359,7 @@ public:
void *xmatch;
size_t xmatch_size;
int xmatch_len;
std::vector <aa_perms> xmatch_perms_table;
vector <aa_perms> xmatch_perms_table;
struct cond_entry_list xattrs;
/* char *sub_name; */ /* subdomain name or NULL */
@@ -465,12 +436,7 @@ public:
printf("Name:\t\t%s\n", name);
else
printf("Name:\t\t<NULL>\n");
if (attachment)
printf("Attachment:\t%s\n", attachment);
else {
const char *local = local_name(name);
printf("Attachment:\t%s\n", local[0] == '/' ? local : "<NULL>");
}
if (parent)
printf("Local To:\t%s\n", parent->name);
else
@@ -483,7 +449,7 @@ public:
debug_cod_entries(entries);
for (RuleList::iterator i = rule_ents.begin(); i != rule_ents.end(); i++) {
(*i)->dump(std::cout);
(*i)->dump(cout);
}
printf("\n");
@@ -517,7 +483,7 @@ public:
void dump_name(bool fqp)
{
std::cout << get_name(fqp);;
cout << get_name(fqp);;
}
void post_parse_profile(void);

View File

@@ -35,16 +35,16 @@ public:
char *peer_label;
ptrace_rule(perm32_t perms, struct cond_entry *conds);
~ptrace_rule() override
virtual ~ptrace_rule()
{
free(peer_label);
};
ostream &dump(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override;
virtual ostream &dump(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof);
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
if (p.owner != OWNER_UNSPECIFIED) {
error = "owner prefix not allowed on ptrace rules";
return false;
@@ -52,8 +52,8 @@ public:
return true;
};
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const
{
int res = perms_rule_t::cmp(rhs);
if (res)
@@ -63,7 +63,7 @@ public:
};
protected:
void warn_once(const char *name) override;
virtual void warn_once(const char *name) override;
};
#endif /* __AA_PTRACE_H */

View File

@@ -25,10 +25,14 @@
#include "perms.h"
#include "policydb.h"
using namespace std;
#define PROMPT_COMPAT_UNKNOWN 0
#define PROMPT_COMPAT_IGNORE 1
#define PROMPT_COMPAT_PERMSV2 2
#define PROMPT_COMPAT_DEV 3
#define PROMPT_COMPAT_FLAG 4
#define PROMPT_COMPAT_PERMSV1 5
class Profile;
@@ -350,7 +354,7 @@ public:
return *ptr < rhs;
}
int cmp(rule_t const &rhs) const override {
virtual int cmp(rule_t const &rhs) const {
int res = rule_t::cmp(rhs);
if (res)
return res;
@@ -359,7 +363,7 @@ public:
return lhsptr->cmp(*rhsptr);
}
bool operator<(rule_t const &rhs) const override {
virtual bool operator<(rule_t const &rhs) const {
if (rule_type < rhs.rule_type)
return true;
if (rhs.rule_type < rule_type)
@@ -369,7 +373,7 @@ public:
return *this < *rhsptr;
}
ostream &dump(ostream &os) override {
virtual ostream &dump(ostream &os) {
prefixes::dump(os);
return os;
@@ -390,11 +394,11 @@ public:
* can in herit the generic one that redirects to cmp()
* that does get overriden
*/
bool operator<(rule_t const &rhs) const override {
virtual bool operator<(rule_t const &rhs) const {
return cmp(rhs) < 0;
}
ostream &dump(ostream &os) override {
virtual ostream &dump(ostream &os) {
prefix_rule_t::dump(os);
os << aa_class_table[aa_class()];
@@ -411,12 +415,12 @@ class perms_rule_t: public class_rule_t {
public:
perms_rule_t(int c): class_rule_t(c), perms(0), saved(0) { };
int cmp(rule_t const &rhs) const override {
virtual int cmp(rule_t const &rhs) const {
/* don't compare perms so they can be merged */
return class_rule_t::cmp(rhs);
}
bool merge(rule_t &rhs) override
virtual bool merge(rule_t &rhs)
{
int res = class_rule_t::merge(rhs);
if (!res)
@@ -428,17 +432,14 @@ public:
};
/* defaut perms, override/mask off if none default used */
ostream &dump(ostream &os) override {
virtual ostream &dump(ostream &os) {
class_rule_t::dump(os);
std::ios::fmtflags fmt(os.flags());
if (saved)
os << "(0x" << std::hex << perms << "/orig " << saved << ") ";
os << "(0x" << hex << perms << "/orig " << saved << ") ";
else
os << "(0x" << std::hex << perms << ") ";
os << "(0x" << hex << perms << ") ";
os.flags(fmt);
return os;
}
@@ -450,7 +451,7 @@ class dedup_perms_rule_t: public class_rule_t {
public:
dedup_perms_rule_t(int c): class_rule_t(c), perms(0) { };
int cmp(rule_t const &rhs) const override {
virtual int cmp(rule_t const &rhs) const {
int res = class_rule_t::cmp(rhs);
if (res)
return res;
@@ -460,14 +461,10 @@ public:
// inherit default merge which does dedup
/* defaut perms, override/mask off if none default used */
ostream &dump(ostream &os) override {
virtual ostream &dump(ostream &os) {
class_rule_t::dump(os);
std::ios::fmtflags fmt(os.flags());
os << "(0x" << std::hex << perms << ") ";
os.flags(fmt);
os << "(0x" << hex << perms << ") ";
return os;
}

View File

@@ -30,8 +30,6 @@
#include "parser_yacc.h"
#include "signal.h"
using namespace std;
#define MAXMAPPED_SIG 35
#define MINRT_SIG 128 /* base of RT sigs */
#define MAXRT_SIG 32 /* Max RT above MINRT_SIG */

View File

@@ -29,7 +29,7 @@
#define AA_VALID_SIGNAL_PERMS (AA_MAY_SEND | AA_MAY_RECEIVE)
typedef std::set<int> Signals;
typedef set<int> Signals;
int find_signal_mapping(const char *sig);
int parse_signal_perms(const char *str_perms, perm32_t *perms, int fail);
@@ -42,11 +42,11 @@ public:
char *peer_label;
signal_rule(perm32_t perms, struct cond_entry *conds);
~signal_rule() override {
virtual ~signal_rule() {
signals.clear();
free(peer_label);
};
bool valid_prefix(const prefixes &p, const char *&error) override {
virtual bool valid_prefix(const prefixes &p, const char *&error) {
if (p.owner != OWNER_UNSPECIFIED) {
error = "owner prefix not allowed on signal rules";
return false;
@@ -54,15 +54,15 @@ public:
return true;
};
ostream &dump(ostream &os) override;
int expand_variables(void) override;
int gen_policy_re(Profile &prof) override;
virtual ostream &dump(ostream &os);
virtual int expand_variables(void);
virtual int gen_policy_re(Profile &prof);
bool is_mergeable(void) override { return true; }
int cmp(rule_t const &rhs) const override;
virtual bool is_mergeable(void) { return true; }
virtual int cmp(rule_t const &rhs) const;
protected:
void warn_once(const char *name) override;
virtual void warn_once(const char *name) override;
};
#endif /* __AA_SIGNAL_H */

View File

@@ -1,172 +0,0 @@
/*
* Copyright (c) 2025
* Canonical Ltd. (All rights reserved)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact Canonical Ltd.
*/
#include "symtab.h"
template <typename T>
int symtab::add_var(const char *var, T value)
{
char *var_name = variable::process_var(var);
if (!var_name)
return 1;
const auto search = my_symtab.find(var_name);
if (search != my_symtab.end()) {
/* already existing variable */
PERROR("'%s' is already defined\n", var);
free(var_name);
return 1;
}
my_symtab.emplace(var_name, variable(var_name, value));
free(var_name);
return 0;
}
int symtab::add_var(const char *var, int value)
{
return add_var<int>(var, value);
}
int symtab::add_var(const char *var, struct value_list *value)
{
return add_var<struct value_list *>(var, value);
}
int symtab::add_var(const char *var_name, const char *value)
{
/* note that here var_name must be processed already */
const auto search = my_symtab.find(var_name);
if (search != my_symtab.end()) {
/* already existing variable */
PERROR("'%s' is already defined\n", var_name);
return 1;
}
my_symtab.emplace(var_name, variable(var_name, value));
return 0;
}
int symtab::add_var(variable var)
{
const auto search = my_symtab.find(var.var_name);
if (search != my_symtab.end()) {
/* already existing variable */
PERROR("'%s' is already defined\n", var.var_name.c_str());
return 1;
}
my_symtab.emplace(var.var_name, var);
return 0;
}
variable *symtab::lookup_existing_symbol(const char *var_name)
{
if (!var_name)
return nullptr;
const auto var = my_symtab.find(var_name);
if (var == my_symtab.end()) {
return nullptr;
}
return &(var->second);
}
int symtab::add_set_value(const char *var_name, struct value_list *value)
{
char *pvar_name = variable::process_var(var_name);
variable *var = lookup_existing_symbol(pvar_name);
if (!var) {
PERROR("Failed to find declaration for: %s\n", pvar_name);
free(pvar_name);
return 1;
}
free(pvar_name);
return var->add_set_value(value);
}
variable *symtab::delete_var(const char *var_name)
{
variable *var = lookup_existing_symbol(var_name);
if (!var) {
return var;
}
if (var->type != sd_set) {
PERROR("ASSERT: delete_set_var: deleting %s but is a boolean variable\n",
var_name);
exit(1);
}
variable *save = new variable(*var);
my_symtab.erase(var->var_name);
return save;
}
void symtab::free_symtab()
{
my_symtab.erase(my_symtab.begin(), my_symtab.end());
}
void symtab::dump(bool do_expanded)
{
for (auto var : my_symtab) {
var.second.dump(do_expanded);
}
}
void symtab::expand_variables()
{
for (auto var : my_symtab) {
if (var.second.type != sd_boolean)
var.second.expand_variable();
}
}
variable *symtab::get_set_var(const char *name)
{
char *var_name = variable::process_var(name);
variable *var = lookup_existing_symbol(var_name);
if (!var) {
goto out;
}
if (var->type != sd_set) {
PERROR("Variable %s is not a set variable\n", var_name);
var = nullptr;
goto out;
}
var->expand_variable();
out:
free(var_name);
return var;
}
variable *symtab::get_boolean_var(const char *name)
{
char *var_name = variable::process_var(name);
variable *var = lookup_existing_symbol(var_name);
if (!var) {
goto out;
}
if (var->type != sd_boolean) {
PERROR("Variable %s is not a boolean variable\n", var_name);
var = nullptr;
goto out;
}
out:
free(var_name);
return var;
}
std::unordered_map<std::string, variable> symtab::my_symtab;

View File

@@ -1,47 +0,0 @@
/*
* Copyright (c) 2025
* Canonical Ltd. (All rights reserved)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact Canonical Ltd.
*/
#ifndef __AA_SYMTAB_H
#define __AA_SYMTAB_H
#include <unordered_map>
#include <string>
#include "variable.h"
#include "parser.h"
class symtab {
private:
static std::unordered_map<std::string, variable> my_symtab;
public:
template <typename T>
static int add_var(const char *var, T value);
static int add_var(const char *var, int value);
static int add_var(const char *var, struct value_list *value);
static int add_var(const char *var, const char *value);
static int add_var(variable var);
static int add_set_value(const char *var, struct value_list *value);
static void dump(bool do_expanded);
static void free_symtab(void);
static void expand_variables(void);
static variable *lookup_existing_symbol(const char *var_name);
static variable *get_set_var(const char *var_name);
static variable *get_boolean_var(const char *var_name);
static variable *delete_var(const char *var_name);
};
#endif /* __AA_SYMTAB_H */

Some files were not shown because too many files have changed in this diff Show More