[Pkg-shadow-devel] [shadow] 02/05: Drop patches merged upstream or no longer used
Christian Perrier
bubulle at moszumanska.debian.org
Wed Nov 19 20:51:46 UTC 2014
This is an automated email from the git hooks/post-receive script.
bubulle pushed a commit to branch master
in repository shadow.
commit d5849a0f2b170afff30f58e301e27fefeb603095
Author: Christian Perrier <bubulle at debian.org>
Date: Fri May 9 19:16:39 2014 +0200
Drop patches merged upstream or no longer used
---
debian/patches/1000_configure_userns | 93 -
debian/patches/1010_vietnamese_translation | 2687 --------------------
debian/patches/1011_french_translation | 1430 -----------
debian/patches/1012_german_translation | 31 -
debian/patches/1020_fix-typo-manpage | 13 -
debian/patches/userns/01_userns_doc | 334 ---
debian/patches/userns/02_userns_doc_login.defs | 218 --
.../userns/03_userns_implement_commonio_append | 110 -
.../patches/userns/04_userns_add_backend_support | 685 -----
.../userns/05_userns_implemend_find_new_sub_xids | 283 ---
debian/patches/userns/06_userns_userdel | 236 --
debian/patches/userns/07_userns_useradd | 285 ---
debian/patches/userns/08_userns_detect_busy_subids | 133 -
debian/patches/userns/09_userns_usermod | 536 ----
debian/patches/userns/10_userns_newusers | 256 --
debian/patches/userns/11_userns_newxidmap | 1004 --------
debian/patches/userns/12_userns_selinuxlibs | 13 -
.../patches/userns/13_subordinate_parse_static_buf | 23 -
debian/patches/userns/14_fix_getopt | 24 -
.../userns/16_add-argument-sanity-checking.patch | 80 -
debian/patches/userns/manpagetypo | 26 -
21 files changed, 8500 deletions(-)
diff --git a/debian/patches/1000_configure_userns b/debian/patches/1000_configure_userns
deleted file mode 100644
index 5cd39b6..0000000
--- a/debian/patches/1000_configure_userns
+++ /dev/null
@@ -1,93 +0,0 @@
-=== modified file 'etc/login.defs'
-Index: git/etc/login.defs
-===================================================================
---- git.orig/etc/login.defs
-+++ git/etc/login.defs
-@@ -229,7 +229,7 @@
- # Extra per user uids
- SUB_UID_MIN 100000
- SUB_UID_MAX 600100000
--SUB_UID_COUNT 10000
-+SUB_UID_COUNT 65536
-
- #
- # Min/max values for automatic gid selection in groupadd(8)
-@@ -242,7 +242,7 @@
- # Extra per user group ids
- SUB_GID_MIN 100000
- SUB_GID_MAX 600100000
--SUB_GID_COUNT 10000
-+SUB_GID_COUNT 65536
-
- #
- # Max number of login(1) retries if password is bad
-Index: git/src/newusers.c
-===================================================================
---- git.orig/src/newusers.c
-+++ git/src/newusers.c
-@@ -988,8 +988,8 @@
- is_shadow_grp = sgr_file_present ();
- #endif
- #ifdef ENABLE_SUBIDS
-- is_sub_uid = sub_uid_file_present ();
-- is_sub_gid = sub_gid_file_present ();
-+ is_sub_uid = sub_uid_file_present () && !rflg;
-+ is_sub_gid = sub_gid_file_present () && !rflg;
- #endif /* ENABLE_SUBIDS */
-
- open_files ();
-Index: git/src/useradd.c
-===================================================================
---- git.orig/src/useradd.c
-+++ git/src/useradd.c
-@@ -1994,6 +1994,10 @@
- #endif /* USE_PAM */
- #endif /* ACCT_TOOLS_SETUID */
-
-+ /* Needed for userns check */
-+ uid_t uid_min = (uid_t) getdef_ulong ("UID_MIN", 1000UL);
-+ uid_t uid_max = (uid_t) getdef_ulong ("UID_MAX", 60000UL);
-+
- /*
- * Get my name so that I can use it to report errors.
- */
-@@ -2023,8 +2027,10 @@
- is_shadow_grp = sgr_file_present ();
- #endif
- #ifdef ENABLE_SUBIDS
-- is_sub_uid = sub_uid_file_present ();
-- is_sub_gid = sub_gid_file_present ();
-+ is_sub_uid = sub_uid_file_present () && !rflg &&
-+ (!user_id || (user_id <= uid_max && user_id >= uid_min));
-+ is_sub_gid = sub_gid_file_present () && !rflg &&
-+ (!user_id || (user_id <= uid_max && user_id >= uid_min));
- #endif /* ENABLE_SUBIDS */
-
- get_defaults ();
-
-Index: git/libmisc/find_new_sub_uids.c
-===================================================================
---- git.orig/libmisc/find_new_sub_uids.c
-+++ git/libmisc/find_new_sub_uids.c
-@@ -58,7 +58,7 @@
-
- min = getdef_ulong ("SUB_UID_MIN", 100000UL);
- max = getdef_ulong ("SUB_UID_MAX", 600100000UL);
-- count = getdef_ulong ("SUB_UID_COUNT", 10000);
-+ count = getdef_ulong ("SUB_UID_COUNT", 65536);
-
- if (min > max || count >= max || (min + count - 1) > max) {
- (void) fprintf (stderr,
-Index: git/libmisc/find_new_sub_gids.c
-===================================================================
---- git.orig/libmisc/find_new_sub_gids.c
-+++ git/libmisc/find_new_sub_gids.c
-@@ -58,7 +58,7 @@
-
- min = getdef_ulong ("SUB_GID_MIN", 100000UL);
- max = getdef_ulong ("SUB_GID_MAX", 600100000UL);
-- count = getdef_ulong ("SUB_GID_COUNT", 10000);
-+ count = getdef_ulong ("SUB_GID_COUNT", 65536);
-
- if (min > max || count >= max || (min + count - 1) > max) {
- (void) fprintf (stderr,
diff --git a/debian/patches/1010_vietnamese_translation b/debian/patches/1010_vietnamese_translation
deleted file mode 100644
index f3331d3..0000000
--- a/debian/patches/1010_vietnamese_translation
+++ /dev/null
@@ -1,2687 +0,0 @@
-Index: git/po/vi.po
-===================================================================
---- git.orig/po/vi.po
-+++ git/po/vi.po
-@@ -1,15 +1,17 @@
- # Vietnamese translation for Shadow.
--# Copyright © 2009 Free Software Foundation, Inc.
-+# Bản dịch tiếng Việt dành cho shadow.
-+# Copyright © 2014 Free Software Foundation, Inc.
- # Clytie Siddall <clytie at riverland.net.au>, 2005-2008.
-+# Trần Ngọc Quân <vnwildman at gmail.com>, 2014.
- #
- msgid ""
- msgstr ""
- "Project-Id-Version: shadow\n"
- "Report-Msgid-Bugs-To: pkg-shadow-devel at lists.alioth.debian.org\n"
- "POT-Creation-Date: 2012-05-20 19:52+0200\n"
--"PO-Revision-Date: 2012-01-08 18:13+0100\n"
--"Last-Translator: Clytie Siddall <clytie at riverland.net.au>\n"
--"Language-Team: Vietnamese <vi-VN at googlegroups.com>\n"
-+"PO-Revision-Date: 2014-04-11 15:01+0700\n"
-+"Last-Translator: Trần Ngọc Quân <vnwildman at gmail.com>\n"
-+"Language-Team: Vietnamese <debian-l10n-vietnamese at lists.debian.org>\n"
- "Language: vi\n"
- "MIME-Version: 1.0\n"
- "Content-Type: text/plain; charset=UTF-8\n"
-@@ -21,34 +23,34 @@
- msgid ""
- "Multiple entries named '%s' in %s. Please fix this with pwck or grpck.\n"
- msgstr ""
--"Có nhiều mục nhập tên « %s » trong %s. Hãy sửa chữa trường hợp này, dùng "
-+"Có nhiều mục tin mang tên “%s” trong %s. Hãy sửa chữa trường hợp này, dùng "
- "pwck hoặc grpck.\n"
-
- #, c-format
- msgid "crypt method not supported by libcrypt? (%s)\n"
--msgstr "Phương pháp mã hoá không được libcrypt hỗ trợ ? (%s)\n"
-+msgstr "Phương pháp mã hoá không được thư viện libcrypt hỗ trợ? (%s)\n"
-
- #, c-format
- msgid "configuration error - cannot parse %s value: '%s'"
--msgstr "lỗi cấu hình — không thể phân tích cú pháp của giá trị %s: « %s »"
-+msgstr "lỗi cấu hình — không thể phân tích cú pháp của giá trị %s: “%s”"
-
- msgid "Could not allocate space for config info.\n"
- msgstr "Không thể cấp phát sức chứa cho thông tin cấu hình.\n"
-
- #, c-format
- msgid "configuration error - unknown item '%s' (notify administrator)\n"
--msgstr "lỗi cấu hình: không rõ mục « %s » (báo quản trị).\n"
-+msgstr "lỗi cấu hình - không hiểu mục tin “%s” (báo cho người quản trị).\n"
-
- #, c-format
- msgid "%s: nscd did not terminate normally (signal %d)\n"
--msgstr ""
-+msgstr "%s: nscd đã kết thúc bất thường (tín hiệu %d)\n"
-
- #, c-format
- msgid "%s: nscd exited with status %d\n"
--msgstr ""
-+msgstr "%s: nscd đã thoát với mã là %d\n"
-
- msgid "Password: "
--msgstr "Mật khẩu : "
-+msgstr "Mật khẩu: "
-
- #, c-format
- msgid "%s's Password: "
-@@ -56,212 +58,198 @@
-
- #, c-format
- msgid "[libsemanage]: %s\n"
--msgstr ""
-+msgstr "[libsemanage]: %s\n"
-
- #, c-format
- msgid "Cannot create SELinux management handle\n"
--msgstr ""
-+msgstr "Không thể tạo bộ tiếp hợp quản lý SELinux\n"
-
- #, c-format
- msgid "SELinux policy not managed\n"
--msgstr ""
-+msgstr "Chính sách cho SELinux chưa được quản lý\n"
-
- #, c-format
- msgid "Cannot read SELinux policy store\n"
--msgstr ""
-+msgstr "Không thể đọc kho lưu chính sách SELinux\n"
-
- #, c-format
- msgid "Cannot establish SELinux management connection\n"
--msgstr ""
-+msgstr "Không thể thiết lập kết nối quản lý SELinux\n"
-
- #, c-format
- msgid "Cannot begin SELinux transaction\n"
--msgstr ""
-+msgstr "Không thể bắt đầu phiên giao dịch SELinux\n"
-
- #, c-format
- msgid "Could not query seuser for %s\n"
--msgstr ""
-+msgstr "Không thể truy vấn seuser cho %s\n"
-
- #, c-format
- msgid "Could not set serange for %s\n"
--msgstr ""
-+msgstr "Không thể đặt serange cho %s\n"
-
--#, fuzzy, c-format
--#| msgid "Could not allocate space for config info.\n"
-+#, c-format
- msgid "Could not set sename for %s\n"
--msgstr "Không thể cấp phát sức chứa cho thông tin cấu hình.\n"
-+msgstr "Không thể đặt sename cho %s\n"
-
- #, c-format
- msgid "Could not modify login mapping for %s\n"
--msgstr ""
-+msgstr "Không thể sửa đổi ánh xạ đăng nhập cho %s\n"
-
--#, fuzzy, c-format
--#| msgid "Changing the aging information for %s\n"
-+#, c-format
- msgid "Cannot create SELinux login mapping for %s\n"
--msgstr "Đang thay đổi thông tin về thời gian hoạt động đối với %s\n"
-+msgstr "Không thể tạo ánh xạ đăng nhập SELinux cho %s\n"
-
- #, c-format
- msgid "Could not set name for %s\n"
--msgstr ""
-+msgstr "Không thể đặt tên %s\n"
-
- #, c-format
- msgid "Could not set SELinux user for %s\n"
--msgstr ""
-+msgstr "Không thể đặt người dùng SELinux cho %s\n"
-
- #, c-format
- msgid "Could not add login mapping for %s\n"
--msgstr ""
-+msgstr "Không thể thêm ánh xạ đăng nhập cho %s\n"
-
- #, c-format
- msgid "Cannot init SELinux management\n"
--msgstr ""
-+msgstr "Không thể khởi tạo bộ quản lý SELinux\n"
-
--#, fuzzy, c-format
--#| msgid "%s: Cannot determine your user name.\n"
-+#, c-format
- msgid "Cannot create SELinux user key\n"
--msgstr "%s: không thể quyết định tên người dùng của bạn.\n"
-+msgstr "Không thể tạo khóa người dùng SELinux\n"
-
--#, fuzzy, c-format
--#| msgid "%s: Cannot determine your user name.\n"
-+#, c-format
- msgid "Cannot verify the SELinux user\n"
--msgstr "%s: không thể quyết định tên người dùng của bạn.\n"
-+msgstr "Không thể thẩm định người dùng SELinux\n"
-
- #, c-format
- msgid "Cannot modify SELinux user mapping\n"
--msgstr ""
-+msgstr "Không thể sửa đổi ánh xạ người dùng SELinux\n"
-
- #, c-format
- msgid "Cannot add SELinux user mapping\n"
--msgstr ""
-+msgstr "Không thể thêm ánh xạ người dùng SELinux\n"
-
- #, c-format
- msgid "Cannot commit SELinux transaction\n"
--msgstr ""
-+msgstr "Không thể chuyển giao giao dịch SELinux\n"
-
- #, c-format
- msgid "Login mapping for %s is not defined, OK if default mapping was used\n"
- msgstr ""
-+"Ánh xạ đăng nhập cho %s chưa được định nghĩa, OK nếu ánh xạ mặc định được "
-+"dùng\n"
-
- #, c-format
- msgid "Login mapping for %s is defined in policy, cannot be deleted\n"
- msgstr ""
-+"Ánh xạ đăng nhập cho %s được định nghĩa trong chính sách, không thể xóa đi\n"
-
- #, c-format
- msgid "Could not delete login mapping for %s"
--msgstr ""
-+msgstr "Không thể xóa ánh xạ đăng nhập cho %s"
-
- #, c-format
- msgid "%s: out of memory\n"
--msgstr "%s: tràn bộ nhớ\n"
-+msgstr "%s: hết bộ nhớ\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot delete %s\n"
-+#, c-format
- msgid "%s: Cannot stat %s: %s\n"
--msgstr "%s: không thể xoá %s\n"
-+msgstr "%s: Không thể lấy thống kê về %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: %s home directory (%s) not found\n"
-+#, c-format
- msgid "%s: %s is neither a directory, nor a symlink.\n"
--msgstr "%s: %s không tìm thấy thư mục chính (%s)\n"
-+msgstr "%s: %s không phải là thư mục mà cũng không phải là liên kết mềm.\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot remove entry '%s' from %s\n"
-+#, c-format
- msgid "%s: Cannot read symbolic link %s: %s\n"
--msgstr "%s: không thể gỡ bỏ mục nhập « %s » khỏi %s\n"
-+msgstr "%s: Không thể đọc liên kết mềm %s: %s\n"
-
- #, c-format
- msgid "%s: Suspiciously long symlink: %s\n"
--msgstr ""
-+msgstr "%s: Liên kết mềm dài một cách điên rồ: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "%s: Cannot create directory %s: %s\n"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "%s: Không thể tạo thư mục %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "lastlog: Cannot get the size of %s: %s\n"
-+#, c-format
- msgid "%s: Cannot change owner of %s: %s\n"
--msgstr "lastlog: Không thể lấy kích cỡ của %s: %s\n"
-+msgstr "%s: Không thể thay đổi người sở hữu của %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: warning: can't remove %s: %s\n"
-+#, c-format
- msgid "%s: Cannot change mode of %s: %s\n"
--msgstr "%s: cảnh báo : không thể gỡ bỏ %s: %s\n"
-+msgstr "%s: Không thể thay đổi chế độ của %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: rename: %s: %s"
-+#, c-format
- msgid "%s: unlink: %s: %s\n"
--msgstr "%s: thay tên: %s: %s"
-+msgstr "%s: unlink: %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot rename directory %s to %s\n"
-+#, c-format
- msgid "%s: Cannot remove directory %s: %s\n"
--msgstr "%s: không thể thay đổi lại tên thư mục %s thành %s\n"
-+msgstr "%s: Không thể gỡ bỏ thư mục %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot rename directory %s to %s\n"
-+#, c-format
- msgid "%s: Cannot rename %s to %s: %s\n"
--msgstr "%s: không thể thay đổi lại tên thư mục %s thành %s\n"
-+msgstr "%s: Không thể đổi tên %s thành %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: warning: can't remove %s: %s\n"
-+#, c-format
- msgid "%s: Cannot remove %s: %s\n"
--msgstr "%s: cảnh báo : không thể gỡ bỏ %s: %s\n"
-+msgstr "%s: Không thể gỡ bỏ %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "%s: Cannot create symbolic link %s: %s\n"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "%s: Không thể tạo liên kết mềm %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "lastlog: Cannot get the size of %s: %s\n"
-+#, c-format
- msgid "%s: Cannot change owners of %s: %s\n"
--msgstr "lastlog: Không thể lấy kích cỡ của %s: %s\n"
-+msgstr "%s: Không thể thay đổi chủ sở hữu của %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot delete %s\n"
-+#, c-format
- msgid "%s: Cannot lstat %s: %s\n"
--msgstr "%s: không thể xoá %s\n"
-+msgstr "%s: Không thể lstat %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: (line %d, user %s) password not changed\n"
-+#, c-format
- msgid "%s: Warning, user %s has no tcb shadow file.\n"
--msgstr "%s: (dòng %d, người dùng %s) mật khẩu chưa thay đổi\n"
-+msgstr "%s: Cảnh báo, người dùng %s không có tập tin shadow tcb.\n"
-
- #, c-format
- msgid ""
- "%s: Emergency: %s's tcb shadow is not a regular file with st_nlink=1.\n"
- "The account is left locked.\n"
- msgstr ""
-+"%s: Khẩn cấp: shadow tcb của %s không phải là tập tin thường với "
-+"st_nlink=1.\n"
-+"Tài khoản vẫn bị khóa.\n"
-
--#, fuzzy, c-format
--#| msgid "%s: rename: %s: %s"
-+#, c-format
- msgid "%s: mkdir: %s: %s\n"
--msgstr "%s: thay tên: %s: %s"
-+msgstr "%s: mkdir: %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot open %s\n"
-+#, c-format
- msgid "%s: Cannot open %s: %s\n"
--msgstr "%s: không thể mở %s\n"
-+msgstr "%s: Không thể mở %s: %s\n"
-
- #, c-format
- msgid "Warning: unknown group %s\n"
--msgstr "Cảnh báo : không rõ nhóm %s.\n"
-+msgstr "Cảnh báo: không biết nhóm %s.\n"
-
- msgid "Warning: too many groups\n"
--msgstr "Cảnh báo : quá nhiều nhóm\n"
-+msgstr "Cảnh báo: quá nhiều nhóm\n"
-
- msgid "Your password has expired."
- msgstr "Mật khẩu của bạn đã hết hạn dùng."
-
- msgid "Your password is inactive."
--msgstr "Mật khẩu của bạn không phải hoạt động."
-+msgstr "Mật khẩu của bạn là không hoạt động."
-
- msgid "Your login has expired."
- msgstr "Đăng nhập của bạn đã hết hạn dùng."
-
- msgid " Contact the system administrator."
--msgstr " Hãy liên lạc với quản trị hệ thống."
-+msgstr " Hãy liên lạc với người quản trị hệ thống."
-
- msgid " Choose a new password."
- msgstr " Hãy chọn mật khẩu mới."
-@@ -291,13 +279,12 @@
- msgid "%s: failed to unlock %s\n"
- msgstr "%s: lỗi mở khoá %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: %s\n"
-+#, c-format
- msgid "%s: "
--msgstr "%s: %s\n"
-+msgstr "%s: "
-
- msgid ": "
--msgstr ""
-+msgstr ": "
-
- msgid "Environment overflow\n"
- msgstr "Tràn môi trường\n"
-@@ -319,18 +306,19 @@
-
- #, c-format
- msgid "%s: Invalid configuration: GID_MIN (%lu), GID_MAX (%lu)\n"
--msgstr ""
-+msgstr "%s: Cấu hình không hợp lệ: GID_MIN (%lu), GID_MAX (%lu)\n"
-
- #, c-format
- msgid ""
- "%s: Invalid configuration: SYS_GID_MIN (%lu), GID_MIN (%lu), SYS_GID_MAX "
- "(%lu)\n"
- msgstr ""
-+"%s: Cấu hình không hợp lệ: SYS_GID_MIN (%lu), GID_MIN (%lu), SYS_GID_MAX "
-+"(%lu)\n"
-
--#, fuzzy, c-format
--#| msgid "failed to change mailbox owner"
-+#, c-format
- msgid "%s: failed to allocate memory: %s\n"
--msgstr "lỗi thay đổi chủ hộp thư"
-+msgstr "%s: gặp lỗi khi cấp phát bộ nhớ: %s\n"
-
- #, c-format
- msgid "%s: Can't get unique system GID (no more available GIDs)\n"
-@@ -343,13 +331,15 @@
-
- #, c-format
- msgid "%s: Invalid configuration: UID_MIN (%lu), UID_MAX (%lu)\n"
--msgstr ""
-+msgstr "%s: Cấu hình không hợp lệ: UID_MIN (%lu), UID_MAX (%lu)\n"
-
- #, c-format
- msgid ""
- "%s: Invalid configuration: SYS_UID_MIN (%lu), UID_MIN (%lu), SYS_UID_MAX "
- "(%lu)\n"
- msgstr ""
-+"%s: Cấu hình không hợp lệ: SYS_UID_MIN (%lu), UID_MIN (%lu), SYS_UID_MAX "
-+"(%lu)\n"
-
- #, c-format
- msgid "%s: Can't get unique system UID (no more available UIDs)\n"
-@@ -379,7 +369,7 @@
- msgstr "từ đọc xuôi ngược đều giống như nhau"
-
- msgid "case changes only"
--msgstr "chỉ thay đổi chữ thường/hoa"
-+msgstr "chỉ thay đổi HOA/thường"
-
- msgid "too similar"
- msgstr "quá tương tự"
-@@ -403,10 +393,10 @@
-
- #, c-format
- msgid "passwd: %s\n"
--msgstr "passwd: (mật khẩu) %s\n"
-+msgstr "passwd: %s\n"
-
- msgid "passwd: password unchanged\n"
--msgstr "passwd: chưa thay đổi mật khẩu\n"
-+msgstr "passwd: chưa đổi mật khẩu\n"
-
- msgid "passwd: password updated successfully\n"
- msgstr "passwd: mật khẩu đã được cập nhật\n"
-@@ -417,45 +407,42 @@
-
- #, c-format
- msgid "%s: multiple --root options\n"
--msgstr ""
-+msgstr "%s: nhiều tùy chọn --root\n"
-
- #, c-format
- msgid "%s: option '%s' requires an argument\n"
--msgstr ""
-+msgstr "%s: tùy chọn “%s” cần một đối số\n"
-
- #, c-format
- msgid "%s: failed to drop privileges (%s)\n"
--msgstr "%s: lỗi bỏ quyền truy cập (%s)\n"
-+msgstr "%s: gặp lỗi khi xóa bỏ đặc quyền (%s)\n"
-
--#, fuzzy, c-format
--#| msgid "%s: invalid home phone: '%s'\n"
-+#, c-format
- msgid "%s: invalid chroot path '%s'\n"
--msgstr "%s: số điện thoại ở nhà không hợp lệ: « %s »\n"
-+msgstr "%s: đường dẫn chroot không hợp lệ “%s”\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "%s: cannot access chroot directory %s: %s\n"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "%s: không thể truy cập thư mục chroot %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "%s: unable to chroot to directory %s: %s\n"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "%s: không thể thay đổi thư mục gốc thành %s: %s\n"
-
- #, c-format
- msgid ""
- "Invalid ENCRYPT_METHOD value: '%s'.\n"
- "Defaulting to DES.\n"
- msgstr ""
--"Phương pháp mã hoá (ENCRYPT_METHOD) không hợp lệ: « %s »\n"
-+"Phương pháp mã hoá (ENCRYPT_METHOD) không hợp lệ: “%s”\n"
- "nên hoàn nguyên về giá trị mặc định: DES.\n"
-
- #, c-format
- msgid "Unable to cd to '%s'\n"
--msgstr "Không thể cd (chuyển đổi thư mục) sang « %s ».\n"
-+msgstr "Không thể cd (chuyển đổi thư mục) sang “%s”.\n"
-
- msgid "No directory, logging in with HOME=/"
--msgstr "Không có thư mục nên đăng nhập với « HOME=/ »"
-+msgstr "Không có thư mục nên đăng nhập với “HOME=/”"
-
- #, c-format
- msgid "Cannot execute %s"
-@@ -463,11 +450,11 @@
-
- #, c-format
- msgid "Invalid root directory '%s'\n"
--msgstr "Thư mục gốc không hợp lệ « %s »\n"
-+msgstr "Thư mục gốc không hợp lệ “%s”\n"
-
- #, c-format
- msgid "Can't change root directory to '%s'\n"
--msgstr "Không thể thay đổi thư mục gốc thành « %s »\n"
-+msgstr "Không thể thay đổi thư mục gốc thành “%s”\n"
-
- msgid "Unable to determine your tty name."
- msgstr "Không thể quyết định tên TTY của bạn."
-@@ -481,7 +468,7 @@
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n"
-+"Cách dùng: %s [các_tuỳ_chọn] ĐĂNG_NHẬP\n"
- "\n"
- "Tuỳ chọn:\n"
-
-@@ -529,12 +516,12 @@
- "khi thay đổi mật khẩu\n"
-
- msgid " -R, --root CHROOT_DIR directory to chroot into\n"
--msgstr ""
-+msgstr " -R, --root THƯ_MỤC_ĐỔI thư mục để chuyển gốc đến\n"
-
- msgid ""
- " -W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS\n"
- msgstr ""
--" -W, --warndays SỐ đặt thành số này số các ngày gây ra cảnh báo "
-+" -W, --warndays SỐ_NGÀY đặt thành số này số các ngày gây ra cảnh báo "
- "về hết hạn dùng\n"
-
- msgid "Enter the new value, or press ENTER for the default"
-@@ -574,7 +561,7 @@
- msgstr "Mật khẩu không hoạt động\t\t\t\t\t: "
-
- msgid "Account expires\t\t\t\t\t\t: "
--msgstr "Tài khoản hết hạn dùng\t\t\t\t\t\t "
-+msgstr "Tài khoản hết hạn dùng\t\t\t\t\t\t: "
-
- #, c-format
- msgid "Minimum number of days between password change\t\t: %ld\n"
-@@ -590,15 +577,15 @@
-
- #, c-format
- msgid "%s: invalid date '%s'\n"
--msgstr "%s: ngày không hợp lệ « %s »\n"
-+msgstr "%s: ngày không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: invalid numeric argument '%s'\n"
--msgstr "%s: đối số thuộc số không hợp lệ « %s »\n"
-+msgstr "%s: đối số thuộc số không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: do not include \"l\" with other flags\n"
--msgstr "%s: đừng dùng « l » cùng với cờ khác\n"
-+msgstr "%s: đừng dùng “l” cùng với cờ khác\n"
-
- #, c-format
- msgid "%s: Permission denied.\n"
-@@ -606,12 +593,11 @@
-
- #, c-format
- msgid "%s: Cannot determine your user name.\n"
--msgstr "%s: không thể quyết định tên người dùng của bạn.\n"
-+msgstr "%s: Không thể phân giải tên người dùng của bạn.\n"
-
--#, fuzzy, c-format
--#| msgid "%s: %s\n"
-+#, c-format
- msgid "%s: PAM: %s\n"
--msgstr "%s: %s\n"
-+msgstr "%s: PAM: %s\n"
-
- #, c-format
- msgid "%s: cannot lock %s; try again later.\n"
-@@ -627,15 +613,15 @@
-
- #, c-format
- msgid "%s: failed to prepare the new %s entry '%s'\n"
--msgstr "%s: lỗi chuẩn bị mục nhập %s mới « %s »\n"
-+msgstr "%s: gặp lỗi khi chuẩn bị mục tin %s mới “%s”\n"
-
- #, c-format
- msgid "%s: the shadow password file is not present\n"
--msgstr "%s: không có tập tin mật khẩu bóng\n"
-+msgstr "%s: không có tập tin mật khẩu shadow\n"
-
- #, c-format
- msgid "%s: user '%s' does not exist in %s\n"
--msgstr "%s: người dùng « %s » không tồn tại trong %s\n"
-+msgstr "%s: người dùng “%s” không tồn tại trong %s\n"
-
- #, c-format
- msgid "Changing the aging information for %s\n"
-@@ -645,47 +631,45 @@
- msgid "%s: error changing fields\n"
- msgstr "%s: gặp lỗi khi thay đổi trường\n"
-
--#, fuzzy, c-format
--#| msgid ""
--#| "Usage: %s [options]\n"
--#| "\n"
--#| "Options:\n"
-+#, c-format
- msgid ""
- "Usage: %s [options] [LOGIN]\n"
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...]\n"
-+"Cách dùng: %s [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n"
- "\n"
- "Tuỳ chọn:\n"
-
- msgid " -f, --full-name FULL_NAME change user's full name\n"
--msgstr ""
-+msgstr " -f, --full-name HỌ_TÊN đổi tên thật của người dùng\n"
-
- msgid " -h, --home-phone HOME_PHONE change user's home phone number\n"
--msgstr ""
-+msgstr " -h, --home-phone ĐIỆN_THOẠI đổi số điện thoại nhà của người dùng\n"
-
- msgid " -o, --other OTHER_INFO change user's other GECOS information\n"
--msgstr ""
-+msgstr " -o, --other THÔNG_TIN_KHÁC đổi thông tin GECOS khác\n"
-
- msgid " -r, --room ROOM_NUMBER change user's room number\n"
--msgstr ""
-+msgstr " -r, --room SỐ_PHÒNG đổi số phòng của người dùng\n"
-
- msgid " -u, --help display this help message and exit\n"
- msgstr " -u, --help hiển thị trợ giúp này, sau đó thoát\n"
-
- msgid " -w, --work-phone WORK_PHONE change user's office phone number\n"
- msgstr ""
-+" -w, --work-phone ĐIỆN_THOẠI_LÀM thay đổi số điện thoại nơi làm của người "
-+"dùng\n"
-
- msgid "Full Name"
--msgstr "Họ tên"
-+msgstr "Họ và tên"
-
- #, c-format
- msgid "\t%s: %s\n"
- msgstr "\t%s: %s\n"
-
- msgid "Room Number"
--msgstr "Số thứ tự phòng"
-+msgstr "Số phòng"
-
- msgid "Work Phone"
- msgstr "Điện thoại chỗ làm"
-@@ -697,51 +681,51 @@
- msgstr "Khác"
-
- msgid "Cannot change ID to root.\n"
--msgstr "Không thể thay đổi mã số thành người chủ (root).\n"
-+msgstr "Không thể thay đổi mã số thành siêu quản trị (root).\n"
-
- #, c-format
- msgid "%s: name with non-ASCII characters: '%s'\n"
--msgstr "%s: tên chứa ký tự khác ASCII: « %s »\n"
-+msgstr "%s: tên chứa ký tự khác ASCII: “%s”\n"
-
- #, c-format
- msgid "%s: invalid name: '%s'\n"
--msgstr "%s: tên không hợp lệ: « %s »\n"
-+msgstr "%s: tên không hợp lệ: “%s”\n"
-
- #, c-format
- msgid "%s: room number with non-ASCII characters: '%s'\n"
--msgstr "%s: số thứ tự phòng chứa ký tự khác ASCII: « %s »\n"
-+msgstr "%s: số thứ tự phòng chứa ký tự khác ASCII: “%s”\n"
-
- #, c-format
- msgid "%s: invalid room number: '%s'\n"
--msgstr "%s: số thứ tự phòng không hợp lệ: « %s »\n"
-+msgstr "%s: số thứ tự phòng không hợp lệ: “%s”\n"
-
- #, c-format
- msgid "%s: invalid work phone: '%s'\n"
--msgstr "%s: số điện thoại chỗ làm không hợp lệ: « %s »\n"
-+msgstr "%s: số điện thoại chỗ làm không hợp lệ: “%s”\n"
-
- #, c-format
- msgid "%s: invalid home phone: '%s'\n"
--msgstr "%s: số điện thoại ở nhà không hợp lệ: « %s »\n"
-+msgstr "%s: số điện thoại ở nhà không hợp lệ: “%s”\n"
-
- #, c-format
- msgid "%s: '%s' contains non-ASCII characters\n"
--msgstr "%s: « %s » chứa ký tự khác ASCII\n"
-+msgstr "%s: “%s” chứa ký tự không thuộc bảng mã ASCII\n"
-
- #, c-format
- msgid "%s: '%s' contains illegal characters\n"
--msgstr "%s: « %s » chứa ký tự cấm\n"
-+msgstr "%s: “%s” chứa ký tự bị cấm\n"
-
- #, c-format
- msgid "%s: user '%s' does not exist\n"
--msgstr "%s: người dùng « %s » không tồn tại\n"
-+msgstr "%s: người dùng “%s” không tồn tại\n"
-
- #, c-format
- msgid "%s: cannot change user '%s' on NIS client.\n"
--msgstr "%s: không thể thay đổi người dùng « %s » trên ứng dụng khách NIS.\n"
-+msgstr "%s: không thể thay đổi người dùng “%s” trên ứng dụng khách NIS.\n"
-
- #, c-format
- msgid "%s: '%s' is the NIS master for this client.\n"
--msgstr "%s: « %s » là NIS cái cho ứng dụng khách này.\n"
-+msgstr "%s: “%s” là NIS cái cho ứng dụng khách này.\n"
-
- #, c-format
- msgid "Changing the user information for %s\n"
-@@ -757,14 +741,13 @@
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...]\n"
-+"Cách dùng: %s [tuỳ_chọn ...]\n"
- "\n"
- "Tuỳ chọn:\n"
-
--#, fuzzy, c-format
--#| msgid " -c, --crypt-method the crypt method (one of %s)\n"
-+#, c-format
- msgid " -c, --crypt-method METHOD the crypt method (one of %s)\n"
--msgstr " -c, --crypt-method phương pháp mật mã (một của %s)\n"
-+msgstr " -c, --crypt-method PHƯƠNG_THỨC phương pháp mật mã (một trong %s)\n"
-
- msgid " -e, --encrypted supplied passwords are encrypted\n"
- msgstr ""
-@@ -789,11 +772,11 @@
-
- #, c-format
- msgid "%s: the -c, -e, and -m flags are exclusive\n"
--msgstr "%s: các cờ « -c », « -e » và « -m » loại từ lẫn nhau\n"
-+msgstr "%s: các cờ “-c”, “-e” và “-m” loại từ lẫn nhau\n"
-
- #, c-format
- msgid "%s: unsupported crypt method: %s\n"
--msgstr "%s: phương pháp mã hoá không được hỗ trợ : %s\n"
-+msgstr "%s: phương pháp mã hoá không được hỗ trợ: %s\n"
-
- #, c-format
- msgid "%s: line %d: line too long\n"
-@@ -805,11 +788,11 @@
-
- #, c-format
- msgid "%s: line %d: group '%s' does not exist\n"
--msgstr "%s: dòng %d, nhóm « %s » không tồn tại\n"
-+msgstr "%s: dòng %d, nhóm “%s” không tồn tại\n"
-
- #, c-format
- msgid "%s: line %d: failed to prepare the new %s entry '%s'\n"
--msgstr "%s: dòng %d: lỗi chuẩn bị mục nhập %s mới « %s »\n"
-+msgstr "%s: dòng %d: gặp lỗi khi chuẩn bị mục tin %s mới “%s”\n"
-
- #, c-format
- msgid "%s: error detected, changes ignored\n"
-@@ -821,51 +804,51 @@
-
- #, c-format
- msgid "%s: line %d: user '%s' does not exist\n"
--msgstr "%s: dòng %d: người dùng « %s » không tồn tại\n"
-+msgstr "%s: dòng %d: người dùng “%s” không tồn tại\n"
-
- msgid " -s, --shell SHELL new login shell for the user account\n"
- msgstr ""
--" -s, --shell TRÌNH_BAO trình bao đăng nhập mới\n"
--" cho tài khoản người dùng\n"
-+" -s, --shell HỆ_VỎ dùng hệ vỏ đăng nhập mới\n"
-+" cho tài khoản người dùng\n"
-
- msgid "Login Shell"
--msgstr "Trình bao Đăng nhập"
-+msgstr "Hệ vỏ Đăng nhập"
-
- #, c-format
- msgid "You may not change the shell for '%s'.\n"
--msgstr "Không cho phép bạn thay đổi trình bao đối với « %s ».\n"
-+msgstr "Không cho phép bạn thay đổi hệ vỏ đối với “%s”.\n"
-
- #, c-format
- msgid "Changing the login shell for %s\n"
--msgstr "Đang thay đổi trình bao đăng nhập đối với %s\n"
-+msgstr "Đang thay đổi hệ vỏ đăng nhập đối với %s\n"
-
- #, c-format
- msgid "%s: Invalid entry: %s\n"
--msgstr "%s: Mục nhập không hợp lệ: %s\n"
-+msgstr "%s: mục tin không hợp lệ: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: %s is an invalid shell.\n"
-+#, c-format
- msgid "%s: %s is an invalid shell\n"
--msgstr "%s: %s là một trình bao không hợp lệ.\n"
-+msgstr "%s: %s không phải là hệ vỏ hợp lệ\n"
-
--#, fuzzy, c-format
--#| msgid "%s: user '%s' does not exist\n"
-+#, c-format
- msgid "%s: Warning: %s does not exist\n"
--msgstr "%s: người dùng « %s » không tồn tại\n"
-+msgstr "%s: Cảnh báo: %s không tồn tại\n"
-
--#, fuzzy, c-format
--#| msgid "%s: warning: %s not owned by %s\n"
-+#, c-format
- msgid "%s: Warning: %s is not executable\n"
--msgstr "%s: cảnh báo : %s không phải được %s sở hữu\n"
-+msgstr "%s: Cảnh báo: %s không có quyền thực thi\n"
-
- msgid " -c, --check check the user's password expiration\n"
- msgstr ""
-+" -c, --check kiểm tra sự hết hạn của mật khẩu người dùng\n"
-
- msgid ""
- " -f, --force force password change if the user's "
- "password\n"
- " is expired\n"
- msgstr ""
-+" -f, --force ép buộc đổi mật khẩu nếu mật khẩu của người\n"
-+" dùng hết hạn\n"
-
- #, c-format
- msgid "%s: options %s and %s conflict\n"
-@@ -913,20 +896,20 @@
- "đếm\n"
- " lần không đăng nhập được và các giới hạn như "
- "thế\n"
--" (nếu dùng với cờ « -r », « -m » hay « -l » "
--"riêng từng cái)\n"
-+" (nếu dùng với cờ “-r”, “-m” hay “-l” riêng "
-+"từng cái)\n"
- " chỉ cho mỗi tên đăng nhập đưa ra\n"
-
- #, c-format
- msgid "%s: Failed to get the entry for UID %lu\n"
--msgstr "%s: Không lấy được mục nhập cho UID %lu\n"
-+msgstr "%s: Không lấy được mục tin cho UID %lu\n"
-
- msgid "Login Failures Maximum Latest On\n"
--msgstr "Đăng nhập\t\tBị lỗi\tTối đa\tMới nhất Vào\n"
-+msgstr "Đăng nhập Bị lỗi Tối đa Mới nhất Vào\n"
-
- #, c-format
- msgid " [%lus left]"
--msgstr " [%lus còn lại]"
-+msgstr " [còn %lus]"
-
- #, c-format
- msgid " [%lds lock]"
-@@ -934,11 +917,11 @@
-
- #, c-format
- msgid "%s: Failed to reset fail count for UID %lu\n"
--msgstr "%s: không đặt lại được hàm đếm cho UID %lu\n"
-+msgstr "%s: Gặp lỗi khi đặt lại số đếm cho UID %lu\n"
-
- #, c-format
- msgid "%s: Failed to set max for UID %lu\n"
--msgstr "%s: không đặt được số tối đa cho UID %lu\n"
-+msgstr "%s: Gặp lỗi khi đặt số tối đa cho UID %lu\n"
-
- #, c-format
- msgid "%s: Failed to set locktime for UID %lu\n"
-@@ -952,10 +935,9 @@
- msgid "%s: Cannot get the size of %s: %s\n"
- msgstr "%s: Không thể lấy kích cỡ của %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: failed to remove %s\n"
-+#, c-format
- msgid "%s: Failed to write %s: %s\n"
--msgstr "%s: không gỡ bỏ được %s\n"
-+msgstr "%s: Gặp lỗi khi ghi %s: %s\n"
-
- #, c-format
- msgid ""
-@@ -963,7 +945,7 @@
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn] NHÓM\n"
-+"Cách dùng: %s [tuỳ_chọn] NHÓM\n"
- "\n"
- "Tuỳ chọn:\n"
-
-@@ -974,7 +956,7 @@
- msgstr " -d, --delete NGƯỜI_DÙNG gỡ bỏ người dùng này khỏi NHÓM\n"
-
- msgid " -Q, --root CHROOT_DIR directory to chroot into\n"
--msgstr ""
-+msgstr " -Q, --root THƯ_MỤC_ĐỔI thư mục gốc sẽ chuyển đến\n"
-
- msgid " -r, --remove-password remove the GROUP's password\n"
- msgstr " -r, --remove-password gỡ bỏ mật khẩu của NHÓM\n"
-@@ -997,18 +979,18 @@
- " đặt danh sách các quản trị cho NHÓM\n"
-
- msgid "Except for the -A and -M options, the options cannot be combined.\n"
--msgstr "Trừ hai tuỳ chọn « -A » và « -M », không thể tổ hợp các tuỳ chọn.\n"
-+msgstr "Trừ hai tuỳ chọn “-A” và “-M”, không thể tổ hợp các tuỳ chọn.\n"
-
- msgid "The options cannot be combined.\n"
- msgstr "Không thể tổ hợp các tuỳ chọn.\n"
-
- #, c-format
- msgid "%s: shadow group passwords required for -A\n"
--msgstr "%s: mật khẩu nhóm bóng cần thiết cho tùy chọn « -A »\n"
-+msgstr "%s: mật khẩu nhóm shadow cần cho tùy chọn “-A”\n"
-
- #, c-format
- msgid "%s: group '%s' does not exist in %s\n"
--msgstr "%s: nhóm « %s » không tồn tại trong %s\n"
-+msgstr "%s: nhóm “%s” không tồn tại trong %s\n"
-
- #, c-format
- msgid "%s: failure while closing read-only %s\n"
-@@ -1025,11 +1007,11 @@
- msgstr "Nhập lại mật khẩu mới: "
-
- msgid "They don't match; try again"
--msgstr "Hai mật khẩu không trùng thì háy thử lại."
-+msgstr "Hai mật khẩu không khớp nhau, hãy thử lại"
-
- #, c-format
- msgid "%s: Try again later\n"
--msgstr "%s: hãy thử lại sau.\n"
-+msgstr "%s: Hãy thử lại sau\n"
-
- #, c-format
- msgid "Adding user %s to group %s\n"
-@@ -1041,7 +1023,7 @@
-
- #, c-format
- msgid "%s: user '%s' is not a member of '%s'\n"
--msgstr "%s: người dùng « %s » không thuộc về « %s »\n"
-+msgstr "%s: người dùng “%s” không thuộc về “%s”\n"
-
- #, c-format
- msgid "%s: Not a tty\n"
-@@ -1053,7 +1035,7 @@
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...] NHÓM\n"
-+"Cách dùng: %s [tuỳ_chọn ...] NHÓM\n"
- "\n"
- "Tuỳ chọn:\n"
-
-@@ -1062,16 +1044,16 @@
- "exists,\n"
- " and cancel -g if the GID is already used\n"
- msgstr ""
--" -f, --force thoát thành công nếu nhóm đã có, và hủy bỏ « "
--"-g » nếu GID đã được dùng\n"
-+" -f, --force thoát thành công nếu nhóm đã có, và \n"
-+" hủy bỏ “-g” nếu GID đã được dùng\n"
-
- msgid " -g, --gid GID use GID for the new group\n"
- msgstr " -g, --gid GID dùng GID này cho nhóm mới\n"
-
- msgid " -K, --key KEY=VALUE override /etc/login.defs defaults\n"
- msgstr ""
--" -K, --key KHOÁ=GIÁ_TRỊ ghi đè lên các giá trị mặc định « /etc/login."
--"defs »\n"
-+" -K, --key KHOÁ=GIÁ_TRỊ ghi đè lên các giá trị mặc định “/etc/login."
-+"defs”\n"
-
- msgid ""
- " -o, --non-unique allow to create groups with duplicate\n"
-@@ -1091,44 +1073,43 @@
-
- #, c-format
- msgid "%s: '%s' is not a valid group name\n"
--msgstr "%s: « %s » không phải là tên nhóm hợp lệ\n"
-+msgstr "%s: “%s” không phải là tên nhóm hợp lệ\n"
-
- #, c-format
- msgid "%s: invalid group ID '%s'\n"
--msgstr "%s: mã số nhóm (GID) không hợp lệ « %s »\n"
-+msgstr "%s: mã số nhóm (GID) không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: -K requires KEY=VALUE\n"
--msgstr "%s: -K cần thiết cú pháp KHÓA=GIÁ_TRỊ\n"
-+msgstr "%s: -K cần cú pháp KHÓA=GIÁ_TRỊ\n"
-
- #, c-format
- msgid "%s: group '%s' already exists\n"
--msgstr "%s: nhóm « %s » đã có\n"
-+msgstr "%s: nhóm “%s” đã có\n"
-
- #, c-format
- msgid "%s: GID '%lu' already exists\n"
--msgstr "%s: GID « %lu » đã có\n"
-+msgstr "%s: GID “%lu” đã có\n"
-
--#, fuzzy, c-format
--#| msgid "%s: Cannot determine your user name.\n"
-+#, c-format
- msgid "%s: Cannot setup cleanup service.\n"
--msgstr "%s: không thể quyết định tên người dùng của bạn.\n"
-+msgstr "%s: Không thể cài đặt dịch vụ dọn dẹp.\n"
-
- #, c-format
- msgid "%s: cannot remove entry '%s' from %s\n"
--msgstr "%s: không thể gỡ bỏ mục nhập « %s » khỏi %s\n"
-+msgstr "%s: không thể gỡ bỏ mục tin “%s” khỏi %s\n"
-
- #, c-format
- msgid "%s: cannot remove the primary group of user '%s'\n"
--msgstr "%s: không thể gỡ bỏ nhóm chính của người dùng « %s »\n"
-+msgstr "%s: không thể gỡ bỏ nhóm chính của người dùng “%s”\n"
-
- #, c-format
- msgid "%s: group '%s' does not exist\n"
--msgstr "%s: nhóm « %s » không tồn tại\n"
-+msgstr "%s: nhóm “%s” không tồn tại\n"
-
- #, c-format
- msgid "%s: group '%s' is a NIS group\n"
--msgstr "%s: nhóm « %s » là một nhóm kiểu NIS\n"
-+msgstr "%s: nhóm “%s” là một nhóm kiểu NIS\n"
-
- #, c-format
- msgid "%s: %s is the NIS master\n"
-@@ -1136,11 +1117,11 @@
-
- #, c-format
- msgid "%s: user '%s' is already a member of '%s'\n"
--msgstr "%s: người dùng « %s » đã thuộc về « %s »\n"
-+msgstr "%s: người dùng “%s” đã thuộc về “%s”\n"
-
- #, c-format
- msgid "%s: Out of memory. Cannot update %s.\n"
--msgstr "%s: Không đủ bộ nhớ. Không thể cập nhật %s.\n"
-+msgstr "%s: Hết bộ nhớ. Không thể cập nhật %s.\n"
-
- #, c-format
- msgid ""
-@@ -1148,7 +1129,7 @@
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...] [hành_vi]\n"
-+"Cách dùng: %s [tuỳ_chọn ...] [hành_vi]\n"
- "\n"
- "Tuỳ chọn:\n"
-
-@@ -1157,14 +1138,14 @@
- "group\n"
- " (root only)\n"
- msgstr ""
--" -g, --group TÊN_NHÓM thay đổi tên của nhóm này thay cho nhóm của "
--"người dùng (chỉ người chủ)\n"
-+" -g, --group TÊN_NHÓM thay đổi tên của nhóm này thay cho nhóm của\n"
-+" người dùng (chỉ siêu quản trị)\n"
-
- msgid "\n"
- msgstr "\n"
-
- msgid "Actions:\n"
--msgstr "Hành vi:\n"
-+msgstr "Hành động là:\n"
-
- msgid ""
- " -a, --add username add username to the members of the group\n"
-@@ -1187,7 +1168,7 @@
-
- #, c-format
- msgid "%s: only root can use the -g/--group option\n"
--msgstr "%s: chỉ người chủ có quyền sử dụng tuỳ chọn « -g/--group »\n"
-+msgstr "%s: chỉ siêu quản trị có quyền sử dụng tuỳ chọn “-g/--group”\n"
-
- msgid " -g, --gid GID change the group ID to GID\n"
- msgstr " -g, --gid GID thay đổi mã số nhóm sang GID này\n"
-@@ -1210,7 +1191,7 @@
-
- #, c-format
- msgid "%s: invalid group name '%s'\n"
--msgstr "%s: tên nhóm không hợp lệ « %s »\n"
-+msgstr "%s: tên nhóm không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: group %s is a NIS group\n"
-@@ -1220,70 +1201,57 @@
- msgid "%s: unknown user %s\n"
- msgstr "%s: không rõ người dùng %s\n"
-
--#, fuzzy, c-format
--#| msgid ""
--#| "Usage: %s [options]\n"
--#| "\n"
--#| "Options:\n"
-+#, c-format
- msgid ""
- "Usage: %s [options] [group [gshadow]]\n"
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...]\n"
-+"Cách dùng: %s [các_tuỳ_chọn] [group [gshadow]]\n"
- "\n"
- "Tuỳ chọn:\n"
-
--#, fuzzy, c-format
--#| msgid ""
--#| "Usage: %s [options]\n"
--#| "\n"
--#| "Options:\n"
-+#, c-format
- msgid ""
- "Usage: %s [options] [group]\n"
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...]\n"
-+"Cách dùng: %s [các_tuỳ_chọn] [group]\n"
- "\n"
- "Tuỳ chọn:\n"
-
--#, fuzzy
--#| msgid ""
--#| " -s, --sha-rounds number of SHA rounds for the SHA*\n"
--#| " crypt algorithms\n"
- msgid ""
- " -r, --read-only display errors and warnings\n"
- " but do not change files\n"
- msgstr ""
--" -s, --sha-rounds số vòng SHA cho thuật toán mã hoá SHA*\n"
-+" -r, --read-only hiển thị lỗi và cảnh báo\n"
-+" nhưng không thay đổi các tập tin\n"
-
--#, fuzzy
--#| msgid " -g, --gid GID use GID for the new group\n"
- msgid " -s, --sort sort entries by UID\n"
--msgstr " -g, --gid GID dùng GID này cho nhóm mới\n"
-+msgstr " -s, --sort sắp xếp các mục tin theo UID\n"
-
- #, c-format
- msgid "%s: -s and -r are incompatible\n"
--msgstr "%s: hai tùy chọn « -s » và « -r » không tương thích với nhau\n"
-+msgstr "%s: hai tùy chọn “-s” và “-r” không tương thích với nhau\n"
-
- msgid "invalid group file entry"
--msgstr "mục nhập tập tin nhóm không hợp lệ"
-+msgstr "mục tin tập tin nhóm không hợp lệ"
-
- #, c-format
- msgid "delete line '%s'? "
--msgstr "xóa dòng « %s » không? "
-+msgstr "xóa dòng “%s” không? "
-
- msgid "duplicate group entry"
--msgstr "mục nhập nhóm trùng"
-+msgstr "mục tin nhóm trùng"
-
- #, c-format
- msgid "invalid group name '%s'\n"
--msgstr "tên nhóm không hợp lệ « %s »\n"
-+msgstr "tên nhóm không hợp lệ “%s”\n"
-
- #, c-format
- msgid "invalid group ID '%lu'\n"
--msgstr "mã số nhóm không hợp lệ « %lu »\n"
-+msgstr "mã số nhóm không hợp lệ “%lu”\n"
-
- #, c-format
- msgid "group %s: no user %s\n"
-@@ -1291,40 +1259,40 @@
-
- #, c-format
- msgid "delete member '%s'? "
--msgstr "xóa thành viên « %s » không? "
-+msgstr "xóa thành viên “%s” không? "
-
- #, c-format
- msgid "no matching group file entry in %s\n"
--msgstr "không có mục nhập tập tin nhóm tương ứng trong %s\n"
-+msgstr "không có mục tin tập tin nhóm tương ứng trong %s\n"
-
- #, c-format
- msgid "add group '%s' in %s? "
--msgstr "thêm nhóm « %s » trong %s không?"
-+msgstr "thêm nhóm “%s” trong %s không?"
-
- #, c-format
- msgid ""
- "group %s has an entry in %s, but its password field in %s is not set to 'x'\n"
- msgstr ""
--"nhóm %s có một mục nhập trong %s, còn trường mật khẩu trong %s không phải "
--"được đặt thành « x »\n"
-+"nhóm %s có một mục tin trong %s, còn trường mật khẩu trong %s không phải "
-+"được đặt thành “x”\n"
-
- msgid "invalid shadow group file entry"
--msgstr "mục nhập tập tin nhóm bóng không hợp lệ"
-+msgstr "mục tin tập tin nhóm shadow không hợp lệ"
-
- msgid "duplicate shadow group entry"
--msgstr "mục nhập nhóm bóng trùng"
-+msgstr "mục tin nhóm shadow trùng"
-
- #, c-format
- msgid "shadow group %s: no administrative user %s\n"
--msgstr "nhóm bóng %s: không có người dùng quản trị %s\n"
-+msgstr "nhóm shadow %s: không có người dùng quản trị %s\n"
-
- #, c-format
- msgid "delete administrative member '%s'? "
--msgstr "xóa thành viên quản trị « %s » không? "
-+msgstr "xóa thành viên quản trị “%s” không? "
-
- #, c-format
- msgid "shadow group %s: no user %s\n"
--msgstr "nhóm bóng %s: không có người dùng %s\n"
-+msgstr "nhóm shadow %s: không có người dùng %s\n"
-
- #, c-format
- msgid "%s: the files have been updated\n"
-@@ -1339,10 +1307,10 @@
- msgstr "%s: không thể xoá %s\n"
-
- msgid "Usage: id [-a]\n"
--msgstr "Sử dụng: id [-a]\n"
-+msgstr "Cách dùng: id [-a]\n"
-
- msgid "Usage: id\n"
--msgstr "Sử dụng: id\n"
-+msgstr "Cách dùng: id\n"
-
- msgid " groups="
- msgstr " nhóm="
-@@ -1350,7 +1318,8 @@
- msgid ""
- " -b, --before DAYS print only lastlog records older than DAYS\n"
- msgstr ""
--" -b, --before SỐ hiển thị chỉ những bản ghi lastlog\n"
-+" -b, --before SỐ hiển thị chỉ những bản ghi lastlog cũ hơn SỐ "
-+"ngày\n"
- " cũ hơn số ngày này (_trước_)\n"
-
- msgid ""
-@@ -1358,7 +1327,7 @@
- "DAYS\n"
- msgstr ""
- " -t, --time SỐ hiển thị chỉ những mục ghi lastlog\n"
--" mới hơn số ngày này (_thời gian_)\n"
-+" mới hơn số ngày này (_thời gian_)\n"
-
- msgid ""
- " -u, --user LOGIN print lastlog record of the specified LOGIN\n"
-@@ -1367,17 +1336,17 @@
- "tên này\n"
-
- msgid "Username Port From Latest"
--msgstr "Tên dùng\t\t Cổng Từ\t\tMới nhất"
-+msgstr "Tài_khoản Cổng Từ Mới nhất"
-
- msgid "Username Port Latest"
--msgstr "Tên dùng\t\t\t Cổng Mới nhất"
-+msgstr "Người dùng Cổng Mới nhất"
-
- msgid "**Never logged in**"
- msgstr "**Chưa bao giờ đăng nhập**"
-
- #, c-format
- msgid "Usage: %s [-p] [name]\n"
--msgstr "Sử dụng: %s [-p] [tên]\n"
-+msgstr "Cách dùng: %s [-p] [tên]\n"
-
- #, c-format
- msgid " %s [-p] [-h host] [-f name]\n"
-@@ -1389,7 +1358,7 @@
-
- #, c-format
- msgid "configuration error - cannot parse %s value: '%d'"
--msgstr "lỗi cấu hình — không thể phân tích cú pháp của giá trị %s: « %d »"
-+msgstr "lỗi cấu hình — không thể phân tích cú pháp của giá trị %s: “%d”"
-
- msgid "Invalid login time"
- msgstr "Thời gian đăng nhập không hợp lệ"
-@@ -1406,7 +1375,7 @@
- "[Disconnect bypassed -- root login allowed.]"
- msgstr ""
- "\n"
--"[Chức năng ngắt kết nối đã bị vòng: cho phép người chủ đăng nhập.]"
-+"[Chức năng ngắt kết nối đã bị vòng: cho phép siêu quản trị đăng nhập.]"
-
- #, c-format
- msgid ""
-@@ -1422,12 +1391,12 @@
-
- msgid "No utmp entry. You must exec \"login\" from the lowest level \"sh\""
- msgstr ""
--"Không có mục nhập utmp. Vì thế bạn cần phải thực hiện « login » (đăng nhập) "
--"từ « sh » (trình bao) cấp dưới cùng."
-+"Không có mục tin utmp. Vì thế bạn cần phải thực hiện “login” (đăng nhập) từ "
-+"“sh” (hệ vỏ) cấp dưới cùng."
-
- #, c-format
- msgid "login: PAM Failure, aborting: %s\n"
--msgstr "login: (đăng nhập) PAM bị lỗi nên hủy bỏ : %s\n"
-+msgstr "login: (đăng nhập) PAM bị lỗi nên hủy bỏ: %s\n"
-
- #, c-format
- msgid "%s login: "
-@@ -1446,10 +1415,9 @@
- msgid "Login incorrect"
- msgstr "Đăng nhập không đúng"
-
--#, fuzzy, c-format
--#| msgid "%s: Cannot determine your user name.\n"
-+#, c-format
- msgid "Cannot find user (%s)\n"
--msgstr "%s: không thể quyết định tên người dùng của bạn.\n"
-+msgstr "Không thể tìm thấy người dùng (%s)\n"
-
- #, c-format
- msgid ""
-@@ -1468,7 +1436,7 @@
- msgstr "TIOCSCTTY bị lỗi vào %s"
-
- msgid "Warning: login re-enabled after temporary lockout."
--msgstr "Cảnh báo : đăng nhập đã bật lại sau bị khoá ra tạm thời."
-+msgstr "Cảnh báo: đăng nhập đã bật lại sau bị khoá ra tạm thời."
-
- #, c-format
- msgid "Last login: %s on %s"
-@@ -1490,16 +1458,16 @@
- "\n"
-
- msgid "Usage: logoutd\n"
--msgstr "Usage: logoutd\n"
-+msgstr "Cách dùng: logoutd\n"
-
- msgid "Usage: newgrp [-] [group]\n"
- msgstr ""
--"Sử dụng: newgrp [-] [nhóm]\n"
-+"Cách dùng: newgrp [-] [nhóm]\n"
- "[newgrp: nhóm mới]\n"
-
- msgid "Usage: sg group [[-c] command]\n"
- msgstr ""
--"Sử dụng: sg group [[-c] lệnh]\n"
-+"Cách dùng: sg group [[-c] lệnh]\n"
- "[group: nhóm]\n"
-
- msgid "Invalid password.\n"
-@@ -1511,7 +1479,7 @@
-
- #, c-format
- msgid "%s: GID '%lu' does not exist\n"
--msgstr "%s: GID « %lu » không tồn tại\n"
-+msgstr "%s: GID “%lu” không tồn tại\n"
-
- msgid "too many groups\n"
- msgstr "quá nhiều nhóm\n"
-@@ -1522,15 +1490,15 @@
- #, c-format
- msgid "%s: group '%s' is a shadow group, but does not exist in /etc/group\n"
- msgstr ""
--"%s: nhóm « %s » là một nhóm bóng, nhưng không tồn tại trong « /etc/group »\n"
-+"%s: nhóm “%s” là một nhóm shadow, nhưng không tồn tại trong “/etc/group”\n"
-
- #, c-format
- msgid "%s: invalid user ID '%s'\n"
--msgstr "%s: mã số người dùng không hợp lệ « %s »\n"
-+msgstr "%s: mã số người dùng không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: invalid user name '%s'\n"
--msgstr "%s: tên dùng không hợp lệ « %s »\n"
-+msgstr "%s: tên dùng không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: line %d: invalid line\n"
-@@ -1539,7 +1507,7 @@
- #, c-format
- msgid "%s: cannot update the entry of user %s (not in the passwd database)\n"
- msgstr ""
--"%s: không thể cập nhật mục nhập của người dùng %s (không có trong cơ sở dữ "
-+"%s: không thể cập nhật mục tin của người dùng %s (không có trong cơ sở dữ "
- "liệu mật khẩu passwd)\n"
-
- #, c-format
-@@ -1552,7 +1520,7 @@
-
- #, c-format
- msgid "%s: line %d: user '%s' does not exist in %s\n"
--msgstr "%s: dòng %d: người dùng « %s » không tồn tại trong %s\n"
-+msgstr "%s: dòng %d: người dùng “%s” không tồn tại trong %s\n"
-
- #, c-format
- msgid "%s: line %d: can't update password\n"
-@@ -1568,7 +1536,7 @@
-
- #, c-format
- msgid "%s: line %d: can't update entry\n"
--msgstr "%s: dòng %d: không thể cập nhật mục nhập\n"
-+msgstr "%s: dòng %d: không thể cập nhật mục tin\n"
-
- msgid ""
- " -a, --all report password status on all accounts\n"
-@@ -1642,7 +1610,7 @@
- "khi thay đổi được mật khẩu\n"
-
- msgid "Old password: "
--msgstr "Mật khẩu cũ : "
-+msgstr "Mật khẩu cũ: "
-
- #, c-format
- msgid ""
-@@ -1671,7 +1639,7 @@
- "Warning: weak password (enter it again to use it anyway)."
- msgstr ""
- "\n"
--"Cảnh báo : mật khẩu yếu (nhập lại để vẫn chọn)"
-+"Cảnh báo: mật khẩu yếu (nhập lại để vẫn chọn)"
-
- msgid "They don't match; try again.\n"
- msgstr "Hai mật khẩu không trùng: hãy thử lại.\n"
-@@ -1691,8 +1659,8 @@
- "account.\n"
- msgstr ""
- "%s: mở khoá mật khẩu thì gây ra một tài khoản không có mật khẩu.\n"
--"Bạn nên đặt một mật khẩu dùng câu lệnh « usermod -p » để mở khoá mật khẩu "
--"của tài khoản này.\n"
-+"Bạn nên đặt một mật khẩu dùng câu lệnh “usermod -p” để mở khoá mật khẩu của "
-+"tài khoản này.\n"
-
- #, c-format
- msgid "%s: repository %s not supported\n"
-@@ -1723,109 +1691,96 @@
- msgid "%s: password expiry information changed.\n"
- msgstr "%s: thông tin đã thay đổi về sự hết hạn sử dụng mật khẩu.\n"
-
--#, fuzzy, c-format
--#| msgid ""
--#| "Usage: %s [options]\n"
--#| "\n"
--#| "Options:\n"
-+#, c-format
- msgid ""
- "Usage: %s [options] [passwd]\n"
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...]\n"
-+"Cách dùng: %s [các_tuỳ_chọn] [passwd]\n"
- "\n"
- "Tuỳ chọn:\n"
-
--#, fuzzy, c-format
--#| msgid ""
--#| "Usage: %s [options]\n"
--#| "\n"
--#| "Options:\n"
-+#, c-format
- msgid ""
- "Usage: %s [options] [passwd [shadow]]\n"
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...]\n"
-+"Cách dùng: %s [các_tuỳ_chọn] [passwd [shadow]]\n"
- "\n"
- "Tuỳ chọn:\n"
-
--#, fuzzy
--#| msgid " -g, --gid GID use GID for the new group\n"
- msgid " -q, --quiet report errors only\n"
--msgstr " -g, --gid GID dùng GID này cho nhóm mới\n"
-+msgstr " -q, --quiet chỉ báo cáo lỗi\n"
-
- #, c-format
- msgid "%s: no alternative shadow file allowed when USE_TCB is enabled.\n"
- msgstr ""
-+"%s: không cho phép tập tin shadow thay thế khi mà biến USE_TCB được đặt.\n"
-
- msgid "invalid password file entry"
--msgstr "Mục nhập tập tin mật khẩu không hợp lệ"
-+msgstr "mục tin tập tin mật khẩu không hợp lệ"
-
- msgid "duplicate password entry"
--msgstr "mục nhập mật khẩu trùng"
-+msgstr "mục tin mật khẩu trùng"
-
- #, c-format
- msgid "invalid user name '%s'\n"
--msgstr "tên người dùng không hợp lệ « %s »\n"
-+msgstr "tên người dùng không hợp lệ “%s”\n"
-
- #, c-format
- msgid "invalid user ID '%lu'\n"
--msgstr "mã số người dùng không hợp lệ « %lu »\n"
-+msgstr "mã số người dùng không hợp lệ “%lu”\n"
-
- #, c-format
- msgid "user '%s': no group %lu\n"
--msgstr "người dùng « %s »: không có nhóm %lu\n"
-+msgstr "người dùng “%s”: không có nhóm %lu\n"
-
- #, c-format
- msgid "user '%s': directory '%s' does not exist\n"
--msgstr "người dùng « %s »: thư mục « %s » không tồn tại\n"
-+msgstr "người dùng “%s”: thư mục “%s” không tồn tại\n"
-
- #, c-format
- msgid "user '%s': program '%s' does not exist\n"
--msgstr "người dùng « %s »: chương trình « %s » không tồn tại\n"
-+msgstr "người dùng “%s”: chương trình “%s” không tồn tại\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "no tcb directory for %s\n"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "không có thư mục tcb cho %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "create tcb directory for %s?"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "tạo thư mục tcb %s không?"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "failed to create tcb directory for %s\n"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "gặp lỗi khi tạo thư mục tcb cho %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot open %s\n"
-+#, c-format
- msgid "%s: cannot lock %s.\n"
--msgstr "%s: không thể mở %s\n"
-+msgstr "%s: không thể khóa %s.\n"
-
- #, c-format
- msgid "no matching password file entry in %s\n"
--msgstr "không có mục nhập tập tin mật khẩu tương ứng trong %s\n"
-+msgstr "không có mục tin tập tin mật khẩu tương ứng trong %s\n"
-
- #, c-format
- msgid "add user '%s' in %s? "
--msgstr "thêm người dùng « %s » trong %s không?"
-+msgstr "thêm người dùng “%s” trong %s không?"
-
- #, c-format
- msgid ""
- "user %s has an entry in %s, but its password field in %s is not set to 'x'\n"
- msgstr ""
--"người dùng %s có một mục nhập trong %s, còn trường mật khẩu trong %s không "
--"phải được đặt thành « s »\n"
-+"người dùng %s có một mục tin trong %s, còn trường mật khẩu trong %s không "
-+"phải được đặt thành “s”\n"
-
- msgid "invalid shadow password file entry"
--msgstr "mục nhập tập tin mật khẩu bóng không hợp lệ"
-+msgstr "mục tin tập tin mật khẩu shadow không hợp lệ"
-
- msgid "duplicate shadow password entry"
--msgstr "mục nhập mật khẩu bóng trùng"
-+msgstr "mục tin mật khẩu shadow trùng"
-
- #, c-format
- msgid "user %s: last password change in the future\n"
-@@ -1833,18 +1788,18 @@
-
- #, c-format
- msgid "%s: cannot sort entries in %s\n"
--msgstr "%s: không thể sắp xếp các mục nhập trong %s\n"
-+msgstr "%s: không thể sắp xếp các mục tin trong %s\n"
-
- #, c-format
- msgid "%s: can't work with tcb enabled\n"
--msgstr ""
-+msgstr "%s: không thể làm việc khi tcb được bật\n"
-
- #, c-format
- msgid "%s: failed to change the mode of %s to 0600\n"
- msgstr "%s: không thay đổi được chế độ của %s thành 0600\n"
-
- msgid "Access to su to that account DENIED.\n"
--msgstr "Truy cập « su » vào tài khoản đó BỊ TỪ CHỐI.\n"
-+msgstr "Truy cập “su” vào tài khoản đó BỊ TỪ CHỐI.\n"
-
- msgid "Password authentication bypassed.\n"
- msgstr "Xác thực mật khẩu bị đi vòng.\n"
-@@ -1853,33 +1808,32 @@
- msgstr "Hãy nhập mật khẩu của MÌNH để xác thực.\n"
-
- msgid " ...killed.\n"
--msgstr ""
-+msgstr " ...đã chết.\n"
-
- msgid " ...waiting for child to terminate.\n"
--msgstr ""
-+msgstr " ...đang đợi tiến con chấm dứt.\n"
-
--#, fuzzy, c-format
--#| msgid "%s: Cannot determine your user name.\n"
-+#, c-format
- msgid "%s: Cannot fork user shell\n"
--msgstr "%s: không thể quyết định tên người dùng của bạn.\n"
-+msgstr "%s: Không thể rẽ nhánh tiến trình hệ vỏ người dùng\n"
-
- #, c-format
- msgid "%s: signal malfunction\n"
--msgstr ""
-+msgstr "%s: tín hiệu trục trặc\n"
-
- #, c-format
- msgid "%s: signal masking malfunction\n"
--msgstr ""
-+msgstr "%s: trục trặc mặt nạ tín hiệu\n"
-
- msgid "Session terminated, terminating shell..."
--msgstr ""
-+msgstr "Phiên làm việc đã kết thúc, nên kết thúc hệ vỏ..."
-
- #, c-format
- msgid "%s: %s\n"
- msgstr "%s: %s\n"
-
- msgid " ...terminated.\n"
--msgstr ""
-+msgstr " ...đã chấm dứt.\n"
-
- msgid ""
- "Usage: su [options] [LOGIN]\n"
-@@ -1894,20 +1848,20 @@
- " -s, --shell SHELL use SHELL instead of the default in passwd\n"
- "\n"
- msgstr ""
--"Sử dụng: su [tùy_chọn...] [đăng_nhập]\n"
-+"Cách dùng: su [tùy_chọn...] [đăng_nhập]\n"
- "\n"
- "[su: siêu người dùng]\n"
- "\n"
- "Tùy chọn:\n"
--" -c, --command LỆNH gởi lệnh này qua cho trình bao đã gọi\n"
-+" -c, --command LỆNH gởi lệnh này qua cho hệ vỏ đã gọi\n"
- " -h, --help hiển thị _trợ giúp_ này rồi thoát\n"
--" -, -l, --login lập trình bao là trình bao _đăng nhập_\n"
-+" -, -l, --login lập hệ vỏ là hệ vỏ _đăng nhập_\n"
- " -m, -p,\n"
--" --preserve-environment đừng lập lại các biến _môi trường_, và "
-+" --preserve-environment đừng đặt lại các biến _môi trường_, và "
- "_giữ_\n"
--" trình bao hiện có\n"
--" -s, --shell TRÌNH_BAO sử dụng trình bao này thay cho trình mặc "
--"định trong passwd\n"
-+" hệ vỏ hiện có\n"
-+" -s, --shell HỆ_VỎ dùng hệ vỏ này thay cho trình mặc định trong "
-+"passwd\n"
- "\n"
-
- #, c-format
-@@ -1916,11 +1870,11 @@
- "(Ignored)\n"
- msgstr ""
- "%s: %s\n"
--"(Bị bo qua)\n"
-+"(Bị bỏ qua)\n"
-
- #, c-format
- msgid "You are not authorized to su %s\n"
--msgstr "Bạn không có quyền sử dụng lệnh « su » (siêu người dùng) với %s.\n"
-+msgstr "Bạn không có quyền sử dụng lệnh “su” (siêu người dùng) với %s.\n"
-
- msgid "(Enter your own password)"
- msgstr "(Nhập mật khẩu của mình)"
-@@ -1932,12 +1886,11 @@
- #, c-format
- msgid "%s: You are not authorized to su at that time\n"
- msgstr ""
--"%s: Bạn không có quyền sử dụng lệnh « su » (siêu người dùng) vào lúc đó\n"
-+"%s: Bạn không có quyền sử dụng lệnh “su” (siêu người dùng) vào lúc đó\n"
-
--#, fuzzy, c-format
--#| msgid "No password entry for 'root'"
-+#, c-format
- msgid "No passwd entry for user '%s'\n"
--msgstr "Không có mục nhập mật khẩu cho « root » (người chủ)"
-+msgstr "Không có mục tin mật khẩu cho tài khoản '%s'\n"
-
- #, c-format
- msgid "%s: must be run from a terminal\n"
-@@ -1947,15 +1900,13 @@
- msgid "%s: pam_start: error %d\n"
- msgstr "%s: pam_start: (pam bắt đầu) lỗi %d\n"
-
--#, fuzzy, c-format
--#| msgid "lastlog: Cannot get the size of %s: %s\n"
-+#, c-format
- msgid "%s: Cannot drop the controlling terminal\n"
--msgstr "lastlog: Không thể lấy kích cỡ của %s: %s\n"
-+msgstr "%s: Không thể xóa thiết bị cuối điều khiển\n"
-
--#, fuzzy, c-format
--#| msgid "Cannot execute %s"
-+#, c-format
- msgid "Cannot execute %s\n"
--msgstr "Không thể thực hiện %s"
-+msgstr "Không thể thực thi %s\n"
-
- msgid "No password file"
- msgstr "Không có tập tin mật khẩu"
-@@ -1964,7 +1915,7 @@
- msgstr "TIOCSCTTY bị lỗi"
-
- msgid "No password entry for 'root'"
--msgstr "Không có mục nhập mật khẩu cho « root » (người chủ)"
-+msgstr "Không có mục tin mật khẩu cho “root” (siêu quản trị)"
-
- msgid ""
- "\n"
-@@ -1973,14 +1924,14 @@
- msgstr ""
- "\n"
- "Hãy gõ tổ hợp phím Ctrl-D để tiếp tục khởi động bình thường,\n"
--"(hoặc nhập mật khẩu người chủ để bảo dưỡng hệ thống):"
-+"(hoặc nhập mật khẩu siêu quản trị để bảo dưỡng hệ thống):"
-
- msgid "Entering System Maintenance Mode"
- msgstr "Đang vào Chế độ Bảo dưỡng Hệ thống"
-
- #, c-format
- msgid "%s: %s was created, but could not be removed\n"
--msgstr ""
-+msgstr "%s: %s đã được tạo, nhưng không thể bị gỡ bỏ\n"
-
- #, c-format
- msgid "%s: the %s configuration in %s will be ignored\n"
-@@ -1998,10 +1949,9 @@
- msgid "%s: line too long in %s: %s..."
- msgstr "%s: dòng quá dài trong %s: %s..."
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "%s: Cannot create backup file (%s): %s\n"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "%s: Không thể tạo tập tin sao lưu dự phòng (%s): %s\n"
-
- #, c-format
- msgid "%s: rename: %s: %s\n"
-@@ -2009,17 +1959,13 @@
-
- #, c-format
- msgid "%s: group '%s' is a NIS group.\n"
--msgstr "%s: nhóm « %s » là nhóm kiểu NIS.\n"
-+msgstr "%s: nhóm “%s” là nhóm kiểu NIS.\n"
-
- #, c-format
- msgid "%s: too many groups specified (max %d).\n"
- msgstr "%s: ghi rõ quá nhiều nhóm (tối đa %d).\n"
-
--#, fuzzy, c-format
--#| msgid ""
--#| "Usage: %s [options]\n"
--#| "\n"
--#| "Options:\n"
-+#, c-format
- msgid ""
- "Usage: %s [options] LOGIN\n"
- " %s -D\n"
-@@ -2027,7 +1973,9 @@
- "\n"
- "Options:\n"
- msgstr ""
--"Sử dụng: %s [tuỳ_chọn ...]\n"
-+"Cách dùng: %s [các_tuỳ_chọn] LOGIN\n"
-+" %s -D\n"
-+" %s -D [các-tùy-chọn]\n"
- "\n"
- "Tuỳ chọn:\n"
-
-@@ -2036,63 +1984,62 @@
- "the\n"
- " new account\n"
- msgstr ""
--" -b, --base-dir THƯ_MỤC đặt thư mục cơ bản cho thư mục chính của tài "
-+" -b, --base-dir THƯ_MỤC đặt thư mục cơ bản cho thư mục riêng của tài "
- "khoản mới\n"
-
- msgid " -c, --comment COMMENT GECOS field of the new account\n"
- msgstr " -c, --comment GHI_CHÚ trường GECOS của tài khoản mới\n"
-
- msgid " -d, --home-dir HOME_DIR home directory of the new account\n"
--msgstr " -d, --home-dir THƯ_MỤC thư mục chính của tài khoản mới\n"
-+msgstr " -d, --home-dir THƯ_MỤC thư mục riêng của tài khoản mới\n"
-
- msgid ""
- " -D, --defaults print or change default useradd "
- "configuration\n"
- msgstr ""
--" -D, --defaults ra ra hay thay đổi cấu hình useradd mặc "
--"định\n"
-+" -D, --defaults in hay thay đổi cấu hình useradd mặc định\n"
-
- msgid " -e, --expiredate EXPIRE_DATE expiration date of the new account\n"
--msgstr " -e, --expiredate NGÀY ngày hết hạn sử dụng tài khoản mới\n"
-+msgstr " -e, --expiredate NGÀY ngày hết hạn sử dụng tài khoản mới\n"
-
- msgid ""
- " -f, --inactive INACTIVE password inactivity period of the new "
- "account\n"
- msgstr ""
--" -f, --inactive KHOẢNG khoảng thời gian không hoạt động của tài khoản "
--"mới\n"
-+" -f, --inactive KHOẢNG khoảng thời gian không hoạt động của tài "
-+"khoản mới\n"
-
- msgid ""
- " -g, --gid GROUP name or ID of the primary group of the new\n"
- " account\n"
- msgstr ""
--" -g, --gid NHÓM tên của mã số của nhóm chính của tài khoản "
-+" -g, --gid NHÓM tên của mã số của nhóm chính của tài khoản "
- "mới\n"
-
- msgid ""
- " -G, --groups GROUPS list of supplementary groups of the new\n"
- " account\n"
- msgstr ""
--" -G, --groups NHÓM danh sách các nhóm phụ của tài khoản mới\n"
-+" -G, --groups NHÓM danh sách các nhóm phụ của tài khoản mới\n"
-
- msgid ""
- " -k, --skel SKEL_DIR use this alternative skeleton directory\n"
--msgstr " -k, --skel THƯ_MỤC dùng thư mục khung sườn xen kẽ\n"
-+msgstr " -k, --skel THƯ_MỤC dùng thư mục khung sườn thay thế\n"
-
- msgid ""
- " -l, --no-log-init do not add the user to the lastlog and\n"
- " faillog databases\n"
- msgstr ""
--" -l, --no-log-init đừng thêm người dùng vào các cơ sở dữ liệu "
--"faillog và lastlog\n"
-+" -l, --no-log-init đừng thêm người dùng vào các cơ sở \n"
-+" dữ liệu faillog và lastlog\n"
-
- msgid " -m, --create-home create the user's home directory\n"
--msgstr " -m, --create-home tạo thư mục chính của người dùng\n"
-+msgstr " -m, --create-home tạo thư mục riêng của người dùng\n"
-
- msgid ""
- " -M, --no-create-home do not create the user's home directory\n"
- msgstr ""
--" -M, --no-create-home đừng tạo thư mục chính của người dùng\n"
-+" -M, --no-create-home không tạo thư mục riêng của người dùng\n"
-
- msgid ""
- " -N, --no-user-group do not create a group with the same name as\n"
-@@ -2104,16 +2051,15 @@
- " -o, --non-unique allow to create users with duplicate\n"
- " (non-unique) UID\n"
- msgstr ""
--" -o, --non-unique cho phép tạo người dùng có UID trùng (không "
--"duy nhất)\n"
-+" -o, --non-unique cho phép tạo người dùng có UID trùng\n"
-+" (không duy nhất)\n"
-
- msgid " -p, --password PASSWORD encrypted password of the new account\n"
- msgstr ""
- " -p, --password MẬT_KHẨU mật khẩu được mật mã của tài khoản mới\n"
-
- msgid " -s, --shell SHELL login shell of the new account\n"
--msgstr ""
--" -s, --shell TRÌNH_BAO trình bao đăng nhập của tài khoản mới\n"
-+msgstr " -s, --shell HỆ_VỎ hệ vỏ đăng nhập của tài khoản mới\n"
-
- msgid " -u, --uid UID user ID of the new account\n"
- msgstr " -u, --uid UID mã số người dùng của tài khoản mới\n"
-@@ -2127,48 +2073,48 @@
- " -Z, --selinux-user SEUSER use a specific SEUSER for the SELinux user "
- "mapping\n"
- msgstr ""
--" -Z, --selinux-user SEUSER sử dụng một người dùng SE (SEUSER) riêng cho "
--"sự ánh xạ người dùng SELinux\n"
-+" -Z, --selinux-user SEUSER dùng một người dùng SE (SEUSER) riêng cho sự "
-+"ánh xạ người dùng SELinux\n"
-
- #, c-format
- msgid "%s: invalid base directory '%s'\n"
--msgstr "%s: thư mục cơ ban không hợp lệ « %s »\n"
-+msgstr "%s: thư mục cơ sở không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: invalid comment '%s'\n"
--msgstr "%s: ghi chú không hợp lệ « %s »\n"
-+msgstr "%s: ghi chú không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: invalid home directory '%s'\n"
--msgstr "%s: thư mục chính không hợp lê « %s »\n"
-+msgstr "%s: thư mục riêng không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: shadow passwords required for -e\n"
--msgstr "%s: cần thiết mật khẩu bóng cho tùy chọn « -e »\n"
-+msgstr "%s: cần mật khẩu shadow cho tùy chọn “-e”\n"
-
- #, c-format
- msgid "%s: shadow passwords required for -f\n"
--msgstr "%s: cần thiết mật khẩu bóng cho tùy chọn « -f »\n"
-+msgstr "%s: cần mật khẩu shadow cho tùy chọn “-f”\n"
-
- #, c-format
- msgid "%s: invalid field '%s'\n"
--msgstr "%s: trường không hợp lệ « %s »\n"
-+msgstr "%s: trường không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: invalid shell '%s'\n"
--msgstr "%s: trình bao không hợp lệ « %s »\n"
-+msgstr "%s: hệ vỏ không hợp lệ “%s”\n"
-
- #, c-format
- msgid "%s: -Z requires SELinux enabled kernel\n"
--msgstr "%s: « -Z » yêu cầu hạt nhân hiệu lực SELinux\n"
-+msgstr "%s: “-Z” yêu cầu nhân bật tính năng hỗ trợ SELinux\n"
-
- #, c-format
- msgid "%s: failed to reset the faillog entry of UID %lu: %s\n"
--msgstr "%s: không đặt lại được mục nhập faillog của UID %lu: %s\n"
-+msgstr "%s: không đặt lại được mục tin faillog của UID %lu: %s\n"
-
- #, c-format
- msgid "%s: failed to reset the lastlog entry of UID %lu: %s\n"
--msgstr "%s: không đặt lại được mục nhập lastlog của UID %lu: %s\n"
-+msgstr "%s: gặp lỗi khi đặt lại mục tin lastlog của UID %lu: %s\n"
-
- #, c-format
- msgid "%s: cannot create directory %s\n"
-@@ -2180,21 +2126,20 @@
- msgid ""
- "Group 'mail' not found. Creating the user mailbox file with 0600 mode.\n"
- msgstr ""
--"Không tìm thấy nhóm « mail » (thư tín). Vì thế đang tạo tập tin hộp thư "
--"người dùng với chế độ 0600.\n"
-+"Không tìm thấy nhóm “mail” (thư tín). Vì thế đang tạo tập tin hộp thư người "
-+"dùng với chế độ 0600.\n"
-
- msgid "Setting mailbox file permissions"
- msgstr "Đang đặt quyền truy cập tập tin hộp thư"
-
- #, c-format
- msgid "%s: user '%s' already exists\n"
--msgstr "%s: người dùng « %s » đã có\n"
-+msgstr "%s: người dùng “%s” đã có\n"
-
- #, c-format
- msgid ""
- "%s: group %s exists - if you want to add this user to that group, use -g.\n"
--msgstr ""
--"%s: nhóm %s đã có. Muốn thêm họ vào nhóm đó thì dùng tùy chọn « -g ».\n"
-+msgstr "%s: nhóm %s đã có. Muốn thêm họ vào nhóm đó thì dùng tùy chọn “-g”.\n"
-
- #, c-format
- msgid "%s: can't create user\n"
-@@ -2204,10 +2149,9 @@
- msgid "%s: UID %lu is not unique\n"
- msgstr "%s: UID %lu không phải duy nhất\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "%s: Failed to create tcb directory for %s\n"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "%s: Gặp lỗi khi tạo thư mục tcb cho %s\n"
-
- #, c-format
- msgid "%s: can't create group\n"
-@@ -2218,59 +2162,55 @@
- "%s: warning: the home directory already exists.\n"
- "Not copying any file from skel directory into it.\n"
- msgstr ""
--"%s: cảnh báo : thư mục chính đã có.\n"
--"Vì vậy không sao chép vào nó tập tin nào từ thư mục « skel ».\n"
-+"%s: cảnh báo: thư mục riêng đã có.\n"
-+"Vì vậy không sao chép vào nó tập tin nào từ thư mục “skel”.\n"
-
- #, c-format
- msgid "%s: warning: the user name %s to %s SELinux user mapping failed.\n"
- msgstr ""
--"%s: cảnh báo : lỗi ánh xạ tên người dùng %s tới người dùng SELinux %s.\n"
-+"%s: cảnh báo: lỗi ánh xạ tên người dùng %s tới người dùng SELinux %s.\n"
-
- msgid ""
- " -f, --force force removal of files,\n"
- " even if not owned by user\n"
- msgstr ""
- " -f, --force ép buộc gỡ bỏ tập tin, thậm chí nếu không\n"
--" được sở hữu bởi người dùng\n"
-+" được sở hữu bởi người dùng\n"
-
- msgid " -r, --remove remove home directory and mail spool\n"
- msgstr ""
--" -r, --remove gỡ bỏ thư mục chính và ống chỉ thư tín\n"
-+" -r, --remove gỡ bỏ thư mục riêng và ống chỉ thư tín\n"
-
--#, fuzzy
--#| msgid ""
--#| " -Z, --selinux-user new SELinux user mapping for the user "
--#| "account\n"
- msgid ""
- " -Z, --selinux-user remove any SELinux user mapping for the "
- "user\n"
- msgstr ""
--" -Z, --selinux-user sự ánh xạ SELinux mới cho tài khoản người "
--"dùng\n"
-+" -Z, --selinux-user gỡ bỏ bất kỳ ánh xạ SELinux nào cho tài "
-+"khoản người dùng\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot remove the primary group of user '%s'\n"
-+#, c-format
- msgid ""
- "%s: group %s not removed because it is not the primary group of user %s.\n"
--msgstr "%s: không thể gỡ bỏ nhóm chính của người dùng « %s »\n"
-+msgstr ""
-+"%s: không gỡ bỏ nhóm %s bởi vì nó không phải là nhóm chính của người dùng "
-+"“%s”.\n"
-
- #, c-format
- msgid "%s: group %s not removed because it has other members.\n"
--msgstr ""
-+msgstr "%s: không thể gỡ bỏ nhóm %s bởi vì nó có thành viên khác nữa.\n"
-
- #, c-format
- msgid "%s: group %s is the primary group of another user and is not removed.\n"
- msgstr ""
- "%s: nhóm %s là nhóm chính của một người dùng khác thì không bị gỡ bỏ.\n"
-
--#, fuzzy, c-format
--#| msgid "%s: %s home directory (%s) not found\n"
-+#, c-format
- msgid "%s: %s mail spool (%s) not found\n"
--msgstr "%s: %s không tìm thấy thư mục chính (%s)\n"
-+msgstr "%s: không tìm thấy bể thư %s (%s)\n"
-
- #, c-format
- msgid "%s: warning: can't remove %s: %s\n"
--msgstr "%s: cảnh báo : không thể gỡ bỏ %s: %s\n"
-+msgstr "%s: cảnh báo: không thể gỡ bỏ %s: %s\n"
-
- #, c-format
- msgid "%s: %s not owned by %s, not removing\n"
-@@ -2278,22 +2218,19 @@
-
- #, c-format
- msgid "%s: Can't allocate memory, tcb entry for %s not removed.\n"
--msgstr ""
-+msgstr "%s: Không thể phân bổ bộ nhớ, mục tin tcb cho %s chưa được gỡ bỏ.\n"
-
--#, fuzzy, c-format
--#| msgid "%s: failed to drop privileges (%s)\n"
-+#, c-format
- msgid "%s: Cannot drop privileges: %s\n"
--msgstr "%s: lỗi bỏ quyền truy cập (%s)\n"
-+msgstr "%s: Gặp lỗi khi xóa bỏ đặc quyền: %s\n"
-
--#, fuzzy, c-format
--#| msgid "lastlog: Cannot get the size of %s: %s\n"
-+#, c-format
- msgid "%s: Cannot remove the content of %s: %s\n"
--msgstr "lastlog: Không thể lấy kích cỡ của %s: %s\n"
-+msgstr "%s: Không thể gỡ bỏ nội dung của %s: %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot remove entry '%s' from %s\n"
-+#, c-format
- msgid "%s: Cannot remove tcb files for %s: %s\n"
--msgstr "%s: không thể gỡ bỏ mục nhập « %s » khỏi %s\n"
-+msgstr "%s: Không thể gỡ bỏ tập tin tcb cho %s: %s\n"
-
- #, c-format
- msgid "%s: user %s is a NIS user\n"
-@@ -2301,23 +2238,21 @@
-
- #, c-format
- msgid "%s: %s home directory (%s) not found\n"
--msgstr "%s: %s không tìm thấy thư mục chính (%s)\n"
-+msgstr "%s: %s không tìm thấy thư mục riêng (%s)\n"
-
- #, c-format
- msgid "%s: not removing directory %s (would remove home of user %s)\n"
- msgstr ""
--"%s: sẽ không gỡ bỏ thư mục %s (vì cũng gỡ bỏ thư mục chính của người dùng "
-+"%s: sẽ không gỡ bỏ thư mục %s (vì cũng gỡ bỏ thư mục riêng của người dùng "
- "%s)\n"
-
- #, c-format
- msgid "%s: error removing directory %s\n"
- msgstr "%s: gặp lỗi khi gỡ bỏ thư mục %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: warning: the user name %s to %s SELinux user mapping failed.\n"
-+#, c-format
- msgid "%s: warning: the user name %s to SELinux user mapping removal failed.\n"
--msgstr ""
--"%s: cảnh báo : lỗi ánh xạ tên người dùng %s tới người dùng SELinux %s.\n"
-+msgstr "%s: cảnh báo: gặp lỗi khi gỡ bỏ ánh xạ người dùng %s tới SELinux.\n"
-
- msgid " -c, --comment COMMENT new value of the GECOS field\n"
- msgstr " -c, --comment GHI_LƯU giá trị mới của trường GECOS\n"
-@@ -2325,7 +2260,7 @@
- msgid ""
- " -d, --home HOME_DIR new home directory for the user account\n"
- msgstr ""
--" -d, --home THƯ_MỤC thư mục chính mới cho tài khoản người dùng\n"
-+" -d, --home THƯ_MỤC thư mục riêng mới cho tài khoản người dùng\n"
-
- msgid ""
- " -e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE\n"
-@@ -2353,8 +2288,8 @@
- " mentioned by the -G option without removing\n"
- " him/her from other groups\n"
- msgstr ""
--" -a, --append phụ thêm người dùng vào các nhóm phụ\n"
--" đưa ra bởi tuỳ chọn « -G » mà không gỡ bỏ ta "
-+" -a, --append thêm người dùng vào các nhóm phụ\n"
-+" đưa ra bởi tuỳ chọn “-G” mà không gỡ bỏ ta "
- "khỏi nhóm khác\n"
-
- msgid " -l, --login NEW_LOGIN new value of the login name\n"
-@@ -2367,9 +2302,9 @@
- " -m, --move-home move contents of the home directory to the\n"
- " new location (use only with -d)\n"
- msgstr ""
--" -m, --move-home di chuyển nội dung của thư mục chính sang vị "
-+" -m, --move-home di chuyển nội dung của thư mục riêng sang vị "
- "trí mới\n"
--" (chỉ dùng cùng với « -d »)\n"
-+" (chỉ dùng cùng với “-d”)\n"
-
- msgid ""
- " -o, --non-unique allow using duplicate (non-unique) UID\n"
-@@ -2386,16 +2321,11 @@
- msgid " -U, --unlock unlock the user account\n"
- msgstr " -U, --unlock mở khoá tài khoản người dùng\n"
-
--#, fuzzy
--#| msgid ""
--#| " -Z, --selinux-user new SELinux user mapping for the user "
--#| "account\n"
- msgid ""
- " -Z, --selinux-user SEUSER new SELinux user mapping for the user "
- "account\n"
- msgstr ""
--" -Z, --selinux-user sự ánh xạ SELinux mới cho tài khoản người "
--"dùng\n"
-+" -Z, --selinux-user SEUSER ánh xạ SELinux mới cho tài khoản người dùng\n"
-
- #, c-format
- msgid ""
-@@ -2404,29 +2334,28 @@
- msgstr ""
- "%s: mở khoá mật khẩu của người dùng thì gây ra một tài khoản không có mật "
- "khẩu.\n"
--"Bạn nên đặt một mật khẩu dùng « usermod -p » để mở khoá mật khẩu của người "
-+"Bạn nên đặt một mật khẩu dùng “usermod -p” để mở khoá mật khẩu của người "
- "dùng này.\n"
-
- #, c-format
- msgid "%s: user '%s' already exists in %s\n"
--msgstr "%s: người dùng « %s » đã có trong %s\n"
-+msgstr "%s: người dùng “%s” đã có trong %s\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot open %s\n"
-+#, c-format
- msgid "%s: no options\n"
--msgstr "%s: không thể mở %s\n"
-+msgstr "%s: không tùy chọn\n"
-
- #, c-format
- msgid "%s: the -L, -p, and -U flags are exclusive\n"
--msgstr "%s: các cờ « -L », « -p » và « -U » loại từ lẫn nhau\n"
-+msgstr "%s: các cờ “-L”, “-p” và “-U” loại từ lẫn nhau\n"
-
- #, c-format
- msgid "%s: shadow passwords required for -e and -f\n"
--msgstr "%s: mật khẩu bóng cần thiết cho hai tùy chọn « -e » và « -f »\n"
-+msgstr "%s: mật khẩu shadow cần cho hai tùy chọn “-e” và “-f”\n"
-
- #, c-format
- msgid "%s: UID '%lu' already exists\n"
--msgstr "%s: UID « %lu » đã có\n"
-+msgstr "%s: UID “%lu” đã có\n"
-
- #, c-format
- msgid "%s: directory %s exists\n"
-@@ -2437,15 +2366,16 @@
- "%s: The previous home directory (%s) was not a directory. It is not removed "
- "and no home directories are created.\n"
- msgstr ""
-+"%s: Thư mục riêng trước đó (%s) không là một thư mục. Nó chưa được gỡ bỏ và "
-+"chưa tạo thư mục riêng (home).\n"
-
--#, fuzzy, c-format
--#| msgid "%s: cannot create directory %s\n"
-+#, c-format
- msgid "%s: Failed to change ownership of the home directory"
--msgstr "%s: không thể tạo thư mục %s\n"
-+msgstr "%s: Gặp lỗi khi thay đổi chủ sở hữu của thư mục home (riêng)"
-
- #, c-format
- msgid "%s: warning: failed to completely remove old home directory %s"
--msgstr "%s: cảnh báo : lỗi gỡ bỏ hoàn toàn thư mục chính cũ %s"
-+msgstr "%s: cảnh báo: gặp lỗi khi gỡ bỏ hoàn toàn thư mục riêng cũ %s"
-
- #, c-format
- msgid "%s: cannot rename directory %s to %s\n"
-@@ -2454,24 +2384,24 @@
- #, c-format
- msgid "%s: failed to copy the lastlog entry of user %lu to user %lu: %s\n"
- msgstr ""
--"%s: không sao chép được mục nhập lastlog của người dùng %lu sang người dùng "
-+"%s: gặp lỗi khi sao chép mục tin lastlog của người dùng %lu sang người dùng "
- "%lu: %s\n"
-
- #, c-format
- msgid "%s: failed to copy the faillog entry of user %lu to user %lu: %s\n"
- msgstr ""
--"%s: không sao chép được mục nhập faillog của người dùng %lu sang người dùng "
-+"%s: không sao chép được mục tin faillog của người dùng %lu sang người dùng "
- "%lu: %s\n"
-
- #, c-format
- msgid "%s: warning: %s not owned by %s\n"
--msgstr "%s: cảnh báo : %s không phải được %s sở hữu\n"
-+msgstr "%s: cảnh báo: %s không do %s sở hữu\n"
-
- msgid "failed to change mailbox owner"
--msgstr "lỗi thay đổi chủ hộp thư"
-+msgstr "gặp lỗi khi thay đổi chủ hộp thư"
-
- msgid "failed to rename mailbox"
--msgstr "lỗi thay đổi tên của hộp thư"
-+msgstr "gặp lỗi khi thay đổi tên của hộp thư"
-
- #, c-format
- msgid ""
-@@ -2481,7 +2411,7 @@
- msgstr ""
- "Bạn đã sửa đổi %s.\n"
- "Để thống nhất thì bạn cũng có thể cần sửa đổi %s.\n"
--"Hãy sử dụng câu lệnh « %s » để làm như thế.\n"
-+"Hãy sử dụng câu lệnh “%s” để làm như thế.\n"
-
- msgid " -g, --group edit group database\n"
- msgstr " -g, --group sửa đổi cơ sở dữ liệu nhóm\n"
-@@ -2493,28 +2423,22 @@
- msgstr ""
- " -s, --shadow sửa đổi cơ sở dữ liệu shadow hay gshadow\n"
-
--#, fuzzy
--#| msgid " -u, --uid UID user ID of the new account\n"
- msgid " -u, --user which user's tcb shadow file to edit\n"
--msgstr " -u, --uid UID mã số người dùng của tài khoản mới\n"
-+msgstr " -u, --user sửa tập tin shadow tcb của người này\n"
-
- #, c-format
- msgid "%s: failed to remove %s\n"
--msgstr "%s: không gỡ bỏ được %s\n"
-+msgstr "%s: gặp lỗi khi gỡ bỏ %s\n"
-
- #, c-format
- msgid "%s: %s is unchanged\n"
- msgstr "%s: %s chưa thay đổi\n"
-
--#, fuzzy
--#| msgid "failed to rename mailbox"
- msgid "failed to create scratch directory"
--msgstr "lỗi thay đổi tên của hộp thư"
-+msgstr "gặp lỗi khi tạo thư mục hỗn tạp"
-
--#, fuzzy
--#| msgid "%s: failed to drop privileges (%s)\n"
- msgid "failed to drop privileges"
--msgstr "%s: lỗi bỏ quyền truy cập (%s)\n"
-+msgstr "gặp lỗi khi xóa đặc quyền"
-
- msgid "Couldn't get file context"
- msgstr "Không thể lấy ngữ cảnh tập tin"
-@@ -2522,10 +2446,8 @@
- msgid "setfscreatecon () failed"
- msgstr "setfscreatecon () bị lỗi"
-
--#, fuzzy
--#| msgid "%s: failed to drop privileges (%s)\n"
- msgid "failed to gain privileges"
--msgstr "%s: lỗi bỏ quyền truy cập (%s)\n"
-+msgstr "gặp lỗi khi cấp đặc quyền"
-
- msgid "Couldn't lock file"
- msgstr "Không thể khoá tập tin"
-@@ -2533,39 +2455,28 @@
- msgid "Couldn't make backup"
- msgstr "Không thể sao lưu"
-
--#, fuzzy
--#| msgid "failed to rename mailbox"
- msgid "failed to open scratch file"
--msgstr "lỗi thay đổi tên của hộp thư"
-+msgstr "gặp lỗi khi mở tập tin hỗn tạp"
-
--#, fuzzy
--#| msgid "%s: failed to unlock %s\n"
- msgid "failed to unlink scratch file"
--msgstr "%s: lỗi mở khoá %s\n"
-+msgstr "gặp lỗi khi bỏ liên kết tập tin hỗn tạp"
-
--#, fuzzy
--#| msgid "failed to rename mailbox"
- msgid "failed to stat edited file"
--msgstr "lỗi thay đổi tên của hộp thư"
-+msgstr "gặp lỗi khi lấy thống kê tập tin đã sửa"
-
--#, fuzzy
--#| msgid "failed to change mailbox owner"
- msgid "failed to allocate memory"
--msgstr "lỗi thay đổi chủ hộp thư"
-+msgstr "gặp lỗi khi phân bổ bộ nhớ"
-
--#, fuzzy
--#| msgid "failed to rename mailbox"
- msgid "failed to create backup file"
--msgstr "lỗi thay đổi tên của hộp thư"
-+msgstr "không thể tạo tập tin sao lưu dự phòng"
-
- #, c-format
- msgid "%s: can't restore %s: %s (your changes are in %s)\n"
- msgstr "%s: không thể phục hồi %s: %s (các thay đổi của bạn nằm trong %s)\n"
-
--#, fuzzy, c-format
--#| msgid "%s: invalid base directory '%s'\n"
-+#, c-format
- msgid "%s: failed to find tcb directory for %s\n"
--msgstr "%s: thư mục cơ ban không hợp lệ « %s »\n"
-+msgstr "%s: gặp lỗi khi tìm thư mục tcb cho %s\n"
-
- #~ msgid " -c, --crypt-method the crypt method (one of %s)\n"
- #~ msgstr " -c, --crypt-method phương pháp mật mã (một của %s)\n"
-@@ -2575,7 +2486,7 @@
- #~ "\n"
- #~ "Options:\n"
- #~ msgstr ""
--#~ "Sử dụng: vipw [tuỳ_chọn ...]\n"
-+#~ "Cách dùng: vipw [tuỳ_chọn ...]\n"
- #~ "\n"
- #~ "Tuỳ chọn:\n"
-
-@@ -2603,7 +2514,7 @@
- #~ " -W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS\n"
- #~ "\n"
- #~ msgstr ""
--#~ "Sử dụng: chage [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n"
-+#~ "Cách dùng: chage [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n"
- #~ "\n"
- #~ "Tuỳ chọn:\n"
- #~ " -d, --lastday NGÀY_CUỐI đặt ngày thay đổi mật khẩu cuối cùng "
-@@ -2631,12 +2542,12 @@
- #~ "Usage: %s [-f full_name] [-r room_no] [-w work_ph]\n"
- #~ "\t[-h home_ph] [-o other] [user]\n"
- #~ msgstr ""
--#~ "Sử dụng: %s [-f họ_tên] [-r số_phòng] [-w điện_thoại_chỗ_làm]\n"
-+#~ "Cách dùng: %s [-f họ_tên] [-r số_phòng] [-w điện_thoại_chỗ_làm]\n"
- #~ "\t[-h điện_thoại_ở_nhà] [-o khác] [người_dùng]\n"
-
- #~ msgid "Usage: %s [-f full_name] [-r room_no] [-w work_ph] [-h home_ph]\n"
- #~ msgstr ""
--#~ "Sử dụng: %s [-f họ_tên] [-r số_phòng] [-w điện_thoại_chỗ_làm]\n"
-+#~ "Cách dùng: %s [-f họ_tên] [-r số_phòng] [-w điện_thoại_chỗ_làm]\n"
- #~ "\t[-h điện_thoại_ở_nhà]\n"
-
- #~ msgid ""
-@@ -2650,7 +2561,7 @@
- #~ " the MD5 algorithm\n"
- #~ "%s\n"
- #~ msgstr ""
--#~ "Sử dụng: %s [tùy_chọn]\n"
-+#~ "Cách dùng: %s [tùy_chọn]\n"
- #~ "\n"
- #~ "Tùy chọn:\n"
- #~ " -c, --crypt-method phương pháp mã hoá (một của %s)\n"
-@@ -2667,21 +2578,21 @@
- #~ " -s, --shell SHELL new login shell for the user account\n"
- #~ "\n"
- #~ msgstr ""
--#~ "Sử dụng: chsh [tùy_chọn...] [ĐĂNG_NHẬP]\n"
-+#~ "Cách dùng: chsh [tùy_chọn...] [ĐĂNG_NHẬP]\n"
- #~ "\n"
- #~ "Tùy chọn:\n"
- #~ " -h, --help hiện _trợ giúp_ này rồi thoát\n"
--#~ " -s, --shell TRÌNH_BAO trình bao đăng nhập mới\n"
-+#~ " -s, --shell TRÌNH_BAO hệ vỏ đăng nhập mới\n"
- #~ "\t\t\t\t\t\tcho tài khoản người dùng\n"
- #~ "\n"
-
- #~ msgid "Usage: expiry {-f|-c}\n"
- #~ msgstr ""
--#~ "Sử dụng: expiry {-f|-c}\n"
-+#~ "Cách dùng: expiry {-f|-c}\n"
- #~ "[expiry: mãn hạn]\n"
-
- #~ msgid "faillog: Failed to get the entry for UID %lu\n"
--#~ msgstr "faillog: không lấy được mục nhập cho UID %lu\n"
-+#~ msgstr "faillog: không lấy được mục tin cho UID %lu\n"
-
- #~ msgid "faillog: Cannot open %s: %s\n"
- #~ msgstr "faillog: không thể mở %s: %s\n"
-@@ -2691,23 +2602,23 @@
-
- #~ msgid "Usage: groupdel group\n"
- #~ msgstr ""
--#~ "Sử dụng: groupdel nhóm\n"
-+#~ "Cách dùng: groupdel nhóm\n"
- #~ "[groupdel: xoá nhóm]\n"
-
- #~ msgid "Usage: %s [-r] [-s] [group [gshadow]]\n"
--#~ msgstr "Sử dụng: %s [-r] [-s] [nhóm [gshadow]]\n"
-+#~ msgstr "Cách dùng: %s [-r] [-s] [nhóm [gshadow]]\n"
-
- #~ msgid "Usage: %s [-r] [-s] [group]\n"
--#~ msgstr "Sử dụng: %s [-r] [-s] [nhóm]\n"
-+#~ msgstr "Cách dùng: %s [-r] [-s] [nhóm]\n"
-
- #~ msgid "%s: -s and -r are incompatibile\n"
--#~ msgstr "%s: hai tùy chọn « -s » và « -r » không tương thích với nhau\n"
-+#~ msgstr "%s: hai tùy chọn “-s” và “-r” không tương thích với nhau\n"
-
- #~ msgid "Usage: grpconv\n"
--#~ msgstr "Sử dụng: grpconv\n"
-+#~ msgstr "Cách dùng: grpconv\n"
-
- #~ msgid "Usage: grpunconv\n"
--#~ msgstr "Sử dụng: grpunconv\n"
-+#~ msgstr "Cách dùng: grpunconv\n"
-
- #~ msgid ""
- #~ "Usage: lastlog [options]\n"
-@@ -2722,7 +2633,7 @@
- #~ "LOGIN\n"
- #~ "\n"
- #~ msgstr ""
--#~ "Sử dụng: lastlog [tùy_chọn...]\n"
-+#~ "Cách dùng: lastlog [tùy_chọn...]\n"
- #~ "\n"
- #~ "[lastlog: bản ghi cuối cùng]\n"
- #~ "\n"
-@@ -2764,7 +2675,7 @@
- #~ " change to MAX_DAYS\n"
- #~ "\n"
- #~ msgstr ""
--#~ "Sử dụng: passwd [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n"
-+#~ "Cách dùng: passwd [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n"
- #~ "\n"
- #~ "Tuỳ chọn:\n"
- #~ " -a, --all\t\t\tthông báo trạng thái mật khẩu về mọi tài khoản\n"
-@@ -2789,218 +2700,3 @@
- #~ " -x, --maxdays NGÀY\tđặt thành số này số tối đa các ngày trước khi thay "
- #~ "đổi được mật khẩu\n"
- #~ "\n"
--
--#, fuzzy
--#~| msgid "Usage: %s [-q] [-r] [-s] [passwd [shadow]]\n"
--#~ msgid "Usage: %s [-q] [-r] [passwd]\n"
--#~ msgstr ""
--#~ "Sử dụng: %s [-q] [-r] [-s] [passwd [shadow]]\n"
--#~ "[passwd: mật khẩu\n"
--#~ "shadow: bóng]\n"
--
--#~ msgid "Usage: %s [-q] [-r] [-s] [passwd [shadow]]\n"
--#~ msgstr ""
--#~ "Sử dụng: %s [-q] [-r] [-s] [passwd [shadow]]\n"
--#~ "[passwd: mật khẩu\n"
--#~ "shadow: bóng]\n"
--
--#~ msgid "Usage: pwconv\n"
--#~ msgstr "Sử dụng: pwconv\n"
--
--#~ msgid "Usage: pwunconv\n"
--#~ msgstr "Sử dụng: pwunconv\n"
--
--#~ msgid "Unknown id: %s\n"
--#~ msgstr "Không rõ mã số : %s\n"
--
--#~ msgid "No shell\n"
--#~ msgstr "Không có trình bao\n"
--
--#~ msgid ""
--#~ "Usage: userdel [options] LOGIN\n"
--#~ "\n"
--#~ "Options:\n"
--#~ " -f, --force force removal of files,\n"
--#~ " even if not owned by user\n"
--#~ " -h, --help display this help message and exit\n"
--#~ " -r, --remove remove home directory and mail spool\n"
--#~ "\n"
--#~ msgstr ""
--#~ "Sử dụng: userdel [tùy_chọn...] ĐĂNG_NHẬP\n"
--#~ "\n"
--#~ "Tùy chọn:\n"
--#~ " -f, --force ép buộc gỡ bỏ tập tin, thậm chí nếu "
--#~ "không\n"
--#~ " được sở hữu bởi người dùng\n"
--#~ " -h, --help hiển thị trợ giúp này, sau đó thoát\n"
--#~ " -r, --remove gỡ bỏ thư mục chính và ống chỉ thư tín\n"
--#~ "\n"
--
--#~ msgid "%s: user %s is currently logged in\n"
--#~ msgstr "%s: người dùng %s hiện thời được đăng nhập\n"
--
--#~ msgid ""
--#~ "Usage: usermod [options] LOGIN\n"
--#~ "\n"
--#~ "Options:\n"
--#~ " -c, --comment COMMENT new value of the GECOS field\n"
--#~ " -d, --home HOME_DIR new home directory for the user account\n"
--#~ " -e, --expiredate EXPIRE_DATE set account expiration date to "
--#~ "EXPIRE_DATE\n"
--#~ " -f, --inactive INACTIVE set password inactive after expiration\n"
--#~ " to INACTIVE\n"
--#~ " -g, --gid GROUP force use GROUP as new primary group\n"
--#~ " -G, --groups GROUPS new list of supplementary GROUPS\n"
--#~ " -a, --append append the user to the supplemental "
--#~ "GROUPS\n"
--#~ " mentioned by the -G option without "
--#~ "removing\n"
--#~ " him/her from other groups\n"
--#~ " -h, --help display this help message and exit\n"
--#~ " -l, --login NEW_LOGIN new value of the login name\n"
--#~ " -L, --lock lock the user account\n"
--#~ " -m, --move-home move contents of the home directory to "
--#~ "the\n"
--#~ " new location (use only with -d)\n"
--#~ " -o, --non-unique allow using duplicate (non-unique) UID\n"
--#~ " -p, --password PASSWORD use encrypted password for the new "
--#~ "password\n"
--#~ " -s, --shell SHELL new login shell for the user account\n"
--#~ " -u, --uid UID new UID for the user account\n"
--#~ " -U, --unlock unlock the user account\n"
--#~ "%s\n"
--#~ msgstr ""
--#~ "Sử dụng: usermod [tuỳ_chọn...] ĐĂNG_NHẬP\n"
--#~ "\n"
--#~ "Tuỳ chọn:\n"
--#~ " -c, --comment GHI_LƯU\t\tgiá trị mới của trường GECOS\n"
--#~ " -d, --home THƯ_MỤC \tthư mục chính mới cho tài khoản người "
--#~ "dùng\n"
--#~ " -e, --expiredate NGÀY \t\tđặt thành ngày này ngày hết hạn dùng tài "
--#~ "khoản\n"
--#~ " -f, --inactive INACTIVE \tđặt thành INACTIVE mật khẩu không còn "
--#~ "hoạt động lại\n"
--#~ "\t\t\t\t\t\tsau khi hết hạn dùng\n"
--#~ " -g, --gid NHÓM \t\tép buộc sử dụng nhóm này làm nhóm "
--#~ "chính mới\n"
--#~ " -G, --groups NHÓM \tdanh sách mới chứa các nhóm phụ\n"
--#~ " -a, --append \t\tphụ thêm người dùng vào các nhóm phụ\n"
--#~ "\t\t\t\t\t\tđưa ra bởi tuỳ chọn « -G » mà không gỡ bỏ ta khỏi nhóm khác\n"
--#~ " -h, --help \t\thiển thị trợ giúp này, sau đó thoát\n"
--#~ " -l, --login ĐĂNG_NHẬP \tgiá trị mới của tên đăng nhập\n"
--#~ " -L, --lock \t\tkhoá tài khoản người dùng\n"
--#~ " -m, --move-home \tdi chuyển nội dung của thư mục chính "
--#~ "sang vị trí mới\n"
--#~ "\t\t\t\t\t\t(chỉ dùng cùng với « -d »)\n"
--#~ " -o, --non-unique \t\tcho phép sử dụng UID trùng (không duy "
--#~ "nhất)\n"
--#~ " -p, --password MẬT_KHẨU \tmật mã hoá mật khẩu mới\n"
--#~ " -s, --shell TRÌNH_BAO trình bao đăng nhập mới cho tài khoản "
--#~ "người dùng\n"
--#~ " -u, --uid UID \t\tUID mới cho tài khoản người dùng\n"
--#~ " -U, --unlock \t\tmở khoá tài khoản người dùng\n"
--#~ "%s\n"
--
--#~ msgid "%s: no flags given\n"
--#~ msgstr "%s: chưa đưa ra cờ\n"
--
--#, fuzzy
--#~| msgid ""
--#~| "Usage: vipw [options]\n"
--#~| "\n"
--#~| "Options:\n"
--#~| " -g, --group edit group database\n"
--#~| " -h, --help display this help message and exit\n"
--#~| " -p, --passwd edit passwd database\n"
--#~| " -q, --quiet quiet mode\n"
--#~| " -s, --shadow edit shadow or gshadow database\n"
--#~| "\n"
--#~ msgid ""
--#~ "Usage: vipw [options]\n"
--#~ "\n"
--#~ "Options:\n"
--#~ " -g, --group edit group database\n"
--#~ " -h, --help display this help message and exit\n"
--#~ " -p, --passwd edit passwd database\n"
--#~ " -q, --quiet quiet mode\n"
--#~ " -s, --shadow edit shadow or gshadow database\n"
--#~ " -u, --user which user's tcb shadow file to edit\n"
--#~ "\n"
--#~ msgstr ""
--#~ "Sử dụng: vipw [tùy_chọn...]\n"
--#~ "\n"
--#~ "Tùy chọn:\n"
--#~ " -g, --group sửa đổi cơ sở dữ liệu nhóm\n"
--#~ " -h, --help hiển thị trợ giúp này, sau đó thoát\n"
--#~ " -p, --passwd sửa đổi cơ sở dữ liệu passwd\n"
--#~ " -q, --quiet chế độ im (không xuất chi tiết)\n"
--#~ " -s, --shadow sửa đổi cơ sở dữ liệu shadow hay gshadow\n"
--#~ "\n"
--
--#~ msgid ""
--#~ "Usage: %s [option] GROUP\n"
--#~ "\n"
--#~ "Options:\n"
--#~ " -a, --add USER add USER to GROUP\n"
--#~ " -d, --delete USER remove USER from GROUP\n"
--#~ " -r, --remove-password remove the GROUP's password\n"
--#~ " -R, --restrict restrict access to GROUP to its members\n"
--#~ " -M, --members USER,... set the list of members of GROUP\n"
--#~ "%s\n"
--#~ "\n"
--#~ msgstr ""
--#~ "Sử dụng: %s [tuỳ_chọn] NHÓM\n"
--#~ "\n"
--#~ "Tuỳ chọn:\n"
--#~ " -a, --add NGƯỜI_DÙNG\tthêm người dùng này vào NHÓM\n"
--#~ " -d, --delete NGƯỜI_DÙNG \tgỡ bỏ người dùng này khỏi NHÓM\n"
--#~ " -r, --remove-password \tgỡ bỏ mật khẩu của NHÓM\n"
--#~ " -R, --restrict \t\t\t\thạn chế truy cập đến NHÓM thành các thành viên "
--#~ "của nó\n"
--#~ " -M, --members NGƯỜI_DÙNG,...\t\tđặt danh sách các thành viên của NHÓM\n"
--#~ "%s\n"
--#~ "\n"
--
--#~ msgid ""
--#~ "Usage: groupmems [options] [action]\n"
--#~ "\n"
--#~ "Options:\n"
--#~ " -g, --group groupname change groupname instead of the user's "
--#~ "group\n"
--#~ " (root only)\n"
--#~ "\n"
--#~ "Actions:\n"
--#~ " -a, --add username add username to the members of the group\n"
--#~ " -d, --delete username remove username from the members of the "
--#~ "group\n"
--#~ " -p, --purge purge all members from the group\n"
--#~ " -l, --list list the members of the group\n"
--#~ "\n"
--#~ msgstr ""
--#~ "Sử dụng: groupmems [tuỳ_chọn ...] [hành_vi]\n"
--#~ "\n"
--#~ "Tuỳ chọn:\n"
--#~ " -g, --group TÊN_NHÓM thay đổi tên của nhóm này thay cho nhóm của "
--#~ "người dùng (chỉ người chủ)\n"
--#~ "\n"
--#~ "Hành vi:\n"
--#~ " -a, --add TÊN\t\t\tthêm tên người dùng này vào nhóm\n"
--#~ " -d, --delete TÊN \tgỡ bỏ tên này khỏi nhóm\n"
--#~ " -p, --purge \ttẩy mọi người ra nhóm\n"
--#~ " -l, --list \t\tliệt kê những người trong nhóm\n"
--#~ "\n"
--
--#~ msgid ""
--#~ "Usage: useradd [options] LOGIN\n"
--#~ "\n"
--#~ "Options:\n"
--#~ msgstr ""
--#~ "Sử dụng: useradd [tuỳ_chọn ...] ĐĂNG_NHẬP\n"
--#~ "\n"
--#~ "Tuỳ chọn:\n"
--
--#~ msgid "%s: can't create %s\n"
--#~ msgstr "%s: không thể tạo %s\n"
--
--#~ msgid "%s: can't chown %s\n"
--#~ msgstr "%s: không thể chown (thay đổi quyền sở hữu) %s\n"
diff --git a/debian/patches/1011_french_translation b/debian/patches/1011_french_translation
deleted file mode 100644
index 2796841..0000000
--- a/debian/patches/1011_french_translation
+++ /dev/null
@@ -1,1430 +0,0 @@
-Index: git/man/po/fr.po
-===================================================================
---- git.orig/man/po/fr.po
-+++ git/man/po/fr.po
-@@ -1,7 +1,7 @@
- # translation of shadow-man.po to French
- # French translation of the shadow's man pages
- # Traduction des pages de manuel livrées avec shadow
--# Copyright (C) 2011, 2012 Debian French l10n team <debian-l10n-french at lists.debian.org>
-+# Copyright (C) 2011-2013 Debian French l10n team <debian-l10n-french at lists.debian.org>
- #
- # Certaines pages étaient déjà traduites:
- # chpasswd: Amand Tihon <amand at alrj.org>
-@@ -16,19 +16,19 @@
- # shadow(5): Thierry Vignaud <tvignaud at mandrakesoft.com>, 1999.
- # useradd: Frédéric Delanoy, 2000.
- # Christian Perrier <bubulle at debian.org>, 2009, 2012.
--# Thomas Blein <tblein at tblein.eu>, 2011, 2012.
-+# Thomas Blein <tblein at tblein.eu>, 2011, 2012, 2013.
- msgid ""
- msgstr ""
- "Project-Id-Version: shadow-man-pages 4.0.18\n"
- "POT-Creation-Date: 2013-08-23 01:54+0200\n"
--"PO-Revision-Date: 2013-08-23 01:37+0200\n"
-+"PO-Revision-Date: 2013-07-10 19:08+0200\n"
- "Last-Translator: Thomas Blein <tblein at tblein.eu>\n"
- "Language-Team: French <debian-l10n-french at lists.debian.org>\n"
- "Language: fr\n"
- "MIME-Version: 1.0\n"
- "Content-Type: text/plain; charset=UTF-8\n"
- "Content-Transfer-Encoding: 8bit\n"
--"X-Generator: Lokalize 1.2\n"
-+"X-Generator: Lokalize 1.4\n"
- "X-Poedit-Language: French\n"
- "X-Poedit-Country: FRANCE\n"
- "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-@@ -36,16 +36,16 @@
- #: vipw.8.xml:41(firstname) suauth.5.xml:39(firstname)
- #: pwconv.8.xml:45(firstname) login.access.5.xml:40(firstname)
- msgid "Marek"
--msgstr ""
-+msgstr "Marek"
-
- #: vipw.8.xml:42(surname) suauth.5.xml:40(surname) pwconv.8.xml:46(surname)
- #: login.access.5.xml:41(surname)
- msgid "Michałkiewicz"
--msgstr ""
-+msgstr "Michałkiewicz"
-
- #: vipw.8.xml:43(contrib) limits.5.xml:43(contrib)
- msgid "Creation, 1997"
--msgstr ""
-+msgstr "Création, 1997"
-
- #: vipw.8.xml:46(firstname) usermod.8.xml:50(firstname)
- #: userdel.8.xml:50(firstname) useradd.8.xml:61(firstname)
-@@ -66,7 +66,7 @@
- #: chpasswd.8.xml:48(firstname) chgpasswd.8.xml:44(firstname)
- #: chfn.1.xml:47(firstname) chage.1.xml:45(firstname)
- msgid "Thomas"
--msgstr ""
-+msgstr "Thomas"
-
- #: vipw.8.xml:47(surname) usermod.8.xml:51(surname) userdel.8.xml:51(surname)
- #: useradd.8.xml:62(surname) suauth.5.xml:45(surname) su.1.xml:62(surname)
-@@ -84,7 +84,7 @@
- #: expiry.1.xml:49(surname) chsh.1.xml:48(surname) chpasswd.8.xml:49(surname)
- #: chgpasswd.8.xml:45(surname) chfn.1.xml:48(surname) chage.1.xml:46(surname)
- msgid "Kłoczko"
--msgstr ""
-+msgstr "Kłoczko"
-
- #: vipw.8.xml:48(email) usermod.8.xml:52(email) userdel.8.xml:52(email)
- #: useradd.8.xml:63(email) suauth.5.xml:46(email) su.1.xml:63(email)
-@@ -100,7 +100,7 @@
- #: chpasswd.8.xml:50(email) chgpasswd.8.xml:46(email) chfn.1.xml:49(email)
- #: chage.1.xml:47(email)
- msgid "kloczek at pld.org.pl"
--msgstr ""
-+msgstr "kloczek at pld.org.pl"
-
- #: vipw.8.xml:49(contrib) usermod.8.xml:53(contrib) userdel.8.xml:53(contrib)
- #: useradd.8.xml:64(contrib) suauth.5.xml:47(contrib) su.1.xml:64(contrib)
-@@ -118,7 +118,7 @@
- #: expiry.1.xml:51(contrib) chsh.1.xml:50(contrib) chpasswd.8.xml:51(contrib)
- #: chfn.1.xml:50(contrib) chage.1.xml:48(contrib)
- msgid "shadow-utils maintainer, 2000 - 2007"
--msgstr ""
-+msgstr "Mainteneur de shadow-utils, 2000 - 2007"
-
- #: vipw.8.xml:52(firstname) usermod.8.xml:56(firstname)
- #: userdel.8.xml:56(firstname) useradd.8.xml:67(firstname)
-@@ -140,7 +140,7 @@
- #: chpasswd.8.xml:54(firstname) chgpasswd.8.xml:50(firstname)
- #: chfn.1.xml:53(firstname) chage.1.xml:51(firstname)
- msgid "Nicolas"
--msgstr ""
-+msgstr "Nicolas"
-
- #: vipw.8.xml:53(surname) usermod.8.xml:57(surname) userdel.8.xml:57(surname)
- #: useradd.8.xml:68(surname) suauth.5.xml:51(surname) su.1.xml:68(surname)
-@@ -159,7 +159,7 @@
- #: chpasswd.8.xml:55(surname) chgpasswd.8.xml:51(surname)
- #: chfn.1.xml:54(surname) chage.1.xml:52(surname)
- msgid "François"
--msgstr ""
-+msgstr "François"
-
- #: vipw.8.xml:54(email) usermod.8.xml:58(email) userdel.8.xml:58(email)
- #: useradd.8.xml:69(email) suauth.5.xml:52(email) su.1.xml:69(email)
-@@ -176,7 +176,7 @@
- #: chpasswd.8.xml:56(email) chgpasswd.8.xml:52(email) chfn.1.xml:55(email)
- #: chage.1.xml:53(email)
- msgid "nicolas.francois at centraliens.net"
--msgstr ""
-+msgstr "nicolas.francois at centraliens.net"
-
- #: vipw.8.xml:55(contrib) usermod.8.xml:59(contrib) userdel.8.xml:59(contrib)
- #: useradd.8.xml:70(contrib) suauth.5.xml:53(contrib) su.1.xml:70(contrib)
-@@ -195,7 +195,7 @@
- #: chpasswd.8.xml:57(contrib) chgpasswd.8.xml:53(contrib)
- #: chfn.1.xml:56(contrib) chage.1.xml:54(contrib)
- msgid "shadow-utils maintainer, 2007 - now"
--msgstr ""
-+msgstr "Mainteneur de shadow-utils, 2007 - maintenant"
-
- #: vipw.8.xml:59(refentrytitle) vipw.8.xml:66(refname) vipw.8.xml:75(command)
- #: login.defs.5.xml:507(term)
-@@ -388,11 +388,15 @@
- #: groupdel.8.xml:101(term) groupadd.8.xml:204(term) faillog.8.xml:180(term)
- #: chsh.1.xml:107(term) chpasswd.8.xml:188(term) chgpasswd.8.xml:146(term)
- #: chfn.1.xml:153(term) chage.1.xml:197(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-R</option>, <option>--root</option><replaceable>CHROOT_DIR</"
-+#| "replaceable>"
- msgid ""
- "<option>-R</option>, <option>--root</option> <replaceable>CHROOT_DIR</"
- "replaceable>"
- msgstr ""
--"<option>-R</option>, <option>--root</option> <replaceable>RÉP_CHROOT</"
-+"<option>-R</option>, <option>--root</option> <replaceable>RÉP_CHROOT</"
- "replaceable>"
-
- #: vipw.8.xml:142(para) usermod.8.xml:315(para) userdel.8.xml:150(para)
-@@ -650,7 +654,7 @@
- #: chsh.1.xml:42(firstname) chpasswd.8.xml:43(firstname)
- #: chfn.1.xml:42(firstname) chage.1.xml:40(firstname)
- msgid "Julianne Frances"
--msgstr ""
-+msgstr "Julianne Frances"
-
- #: usermod.8.xml:46(surname) userdel.8.xml:46(surname)
- #: useradd.8.xml:57(surname) su.1.xml:57(surname) sg.1.xml:41(surname)
-@@ -665,7 +669,7 @@
- #: faillog.5.xml:40(surname) expiry.1.xml:44(surname) chsh.1.xml:43(surname)
- #: chpasswd.8.xml:44(surname) chfn.1.xml:43(surname) chage.1.xml:41(surname)
- msgid "Haugh"
--msgstr ""
-+msgstr "Haugh"
-
- #: usermod.8.xml:47(contrib) userdel.8.xml:47(contrib)
- #: useradd.8.xml:58(contrib) sg.1.xml:42(contrib) newusers.8.xml:56(contrib)
-@@ -674,7 +678,7 @@
- #: groupmod.8.xml:42(contrib) groupdel.8.xml:42(contrib)
- #: groupadd.8.xml:44(contrib) chpasswd.8.xml:45(contrib)
- msgid "Creation, 1991"
--msgstr ""
-+msgstr "Création, 1991"
-
- #: usermod.8.xml:63(refentrytitle) usermod.8.xml:70(refname)
- #: usermod.8.xml:76(command) login.defs.5.xml:498(term)
-@@ -719,12 +723,16 @@
- "qu'avec l'option <option>-G</option>."
-
- #: usermod.8.xml:111(term) useradd.8.xml:150(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-c</option>, <option>--comment</option><replaceable>COMMENT</"
-+#| "replaceable>"
- msgid ""
- "<option>-c</option>, <option>--comment</option> <replaceable>COMMENT</"
- "replaceable>"
- msgstr ""
--"<option>-c</option>, <option>--comment</option> "
--"<replaceable>COMMENTAIRE</replaceable>"
-+"<option>-c</option>, <option>--comment</option> <replaceable>COMMENTAIRE</"
-+"replaceable>"
-
- #: usermod.8.xml:115(para)
- msgid ""
-@@ -740,14 +748,14 @@
- #: usermod.8.xml:124(term)
- #, fuzzy
- #| msgid ""
--#| "<option>-d</option>, <option>--home-dir</option> "
--#| "<replaceable>HOME_DIR</replaceable>"
-+#| "<option>-d</option>, <option>--home</option><replaceable>HOME_DIR</"
-+#| "replaceable>"
- msgid ""
- "<option>-d</option>, <option>--home</option> <replaceable>HOME_DIR</"
- "replaceable>"
- msgstr ""
--"<option>-d</option>, <option>--home-dir</option> "
--"<replaceable>RÉP_PERSO</replaceable>"
-+"<option>-d</option>, <option>--home</option> <replaceable>RÉP_PERSO</"
-+"replaceable>"
-
- #: usermod.8.xml:128(para)
- msgid "The user's new login directory."
-@@ -764,11 +772,15 @@
- "créé si nécessaire."
-
- #: usermod.8.xml:140(term) useradd.8.xml:188(term) useradd.8.xml:548(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-e</option>, <option>--expiredate</"
-+#| "option><replaceable>EXPIRE_DATE</replaceable>"
- msgid ""
- "<option>-e</option>, <option>--expiredate</option> "
- "<replaceable>EXPIRE_DATE</replaceable>"
- msgstr ""
--"<option>-e</option>, <option>--expiredate</option> "
-+"<option>-e</option>, <option>--expiredate</option> "
- "<replaceable>DATE_FIN_VALIDITÉ</replaceable>"
-
- #: usermod.8.xml:144(para) useradd.8.xml:192(para)
-@@ -796,11 +808,15 @@
- "entrée <filename>/etc/shadow</filename> sera créée si il n'y en avait pas."
-
- #: usermod.8.xml:160(term) useradd.8.xml:205(term) useradd.8.xml:560(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-f</option>, <option>--inactive</option><replaceable>INACTIVE</"
-+#| "replaceable>"
- msgid ""
- "<option>-f</option>, <option>--inactive</option> <replaceable>INACTIVE</"
- "replaceable>"
- msgstr ""
--"<option>-f</option>, <option>--inactive</option> "
-+"<option>-f</option>, <option>--inactive</option> "
- "<replaceable>DURÉE_INACTIVITÉ</replaceable>"
-
- #: usermod.8.xml:164(para)
-@@ -820,12 +836,15 @@
- "de validité, et une valeur de -1 désactive cette fonctionnalité."
-
- #: usermod.8.xml:181(term) useradd.8.xml:224(term) useradd.8.xml:575(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-g</option>, <option>--gid</option><replaceable>GROUP</"
-+#| "replaceable>"
- msgid ""
- "<option>-g</option>, <option>--gid</option> <replaceable>GROUP</"
- "replaceable>"
- msgstr ""
--"<option>-g</option>, <option>--gid</option> <replaceable>GROUPE</"
--"replaceable>"
-+"<option>-g</option>, <option>--gid</option> <replaceable>GROUPE</replaceable>"
-
- #: usermod.8.xml:185(para)
- msgid ""
-@@ -852,12 +871,17 @@
- "l'utilisateur doit être modifié manuellement."
-
- #: usermod.8.xml:200(term) useradd.8.xml:251(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-G</option>, <option>--groups</option><replaceable>GROUP1</"
-+#| "replaceable>[<emphasis remap=\"I\">,GROUP2,...</emphasis>[<emphasis remap="
-+#| "\"I\">,GROUPN</emphasis>]]]"
- msgid ""
- "<option>-G</option>, <option>--groups</option> <replaceable>GROUP1</"
- "replaceable>[<emphasis remap=\"I\">,GROUP2,...</emphasis>[<emphasis remap=\"I"
- "\">,GROUPN</emphasis>]]]"
- msgstr ""
--"<option>-G</option>, <option>--groups</option> <replaceable>GROUPE1</"
-+"<option>-G</option>, <option>--groups</option> <replaceable>GROUPE1</"
- "replaceable>[<emphasis remap=\"I\">,GROUPE2,...</emphasis>[<emphasis remap="
- "\"I\">,GROUPEN</emphasis>]]]"
-
-@@ -886,12 +910,16 @@
- "actuelle des groupes supplémentaires."
-
- #: usermod.8.xml:220(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-l</option>, <option>--login</option><replaceable>NEW_LOGIN</"
-+#| "replaceable>"
- msgid ""
- "<option>-l</option>, <option>--login</option> <replaceable>NEW_LOGIN</"
- "replaceable>"
- msgstr ""
--"<option>-l</option>, <option>--login</option> "
--"<replaceable>NOUVEAU_LOGIN</replaceable>"
-+"<option>-l</option>, <option>--login</option> <replaceable>NOUVEAU_LOGIN</"
-+"replaceable>"
-
- #: usermod.8.xml:224(para)
- msgid ""
-@@ -974,12 +1002,16 @@
-
- #: usermod.8.xml:284(term) useradd.8.xml:397(term) groupmod.8.xml:157(term)
- #: groupadd.8.xml:167(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-p</option>, <option>--password</option><replaceable>PASSWORD</"
-+#| "replaceable>"
- msgid ""
- "<option>-p</option>, <option>--password</option> <replaceable>PASSWORD</"
- "replaceable>"
- msgstr ""
--"<option>-p</option>, <option>--password</option> "
--"<replaceable>MOT_DE_PASSE</replaceable>"
-+"<option>-p</option>, <option>--password</option> <replaceable>MOT_DE_PASSE</"
-+"replaceable>"
-
- #: usermod.8.xml:288(para) groupmod.8.xml:161(para)
- msgid ""
-@@ -1021,12 +1053,16 @@
-
- #: usermod.8.xml:323(term) useradd.8.xml:457(term) useradd.8.xml:595(term)
- #: su.1.xml:187(term) chsh.1.xml:119(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-s</option>, <option>--shell</option><replaceable>SHELL</"
-+#| "replaceable>"
- msgid ""
- "<option>-s</option>, <option>--shell</option> <replaceable>SHELL</"
- "replaceable>"
- msgstr ""
--"<option>-s</option>, <option>--shell</option> "
--"<replaceable>INTERPRÉTEUR</replaceable>"
-+"<option>-s</option>, <option>--shell</option> <replaceable>INTERPRÉTEUR</"
-+"replaceable>"
-
- #: usermod.8.xml:327(para) chsh.1.xml:123(para)
- msgid ""
-@@ -1038,12 +1074,14 @@
- "de commandes initial par défaut."
-
- #: usermod.8.xml:334(term) useradd.8.xml:471(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-u</option>, <option>--uid</option><replaceable>UID</replaceable>"
- msgid ""
- "<option>-u</option>, <option>--uid</option> <replaceable>UID</"
- "replaceable>"
- msgstr ""
--"<option>-u</option>, <option>--uid</option> <replaceable>UID</"
--"replaceable>"
-+"<option>-u</option>, <option>--uid</option> <replaceable>UID</replaceable>"
-
- #: usermod.8.xml:338(para)
- msgid "The new numerical value of the user's ID."
-@@ -1115,13 +1153,13 @@
- #: usermod.8.xml:384(term)
- #, fuzzy
- #| msgid ""
--#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+#| "<option>-u</option>, <option>--user</option><replaceable>LOGIN</"
- #| "replaceable>|<replaceable>RANGE</replaceable>"
- msgid ""
- "<option>-v</option>, <option>--add-sub-uids</option> "
- "<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
- msgstr ""
--"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
- "replaceable>|<replaceable>INTERVALLE</replaceable>"
-
- #: usermod.8.xml:388(para)
-@@ -1152,13 +1190,13 @@
- #: usermod.8.xml:402(term)
- #, fuzzy
- #| msgid ""
--#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+#| "<option>-u</option>, <option>--user</option><replaceable>LOGIN</"
- #| "replaceable>|<replaceable>RANGE</replaceable>"
- msgid ""
- "<option>-V</option>, <option>--del-sub-uids</option> "
- "<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
- msgstr ""
--"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
- "replaceable>|<replaceable>INTERVALLE</replaceable>"
-
- #: usermod.8.xml:406(para)
-@@ -1176,13 +1214,13 @@
- #: usermod.8.xml:422(term)
- #, fuzzy
- #| msgid ""
--#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+#| "<option>-u</option>, <option>--user</option><replaceable>LOGIN</"
- #| "replaceable>|<replaceable>RANGE</replaceable>"
- msgid ""
- "<option>-w</option>, <option>--add-sub-gids</option> "
- "<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
- msgstr ""
--"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
- "replaceable>|<replaceable>INTERVALLE</replaceable>"
-
- #: usermod.8.xml:426(para)
-@@ -1207,13 +1245,13 @@
- #: usermod.8.xml:440(term)
- #, fuzzy
- #| msgid ""
--#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+#| "<option>-u</option>, <option>--user</option><replaceable>LOGIN</"
- #| "replaceable>|<replaceable>RANGE</replaceable>"
- msgid ""
- "<option>-W</option>, <option>--del-sub-gids</option> "
- "<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
- msgstr ""
--"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
- "replaceable>|<replaceable>INTERVALLE</replaceable>"
-
- #: usermod.8.xml:444(para)
-@@ -1233,11 +1271,15 @@
- msgstr ""
-
- #: usermod.8.xml:460(term) useradd.8.xml:506(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-Z</option>, <option>--selinux-user</option><replaceable>SEUSER</"
-+#| "replaceable>"
- msgid ""
- "<option>-Z</option>, <option>--selinux-user</option> "
- "<replaceable>SEUSER</replaceable>"
- msgstr ""
--"<option>-Z</option>, <option>--selinux-user</option> "
-+"<option>-Z</option>, <option>--selinux-user</option> "
- "<replaceable>UTILISATEUR_SELINUX</replaceable>"
-
- #: usermod.8.xml:464(para)
-@@ -2116,14 +2158,25 @@
- "Les options disponibles pour la commande <command>useradd</command> sont :"
-
- #: useradd.8.xml:129(term) useradd.8.xml:530(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-b</option>, <option>--base-dir</option><replaceable>BASE_DIR</"
-+#| "replaceable>"
- msgid ""
- "<option>-b</option>, <option>--base-dir</option> <replaceable>BASE_DIR</"
- "replaceable>"
- msgstr ""
--"<option>-b</option>, <option>--base-dir</option> <replaceable>RÉP_BASE</"
-+"<option>-b</option>, <option>--base-dir</option> <replaceable>RÉP_BASE</"
- "replaceable>"
-
- #: useradd.8.xml:133(para)
-+#, fuzzy
-+#| msgid ""
-+#| "The default base directory for the system if <option>-d</"
-+#| "option><replaceable>HOME_DIR</replaceable> is not specified. "
-+#| "<replaceable>BASE_DIR</replaceable> is concatenated with the account name "
-+#| "to define the home directory. If the <option>-m</option> option is not "
-+#| "used, <replaceable>BASE_DIR</replaceable> must exist."
- msgid ""
- "The default base directory for the system if <option>-d</option> "
- "<replaceable>HOME_DIR</replaceable> is not specified. <replaceable>BASE_DIR</"
-@@ -2131,8 +2184,8 @@
- "directory. If the <option>-m</option> option is not used, "
- "<replaceable>BASE_DIR</replaceable> must exist."
- msgstr ""
--"Répertoire de base par défaut du système si l'option <option>-d</"
--"option> <replaceable>RÉP_PERSO</replaceable> n'est pas spécifiée. "
-+"Répertoire de base par défaut du système si l'option <option>-d</option> "
-+"<replaceable>RÉP_PERSO</replaceable> n'est pas spécifiée. "
- "<replaceable>RÉP_BASE</replaceable> est concaténé avec le nom du compte pour "
- "définir le répertoire personnel. Quand l'option <option>-m</option> n'est "
- "pas utilisée, <replaceable>RÉP_BASE</replaceable> doit exister."
-@@ -2158,12 +2211,16 @@
- "l'utilisateur."
-
- #: useradd.8.xml:162(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-d</option>, <option>--home</option><replaceable>HOME_DIR</"
-+#| "replaceable>"
- msgid ""
- "<option>-d</option>, <option>--home-dir</option> <replaceable>HOME_DIR</"
- "replaceable>"
- msgstr ""
--"<option>-d</option>, <option>--home-dir</option> "
--"<replaceable>RÉP_PERSO</replaceable>"
-+"<option>-d</option>, <option>--home</option> <replaceable>RÉP_PERSO</"
-+"replaceable>"
-
- #: useradd.8.xml:166(para)
- msgid ""
-@@ -2271,12 +2328,16 @@
- "l'utilisateur est de n'appartenir qu'au groupe initial."
-
- #: useradd.8.xml:272(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-k</option>, <option>--skel</option><replaceable>SKEL_DIR</"
-+#| "replaceable>"
- msgid ""
- "<option>-k</option>, <option>--skel</option> <replaceable>SKEL_DIR</"
- "replaceable>"
- msgstr ""
--"<option>-k</option>, <option>--skel</option> "
--"<replaceable>RÉP_SQUELETTE</replaceable>"
-+"<option>-k</option>, <option>--skel</option> <replaceable>RÉP_SQUELETTE</"
-+"replaceable>"
-
- #: useradd.8.xml:276(para)
- msgid ""
-@@ -2311,14 +2372,30 @@
- msgstr "Si possible, les ACL et les attributs étendus seront copiés."
-
- #: useradd.8.xml:297(term) groupadd.8.xml:137(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-K</option>, <option>--key</option><replaceable>KEY</"
-+#| "replaceable>=<replaceable>VALUE</replaceable>"
- msgid ""
- "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
- "replaceable>=<replaceable>VALUE</replaceable>"
- msgstr ""
--"<option>-K</option>, <option>--key</option> <replaceable>CLÉ</"
-+"<option>-K</option>, <option>--key</option> <replaceable>CLÉ</"
- "replaceable>=<replaceable>VALEUR</replaceable>"
-
- #: useradd.8.xml:301(para)
-+#, fuzzy
-+#| msgid ""
-+#| "Overrides <filename>/etc/login.defs</filename> defaults (<option>UID_MIN</"
-+#| "option>, <option>UID_MAX</option>, <option>UMASK</option>, "
-+#| "<option>PASS_MAX_DAYS</option> and others). <placeholder-1/> Example: "
-+#| "<option>-K </option><replaceable>PASS_MAX_DAYS</"
-+#| "replaceable>=<replaceable>-1</replaceable> can be used when creating "
-+#| "system account to turn off password ageing, even though system account "
-+#| "has no password at all. Multiple <option>-K</option> options can be "
-+#| "specified, e.g.: <option>-K </option><replaceable>UID_MIN</"
-+#| "replaceable>=<replaceable>100</replaceable><option>-K </"
-+#| "option><replaceable>UID_MAX</replaceable>=<replaceable>499</replaceable>"
- msgid ""
- "Overrides <filename>/etc/login.defs</filename> defaults (<option>UID_MIN</"
- "option>, <option>UID_MAX</option>, <option>UMASK</option>, "
-@@ -2334,13 +2411,13 @@
- "Surcharge les valeurs par défaut de <filename>/etc/login.defs</filename> "
- "(<option>UID_MIN</option>, <option>UID_MAX</option>, <option>UMASK</option>, "
- "<option>PASS_MAX_DAYS</option> et autres). <placeholder-1/> Par exemple : "
--"<option>-K</option> <replaceable>PASS_MAX_DAYS</"
-+"<option>-K</option> <replaceable>PASS_MAX_DAYS</"
- "replaceable>=<replaceable>-1</replaceable> peut être utilisé pour la "
- "création de comptes système pour désactiver la gestion de la durée de "
- "validité des mots de passe, même si les comptes système n'ont pas de mot de "
- "passe. Plusieurs options <option>-K</option> peuvent être précisées, comme "
--"par exemple : <option>-K</option> <replaceable>UID_MIN</"
--"replaceable>=<replaceable>100</replaceable> <option>-K</option> "
-+"par exemple : <option>-K</option> <replaceable>UID_MIN</"
-+"replaceable>=<replaceable>100</replaceable> <option>-K</option> "
- "<replaceable>UID_MAX</replaceable>=<replaceable>499</replaceable>"
-
- #: useradd.8.xml:322(term)
-@@ -2991,14 +3068,12 @@
- msgstr "impossible de créer le répertoire personnel"
-
- #: useradd.8.xml:794(replaceable)
--#, fuzzy
--#| msgid "1"
- msgid "14"
--msgstr "1"
-+msgstr "14"
-
- #: useradd.8.xml:796(para)
- msgid "can't update SELinux user mapping"
--msgstr ""
-+msgstr "Impossible de mettre à jour la correspondance d'utilisateur SELinux"
-
- #: useradd.8.xml:736(para)
- msgid ""
-@@ -3071,7 +3146,7 @@
- #: suauth.5.xml:41(contrib) pwconv.8.xml:47(contrib)
- #: login.access.5.xml:42(contrib) gpasswd.1.xml:46(contrib)
- msgid "Creation, 1996"
--msgstr ""
-+msgstr "Création, 1996"
-
- #: suauth.5.xml:57(refentrytitle) suauth.5.xml:64(refname)
- msgid "suauth"
-@@ -3322,7 +3397,7 @@
- #: passwd.1.xml:48(contrib) login.1.xml:74(contrib) faillog.8.xml:41(contrib)
- #: faillog.5.xml:41(contrib)
- msgid "Creation, 1989"
--msgstr ""
-+msgstr "Création, 1989"
-
- #: su.1.xml:74(refentrytitle) su.1.xml:81(refname) su.1.xml:86(command)
- #: login.defs.5.xml:446(term)
-@@ -3429,11 +3504,15 @@
- msgstr "Les options applicables à la commande <command>su</command> sont :"
-
- #: su.1.xml:150(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-c</option>, <option>--command</option><replaceable>COMMAND</"
-+#| "replaceable>"
- msgid ""
- "<option>-c</option>, <option>--command</option> <replaceable>COMMAND</"
- "replaceable>"
- msgstr ""
--"<option>-c</option>, <option>--command</option> <replaceable>COMMANDE</"
-+"<option>-c</option>, <option>--command</option> <replaceable>COMMANDE</"
- "replaceable>"
-
- #: su.1.xml:154(para)
-@@ -4897,7 +4976,7 @@
-
- #: pwck.8.xml:47(contrib) lastlog.8.xml:42(contrib) grpck.8.xml:42(contrib)
- msgid "Creation, 1992"
--msgstr ""
-+msgstr "Création, 1992"
-
- #: pwck.8.xml:63(refentrytitle) pwck.8.xml:70(refname) pwck.8.xml:76(command)
- #: login.defs.5.xml:420(term)
-@@ -5603,11 +5682,15 @@
- "connexion."
-
- #: passwd.1.xml:220(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-i</option>, <option>--inactive</option><replaceable>INACTIVE</"
-+#| "replaceable>"
- msgid ""
- "<option>-i</option>, <option>--inactive</option> <replaceable>INACTIVE</"
- "replaceable>"
- msgstr ""
--"<option>-i</option>, <option>--inactive</option> "
-+"<option>-i</option>, <option>--inactive</option> "
- "<replaceable>DURÉE_INACTIVITÉ</replaceable>"
-
- # NOTE: Only this user account
-@@ -5673,11 +5756,15 @@
- "changer."
-
- #: passwd.1.xml:269(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-n</option>, <option>--mindays</option><replaceable>MIN_DAYS</"
-+#| "replaceable>"
- msgid ""
- "<option>-n</option>, <option>--mindays</option> <replaceable>MIN_DAYS</"
- "replaceable>"
- msgstr ""
--"<option>-n</option>, <option>--mindays</option> <replaceable>JOURS_MIN</"
-+"<option>-n</option>, <option>--mindays</option> <replaceable>JOURS_MIN</"
- "replaceable>"
-
- #: passwd.1.xml:273(para) chage.1.xml:168(para)
-@@ -5691,12 +5778,16 @@
- "indique que l'utilisateur peut changer son mot de passe quand il le souhaite."
-
- #: passwd.1.xml:291(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-r</option>, <option>--repository</"
-+#| "option><replaceable>REPOSITORY</replaceable>"
- msgid ""
- "<option>-r</option>, <option>--repository</option> "
- "<replaceable>REPOSITORY</replaceable>"
- msgstr ""
--"<option>-r</option>, <option>--repository</option> "
--"<replaceable>REPOSITORY</replaceable>"
-+"<option>-r</option>, <option>--repository</option> <replaceable>REPOSITORY</"
-+"replaceable>"
-
- #: passwd.1.xml:295(para)
- msgid "change password in <replaceable>REPOSITORY</replaceable> repository"
-@@ -5741,11 +5832,15 @@
- "présente avant l'utilisation de l'option <option>-l</option>)."
-
- #: passwd.1.xml:344(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-w</option>, <option>--warndays</option><replaceable>WARN_DAYS</"
-+#| "replaceable>"
- msgid ""
- "<option>-w</option>, <option>--warndays</option> "
- "<replaceable>WARN_DAYS</replaceable>"
- msgstr ""
--"<option>-w</option>, <option>--warndays</option> "
-+"<option>-w</option>, <option>--warndays</option> "
- "<replaceable>DURÉE_AVERTISSEMENT</replaceable>"
-
- #: passwd.1.xml:348(para)
-@@ -5762,11 +5857,15 @@
- "d'arriver en fin de validité."
-
- #: passwd.1.xml:357(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-x</option>, <option>--maxdays</option><replaceable>MAX_DAYS</"
-+#| "replaceable>"
- msgid ""
- "<option>-x</option>, <option>--maxdays</option> <replaceable>MAX_DAYS</"
- "replaceable>"
- msgstr ""
--"<option>-x</option>, <option>--maxdays</option> <replaceable>JOURS_MAX</"
-+"<option>-x</option>, <option>--maxdays</option> <replaceable>JOURS_MAX</"
- "replaceable>"
-
- #: passwd.1.xml:361(para)
-@@ -5940,8 +6039,8 @@
- #: passwd.1.xml:35(para) login.defs.5.xml:35(para)
- msgid ""
- "Number of significant characters in the password for crypt(). "
--"<option>PASS_MAX_LEN</option> is 8 by default. Don't change unless your crypt"
--"() is better. This is ignored if <option>MD5_CRYPT_ENAB</option> set to "
-+"<option>PASS_MAX_LEN</option> is 8 by default. Don't change unless your "
-+"crypt() is better. This is ignored if <option>MD5_CRYPT_ENAB</option> set to "
- "<replaceable>yes</replaceable>."
- msgstr ""
- "Nombre de caractères significatifs dans le mot de passe pour crypt(). La "
-@@ -7723,11 +7822,11 @@
-
- #: limits.5.xml:41(firstname)
- msgid "Luca"
--msgstr ""
-+msgstr "Luca"
-
- #: limits.5.xml:42(surname)
- msgid "Berra"
--msgstr ""
-+msgstr "Berra"
-
- #: limits.5.xml:59(refentrytitle) limits.5.xml:66(refname)
- msgid "limits"
-@@ -8019,11 +8118,15 @@
- "Les options disponibles pour la commande <command>lastlog</command> sont :"
-
- #: lastlog.8.xml:97(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-b</option>, <option>--before</option><replaceable>DAYS</"
-+#| "replaceable>"
- msgid ""
- "<option>-b</option>, <option>--before</option> <replaceable>DAYS</"
- "replaceable>"
- msgstr ""
--"<option>-b</option>, <option>--before</option> <replaceable>JOURS</"
-+"<option>-b</option>, <option>--before</option> <replaceable>JOURS</"
- "replaceable>"
-
- #: lastlog.8.xml:101(para)
-@@ -8034,12 +8137,15 @@
- "remap=\"I\">JOURS</emphasis>."
-
- #: lastlog.8.xml:127(term) faillog.8.xml:192(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-t</option>, <option>--time</option><replaceable>DAYS</"
-+#| "replaceable>"
- msgid ""
- "<option>-t</option>, <option>--time</option> <replaceable>DAYS</"
- "replaceable>"
- msgstr ""
--"<option>-t</option>, <option>--time</option> <replaceable>JOURS</"
--"replaceable>"
-+"<option>-t</option>, <option>--time</option> <replaceable>JOURS</replaceable>"
-
- #: lastlog.8.xml:131(para)
- msgid ""
-@@ -8050,11 +8156,15 @@
- "\">JOURS</emphasis>."
-
- #: lastlog.8.xml:138(term) faillog.8.xml:202(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-u</option>, <option>--user</option><replaceable>LOGIN</"
-+#| "replaceable>|<replaceable>RANGE</replaceable>"
- msgid ""
- "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
- "replaceable>|<replaceable>RANGE</replaceable>"
- msgstr ""
--"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
-+"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
- "replaceable>|<replaceable>INTERVALLE</replaceable>"
-
- #: lastlog.8.xml:142(para)
-@@ -8143,7 +8253,7 @@
-
- #: gshadow.5.xml:41(contrib)
- msgid "Creation, 2005"
--msgstr ""
-+msgstr "Création, 2005"
-
- #: gshadow.5.xml:46(refentrytitle) gshadow.5.xml:53(refname)
- msgid "gshadow"
-@@ -8383,14 +8493,6 @@
- "\"gshadow\">et <filename>/etc/gshadow</filename></phrase> par GID."
-
- #: grpck.8.xml:196(para)
--#, fuzzy
--#| msgid ""
--#| "By default, <command>grpck</command> operates on <filename>/etc/group</"
--#| "filename><phrase condition=\"gshadow\"> and <filename>/etc/gshadow</"
--#| "filename></phrase>. The user may select alternate files with the "
--#| "<emphasis remap=\"I\">group</emphasis><phrase condition=\"no_gshadow"
--#| "\">parameter.</phrase><phrase condition=\"gshadow\">and <emphasis remap="
--#| "\"I\">shadow</emphasis> parameters.</phrase>"
- msgid ""
- "By default, <command>grpck</command> operates on <filename>/etc/group</"
- "filename><phrase condition=\"gshadow\">and <filename>/etc/gshadow</"
-@@ -8535,12 +8637,14 @@
- "Les options disponibles pour la commande <command>groupmod</command> sont :"
-
- #: groupmod.8.xml:96(term) groupadd.8.xml:114(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-g</option>, <option>--gid</option><replaceable>GID</replaceable>"
- msgid ""
- "<option>-g</option>, <option>--gid</option> <replaceable>GID</"
- "replaceable>"
- msgstr ""
--"<option>-g</option>, <option>--gid</option> <replaceable>GID</"
--"replaceable>"
-+"<option>-g</option>, <option>--gid</option> <replaceable>GID</replaceable>"
-
- #: groupmod.8.xml:100(para)
- msgid ""
-@@ -8588,11 +8692,15 @@
- "<option>SYS_GID_MAX</option> du fichier <filename>/etc/login.defs</filename>."
-
- #: groupmod.8.xml:135(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-n</option>, <option>--new-name</option><replaceable>NEW_GROUP</"
-+#| "replaceable>"
- msgid ""
- "<option>-n</option>, <option>--new-name</option> "
- "<replaceable>NEW_GROUP</replaceable>"
- msgstr ""
--"<option>-n</option>, <option>--new-name</option> "
-+"<option>-n</option>, <option>--new-name</option> "
- "<replaceable>NOUVEAU_NOM_GROUPE</replaceable>"
-
- #: groupmod.8.xml:139(para)
-@@ -8660,19 +8768,19 @@
-
- #: groupmems.8.xml:42(firstname)
- msgid "George"
--msgstr ""
-+msgstr "George"
-
- #: groupmems.8.xml:43(surname)
- msgid "Kraft"
--msgstr ""
-+msgstr "Kraft"
-
- #: groupmems.8.xml:44(lineage)
- msgid "IV"
--msgstr ""
-+msgstr "IV"
-
- #: groupmems.8.xml:45(contrib)
- msgid "Creation, 2000"
--msgstr ""
-+msgstr "Création, 2000"
-
- #: groupmems.8.xml:69(refpurpose)
- msgid "administer members of a user's primary group"
-@@ -8732,12 +8840,16 @@
- "Les options disponibles pour la commande <command>groupmems</command> sont :"
-
- #: groupmems.8.xml:107(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-a</option>, <option>--add</option><replaceable>user_name</"
-+#| "replaceable>"
- msgid ""
- "<option>-a</option>, <option>--add</option> <replaceable>user_name</"
- "replaceable>"
- msgstr ""
--"<option>-a</option>, <option>--add</option> "
--"<replaceable>nom_utilisateur</replaceable>"
-+"<option>-a</option>, <option>--add</option> <replaceable>nom_utilisateur</"
-+"replaceable>"
-
- #: groupmems.8.xml:109(para)
- msgid "Add an user to the group membership list."
-@@ -8754,12 +8866,16 @@
- "a pas d'entrée, une nouvelle entrée sera créée."
-
- #: groupmems.8.xml:118(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-d</option>, <option>--delete</option><replaceable>user_name</"
-+#| "replaceable>"
- msgid ""
- "<option>-d</option>, <option>--delete</option> <replaceable>user_name</"
- "replaceable>"
- msgstr ""
--"<option>-d</option>, <option>--delete</option> "
--"<replaceable>nom_utilisateur</replaceable>"
-+"<option>-d</option>, <option>--delete</option> <replaceable>nom_utilisateur</"
-+"replaceable>"
-
- #: groupmems.8.xml:120(para)
- msgid "Delete a user from the group membership list."
-@@ -8774,11 +8890,15 @@
- "retiré de la liste des membres et des administrateurs du groupe."
-
- #: groupmems.8.xml:134(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-g</option>, <option>--group</option><replaceable>group_name</"
-+#| "replaceable>"
- msgid ""
- "<option>-g</option>, <option>--group</option> <replaceable>group_name</"
- "replaceable>"
- msgstr ""
--"<option>-g</option>, <option>--group</option> <replaceable>nom_groupe</"
-+"<option>-g</option>, <option>--group</option> <replaceable>nom_groupe</"
- "replaceable>"
-
- #: groupmems.8.xml:136(para)
-@@ -9013,22 +9133,32 @@
- "être indiquée plusieurs fois."
-
- #: groupadd.8.xml:146(para)
-+#, fuzzy
-+#| msgid ""
-+#| "Example: <option>-K </option><replaceable>GID_MIN</"
-+#| "replaceable>=<replaceable>100</replaceable><option>-K </"
-+#| "option><replaceable>GID_MAX</replaceable>=<replaceable>499</replaceable>"
- msgid ""
- "Example: <option>-K</option> <replaceable>GID_MIN</"
- "replaceable>=<replaceable>100</replaceable> <option>-K</option> "
- "<replaceable>GID_MAX</replaceable>=<replaceable>499</replaceable>"
- msgstr ""
--"Exemple : <option>-K</option> <replaceable>GID_MIN</"
--"replaceable>=<replaceable>10</replaceable> <option>-K</option> "
-+"Exemple : <option>-K</option> <replaceable>GID_MIN</"
-+"replaceable>=<replaceable>10</replaceable> <option>-K</option> "
- "<replaceable>GID_MAX</replaceable>=<replaceable>499</replaceable>"
-
- #: groupadd.8.xml:150(para)
-+#, fuzzy
-+#| msgid ""
-+#| "Note: <option>-K </option><replaceable>GID_MIN</"
-+#| "replaceable>=<replaceable>10</replaceable>,<replaceable>GID_MAX</"
-+#| "replaceable>=<replaceable>499</replaceable> doesn't work yet."
- msgid ""
- "Note: <option>-K</option> <replaceable>GID_MIN</"
- "replaceable>=<replaceable>10</replaceable>,<replaceable>GID_MAX</"
- "replaceable>=<replaceable>499</replaceable> doesn't work yet."
- msgstr ""
--"Remarque : <option>-K</option> <replaceable>GID_MIN</"
-+"Remarque : <option>-K</option> <replaceable>GID_MIN</"
- "replaceable>=<replaceable>10</replaceable>,<replaceable>GID_MAX</"
- "replaceable>=<replaceable>499</replaceable> ne fonctionne pas pour l'instant."
-
-@@ -9138,11 +9268,11 @@
-
- #: gpasswd.1.xml:44(firstname)
- msgid "Rafal"
--msgstr ""
-+msgstr "Rafal"
-
- #: gpasswd.1.xml:45(surname)
- msgid "Maszkowski"
--msgstr ""
-+msgstr "Maszkowski"
-
- #: gpasswd.1.xml:71(phrase)
- msgid "administer <placeholder-1/>"
-@@ -9235,11 +9365,14 @@
- "Les options disponibles pour la commande <command>gpasswd</command> sont :"
-
- #: gpasswd.1.xml:147(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-a</option>, <option>--add</option><replaceable>user</replaceable>"
- msgid ""
- "<option>-a</option>, <option>--add</option> <replaceable>user</"
- "replaceable>"
- msgstr ""
--"<option>-a</option>, <option>--add</option> <replaceable>utilisateur</"
-+"<option>-a</option>, <option>--add</option> <replaceable>utilisateur</"
- "replaceable>"
-
- #: gpasswd.1.xml:151(para)
-@@ -9251,12 +9384,16 @@
- "replaceable>."
-
- #: gpasswd.1.xml:160(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-d</option>, <option>--delete</option><replaceable>user</"
-+#| "replaceable>"
- msgid ""
- "<option>-d</option>, <option>--delete</option> <replaceable>user</"
- "replaceable>"
- msgstr ""
--"<option>-d</option>, <option>--delete</option> "
--"<replaceable>utilisateur</replaceable>"
-+"<option>-d</option>, <option>--delete</option> <replaceable>utilisateur</"
-+"replaceable>"
-
- #: gpasswd.1.xml:164(para)
- msgid ""
-@@ -9267,11 +9404,15 @@
- "replaceable>."
-
- #: gpasswd.1.xml:181(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-Q</option>, <option>--root</option><replaceable>CHROOT_DIR</"
-+#| "replaceable>"
- msgid ""
- "<option>-Q</option>, <option>--root</option> <replaceable>CHROOT_DIR</"
- "replaceable>"
- msgstr ""
--"<option>-Q</option>, <option>--root</option> <replaceable>RÉP_CHROOT</"
-+"<option>-Q</option>, <option>--root</option><replaceable>RÉP_CHROOT</"
- "replaceable>"
-
- #: gpasswd.1.xml:195(term)
-@@ -9306,11 +9447,15 @@
- "replaceable>."
-
- #: gpasswd.1.xml:227(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-A</option>, <option>--administrators</option><replaceable>user</"
-+#| "replaceable>,..."
- msgid ""
- "<option>-A</option>, <option>--administrators</option> "
- "<replaceable>user</replaceable>,..."
- msgstr ""
--"<option>-A</option>, <option>--administrators</option> "
-+"<option>-A</option>, <option>--administrators</option> "
- "<replaceable>utilisateur</replaceable>,..."
-
- #: gpasswd.1.xml:231(para)
-@@ -9318,12 +9463,16 @@
- msgstr "Configurer la liste des administrateurs."
-
- #: gpasswd.1.xml:239(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-M</option>, <option>--members</option><replaceable>user</"
-+#| "replaceable>,..."
- msgid ""
- "<option>-M</option>, <option>--members</option> <replaceable>user</"
- "replaceable>,..."
- msgstr ""
--"<option>-M</option>, <option>--members</option> "
--"<replaceable>utilisateur</replaceable>,..."
-+"<option>-M</option>, <option>--members</option> <replaceable>utilisateur</"
-+"replaceable>,..."
-
- #: gpasswd.1.xml:243(para)
- msgid "Set the list of group members."
-@@ -9439,11 +9588,15 @@
- "d'utilisateurs."
-
- #: faillog.8.xml:128(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-l</option>, <option>--lock-secs</option><replaceable>SEC</"
-+#| "replaceable>"
- msgid ""
- "<option>-l</option>, <option>--lock-secs</option> <replaceable>SEC</"
- "replaceable>"
- msgstr ""
--"<option>-l</option>, <option>--lock-secs</option> <replaceable>SEC</"
-+"<option>-l</option>, <option>--lock-secs</option> <replaceable>SEC</"
- "replaceable>"
-
- # NOTE: s/to/during/
-@@ -9463,11 +9616,15 @@
- "pour cette option."
-
- #: faillog.8.xml:143(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-m</option>, <option>--maximum</option><replaceable>MAX</"
-+#| "replaceable>"
- msgid ""
- "<option>-m</option>, <option>--maximum</option> <replaceable>MAX</"
- "replaceable>"
- msgstr ""
--"<option>-m</option>, <option>--maximum</option> <replaceable>MAX</"
-+"<option>-m</option>, <option>--maximum</option> <replaceable>MAX</"
- "replaceable>"
-
- #: faillog.8.xml:147(para)
-@@ -9618,7 +9775,7 @@
- #: expiry.1.xml:45(contrib) chsh.1.xml:44(contrib) chfn.1.xml:44(contrib)
- #: chage.1.xml:42(contrib)
- msgid "Creation, 1990"
--msgstr ""
-+msgstr "Création, 1990"
-
- #: expiry.1.xml:61(refentrytitle) expiry.1.xml:68(refname)
- #: expiry.1.xml:74(command)
-@@ -9845,12 +10002,16 @@
- "Les options disponibles pour la commande <command>chpasswd</command> sont :"
-
- #: chpasswd.8.xml:137(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-c</option>, <option>--crypt-method</option><replaceable>METHOD</"
-+#| "replaceable>"
- msgid ""
- "<option>-c</option>, <option>--crypt-method</option> "
- "<replaceable>METHOD</replaceable>"
- msgstr ""
--"<option>-c</option>, <option>--crypt-method</option> "
--"<replaceable>MÉTHODE</replaceable>"
-+"<option>-c</option>, <option>--crypt-method</option><replaceable>MÉTHODE</"
-+"replaceable>"
-
- #: chpasswd.8.xml:142(para) chgpasswd.8.xml:115(para)
- msgid "The available methods are DES, MD5, and NONE."
-@@ -9893,11 +10054,15 @@
- "passe fournis ne sont pas chiffrés."
-
- #: chpasswd.8.xml:200(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-s</option>, <option>--sha-rounds</option><replaceable>ROUNDS</"
-+#| "replaceable>"
- msgid ""
- "<option>-s</option>, <option>--sha-rounds</option> <replaceable>ROUNDS</"
- "replaceable>"
- msgstr ""
--"<option>-s</option>, <option>--sha-rounds</option> <replaceable>ROUNDS</"
-+"<option>-s</option>, <option>--sha-rounds</option> <replaceable>ROUNDS</"
- "replaceable>"
-
- #: chpasswd.8.xml:219(para)
-@@ -9944,7 +10109,7 @@
-
- #: chgpasswd.8.xml:47(contrib)
- msgid "Creation, 2006"
--msgstr ""
-+msgstr "Création, 2006"
-
- #: chgpasswd.8.xml:65(refpurpose)
- msgid "update group passwords in batch mode"
-@@ -10059,36 +10224,47 @@
- msgstr "Les options applicables à la commande <command>chfn</command> sont :"
-
- #: chfn.1.xml:117(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-f</option>, <option>--full-name</option><replaceable>FULL_NAME</"
-+#| "replaceable>"
- msgid ""
- "<option>-f</option>, <option>--full-name</option> "
- "<replaceable>FULL_NAME</replaceable>"
- msgstr ""
--"<option>-f</option>, <option>--full-name</option> "
--"<replaceable>NOM_COMPLET</replaceable>"
-+"<option>-f</option>, <option>--full-name</option><replaceable>NOM_COMPLET</"
-+"replaceable>"
-
- #: chfn.1.xml:121(para)
- msgid "Change the user's full name."
- msgstr "Modifier le nom complet de l'utilisateur."
-
- #: chfn.1.xml:125(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-h</option>, <option>--home-phone</"
-+#| "option><replaceable>HOME_PHONE</replaceable>"
- msgid ""
- "<option>-h</option>, <option>--home-phone</option> "
- "<replaceable>HOME_PHONE</replaceable>"
- msgstr ""
--"<option>-h</option>, <option>--home-phone</option> "
--"<replaceable>TEL_PERSO</replaceable>"
-+"<option>-h</option>, <option>--home-phone</option><replaceable>TEL_PERSO</"
-+"replaceable>"
-
- #: chfn.1.xml:129(para)
- msgid "Change the user's home phone number."
- msgstr "Modifier le numéro de téléphone personnel de l'utilisateur."
-
- #: chfn.1.xml:133(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-o</option>, <option>--other</option><replaceable>OTHER</"
-+#| "replaceable>"
- msgid ""
- "<option>-o</option>, <option>--other</option> <replaceable>OTHER</"
- "replaceable>"
- msgstr ""
--"<option>-o</option>, <option>--other</option> <replaceable>AUTRE</"
--"replaceable>"
-+"<option>-o</option>, <option>--other</option><replaceable>AUTRE</replaceable>"
-
- #: chfn.1.xml:137(para)
- msgid ""
-@@ -10101,12 +10277,16 @@
- "applications et peut être changé seulement par un superutilisateur."
-
- #: chfn.1.xml:145(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-r</option>, <option>--room</option><replaceable>ROOM_NUMBER</"
-+#| "replaceable>"
- msgid ""
- "<option>-r</option>, <option>--room</option> <replaceable>ROOM_NUMBER</"
- "replaceable>"
- msgstr ""
--"<option>-r</option>, <option>--room</option> "
--"<replaceable>NUMÉRO_DE_BUREAU</replaceable>"
-+"<option>-r</option>, <option>--room</option><replaceable>NUMÉRO_DE_BUREAU</"
-+"replaceable>"
-
- #: chfn.1.xml:149(para)
- msgid "Change the user's room number."
-@@ -10117,12 +10297,16 @@
- msgstr "<option>-u</option>, <option>--help</option>"
-
- #: chfn.1.xml:173(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-w</option>, <option>--work-phone</"
-+#| "option><replaceable>WORK_PHONE</replaceable>"
- msgid ""
- "<option>-w</option>, <option>--work-phone</option> "
- "<replaceable>WORK_PHONE</replaceable>"
- msgstr ""
--"<option>-w</option>, <option>--work-phone</option> "
--"<replaceable>TEL_PRO</replaceable>"
-+"<option>-w</option>, <option>--work-phone</option><replaceable>TEL_PRO</"
-+"replaceable>"
-
- #: chfn.1.xml:177(para)
- msgid "Change the user's office phone number."
-@@ -10180,12 +10364,16 @@
- "Les options disponibles pour la commande <command>chage</command> sont :"
-
- #: chage.1.xml:97(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-d</option>, <option>--lastday</option><replaceable>LAST_DAY</"
-+#| "replaceable>"
- msgid ""
- "<option>-d</option>, <option>--lastday</option> <replaceable>LAST_DAY</"
- "replaceable>"
- msgstr ""
--"<option>-d</option>, <option>--lastday</option> "
--"<replaceable>DERNIER_JOUR</replaceable>"
-+"<option>-d</option>, <option>--lastday</option> <replaceable>DERNIER_JOUR</"
-+"replaceable>"
-
- #: chage.1.xml:101(para)
- msgid ""
-@@ -10199,11 +10387,15 @@
- "région)."
-
- #: chage.1.xml:109(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-E</option>, <option>--expiredate</"
-+#| "option><replaceable>EXPIRE_DATE</replaceable>"
- msgid ""
- "<option>-E</option>, <option>--expiredate</option> "
- "<replaceable>EXPIRE_DATE</replaceable>"
- msgstr ""
--"<option>-E</option>, <option>--expiredate</option> "
-+"<option>-E</option>, <option>--expiredate</option> "
- "<replaceable>DATE_FIN_VALIDITÉ</replaceable>"
-
- # NOTE: s/date//
-@@ -10233,11 +10425,15 @@
- "date de fin de validité."
-
- #: chage.1.xml:135(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-I</option>, <option>--inactive</option><replaceable>INACTIVE</"
-+#| "replaceable>"
- msgid ""
- "<option>-I</option>, <option>--inactive</option> <replaceable>INACTIVE</"
- "replaceable>"
- msgstr ""
--"<option>-I</option>, <option>--inactive</option> "
-+"<option>-I</option>, <option>--inactive</option> "
- "<replaceable>DURÉE_INACTIVITÉ</replaceable>"
-
- #: chage.1.xml:139(para)
-@@ -10267,19 +10463,27 @@
- msgstr "Afficher les informations sur l'âge des comptes."
-
- #: chage.1.xml:164(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-m</option>, <option>--mindays</option><replaceable>MIN_DAYS</"
-+#| "replaceable>"
- msgid ""
- "<option>-m</option>, <option>--mindays</option> <replaceable>MIN_DAYS</"
- "replaceable>"
- msgstr ""
--"<option>-m</option>, <option>--mindays</option> <replaceable>JOURS_MIN</"
-+"<option>-m</option>, <option>--mindays</option> <replaceable>JOURS_MIN</"
- "replaceable>"
-
- #: chage.1.xml:176(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-M</option>, <option>--maxdays</option><replaceable>MAX_DAYS</"
-+#| "replaceable>"
- msgid ""
- "<option>-M</option>, <option>--maxdays</option> <replaceable>MAX_DAYS</"
- "replaceable>"
- msgstr ""
--"<option>-M</option>, <option>--maxdays</option> <replaceable>JOURS_MAX</"
-+"<option>-M</option>, <option>--maxdays</option> <replaceable>JOURS_MAX</"
- "replaceable>"
-
- #: chage.1.xml:180(para)
-@@ -10309,11 +10513,15 @@
- "<replaceable>JOURS_MAX</replaceable> supprime la vérification de validité."
-
- #: chage.1.xml:209(term)
-+#, fuzzy
-+#| msgid ""
-+#| "<option>-W</option>, <option>--warndays</option><replaceable>WARN_DAYS</"
-+#| "replaceable>"
- msgid ""
- "<option>-W</option>, <option>--warndays</option> "
- "<replaceable>WARN_DAYS</replaceable>"
- msgstr ""
--"<option>-W</option>, <option>--warndays</option> "
-+"<option>-W</option>, <option>--warndays</option> "
- "<replaceable>DURÉE_AVERTISSEMENT</replaceable>"
-
- #: chage.1.xml:213(para)
-@@ -10419,6 +10627,12 @@
- #~ "manvolnum></citerefentry>, <citerefentry><refentrytitle>usermod</"
- #~ "refentrytitle><manvolnum>8</manvolnum></citerefentry>."
-
-+#~ msgid "KÅoczko"
-+#~ msgstr "Kłoczko"
-+
-+#~ msgid "François"
-+#~ msgstr "François"
-+
- #~ msgid ""
- #~ "<citerefentry><refentrytitle>login.defs</refentrytitle><manvolnum>5</"
- #~ "manvolnum></citerefentry>, <citerefentry><refentrytitle>passwd</"
-@@ -10528,11 +10742,11 @@
- #~ msgstr "-o <placeholder-1/>"
-
- #~ msgid ""
--#~ "Note: <option>-K</option> <replaceable>UID_MIN</"
-+#~ "Note: <option>-K </option><replaceable>UID_MIN</"
- #~ "replaceable>=<replaceable>10</replaceable>,<replaceable>UID_MAX</"
- #~ "replaceable>=<replaceable>499</replaceable> doesn't work yet."
- #~ msgstr ""
--#~ "Note : <option>-K</option> <replaceable>UID_MIN</"
-+#~ "Note : <option>-K</option> <replaceable>UID_MIN</"
- #~ "replaceable>=<replaceable>10</replaceable>,<replaceable>UID_MAX</"
- #~ "replaceable>=<replaceable>499</replaceable> ne fonctionne pas pour "
- #~ "l'instant."
-Index: git/po/fr.po
-===================================================================
---- git.orig/po/fr.po
-+++ git/po/fr.po
-@@ -1,19 +1,19 @@
- # Translation of shadow messages to French
- # Copyright (C) 1999, 2004, 2005, 2006, 2009 Free Software Foundation, Inc.
--# Copyright (C) 2011, 2012 Debian French l10n team <debian-l10n-french at lists.debian.org>
-+# Copyright (C) 2011-2013 Debian French l10n team <debian-l10n-french at lists.debian.org>
- # Patches, suggestions, etc welcome.
- #
- # Vincent Renardias <vincent at ldsol.com>, 1999, 2005.
- # Jean-Luc Coulon <jean.luc.coulon at wanadoo.fr>, 2005, 2006, 2008.
- # Christian Perrier <bubulle at debian.org>, 2005, 2006, 2008, 2009.
- # Jean-Luc Coulon (f5ibh) <jean-luc.coulon at wanadoo.fr>, 2009.
--# Thomas Blein <tblein at tblein.eu>, 2011, 2012.
-+# Thomas Blein <tblein at tblein.eu>, 2011, 2012, 2013.
- msgid ""
- msgstr ""
- "Project-Id-Version: shadow\n"
- "Report-Msgid-Bugs-To: pkg-shadow-devel at lists.alioth.debian.org\n"
- "POT-Creation-Date: 2012-05-20 19:52+0200\n"
--"PO-Revision-Date: 2012-01-13 17:09+0100\n"
-+"PO-Revision-Date: 2013-07-10 18:53+0200\n"
- "Last-Translator: Thomas Blein <tblein at tblein.eu>\n"
- "Language-Team: French <debian-l10n-french at lists.debian.org>\n"
- "Language: fr\n"
-@@ -21,7 +21,7 @@
- "Content-Type: text/plain; charset=UTF-8\n"
- "Content-Transfer-Encoding: 8bit\n"
- "Plural-Forms: nplurals=2; plural=n>1;\n"
--"X-Generator: Lokalize 1.0\n"
-+"X-Generator: Lokalize 1.4\n"
-
- #, c-format
- msgid ""
-@@ -54,10 +54,9 @@
- msgid "%s: nscd did not terminate normally (signal %d)\n"
- msgstr "%s : nscd ne s'est pas terminé normalement (signal %d).\n"
-
--#, fuzzy, c-format
--#| msgid "%s: nscd exited with status %d"
-+#, c-format
- msgid "%s: nscd exited with status %d\n"
--msgstr "%s : nscd s'est terminé avec le statut %d."
-+msgstr "%s : nscd s'est terminé avec l'état %d\n"
-
- msgid "Password: "
- msgstr "Mot de passe : "
-@@ -2022,10 +2021,9 @@
- msgid "%s: line too long in %s: %s..."
- msgstr "%s : ligne trop longue dans %s : %s…"
-
--#, fuzzy, c-format
--#| msgid "%s: Cannot create symbolic link %s: %s\n"
-+#, c-format
- msgid "%s: Cannot create backup file (%s): %s\n"
--msgstr "%s : impossible de créer le lien symbolique %s : %s\n"
-+msgstr "%s : impossible de créer le fichier de sauvegarde (%s) : %s\n"
-
- #, c-format
- msgid "%s: rename: %s: %s\n"
diff --git a/debian/patches/1012_german_translation b/debian/patches/1012_german_translation
deleted file mode 100644
index 4ad0f5f..0000000
--- a/debian/patches/1012_german_translation
+++ /dev/null
@@ -1,31 +0,0 @@
-Index: git/man/po/de.po
-===================================================================
---- git.orig/man/po/de.po
-+++ git/man/po/de.po
-@@ -3064,7 +3064,7 @@
- #: limits.5.xml:61(refmiscinfo) gshadow.5.xml:48(refmiscinfo)
- #: faillog.5.xml:59(refmiscinfo)
- msgid "File Formats and Conversions"
--msgstr "Dateiformate und -konvertierung"
-+msgstr "Dateiformate und konvertierung"
-
- #: suauth.5.xml:65(refpurpose)
- msgid "detailed su control file"
-@@ -4315,7 +4315,7 @@
-
- #: shadow.5.xml:235(para)
- msgid "An empty field means that the account will never expire."
--msgstr "Ein leeren Feld bedeutet, dass das Konto nicht verfallen wird."
-+msgstr "Ein leeres Feld bedeutet, dass das Konto nicht verfallen wird."
-
- #: shadow.5.xml:238(para)
- msgid ""
-@@ -6884,7 +6884,7 @@
- "contents of this file should be a message indicating why logins are "
- "inhibited."
- msgstr ""
--"Falls angegeben, der Name einer Datei, dessen Existenz Anmeldungen außer von "
-+"Falls angegeben, der Name einer Datei, deren Existenz Anmeldungen außer von "
- "Root verhindert. Der Inhalt der Datei sollte die Gründe enthalten, weshalb "
- "Anmeldungen untersagt sind."
-
diff --git a/debian/patches/1020_fix-typo-manpage b/debian/patches/1020_fix-typo-manpage
deleted file mode 100644
index 3b2af53..0000000
--- a/debian/patches/1020_fix-typo-manpage
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: git/man/su.1.xml
-===================================================================
---- git.orig/man/su.1.xml
-+++ git/man/su.1.xml
-@@ -157,7 +157,7 @@
- </para>
- <para>
- The executed command will have no controlling terminal. This
-- option cannot be used to execute interractive programs which
-+ option cannot be used to execute interactive programs which
- need a controlling TTY.
- <!-- This avoids TTY hijacking when su is used to lower
- privileges -->
diff --git a/debian/patches/userns/01_userns_doc b/debian/patches/userns/01_userns_doc
deleted file mode 100644
index f5f5241..0000000
--- a/debian/patches/userns/01_userns_doc
+++ /dev/null
@@ -1,334 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:14:18 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id DAC33C80F4; Tue, 22 Jan 2013 09:14:18 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00
- autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id 274ACC80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:14:14 +0000 (UTC)
-Received: from out01.mta.xmission.com ([166.70.13.231])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZuB-0006Xm-N5; Tue, 22 Jan 2013 02:12:31 -0700
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out01.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZuA-0005NR-BQ; Tue, 22 Jan 2013 02:12:30 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZu7-0004Pj-Ec; Tue, 22 Jan 2013 02:12:30 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:12:23 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <877gn5shs8.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX18YouPWtKNAX3LovSW2+p/ONbuCHMFEQpM=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 01/11] Documentation for /etc/subuid and /etc/subgid
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2071
-Status: RO
-Content-Length: 9835
-Lines: 286
-
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- man/Makefile.am | 4 ++
- man/subgid.5.xml | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
- man/subuid.5.xml | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 244 insertions(+), 0 deletions(-)
- create mode 100644 man/subgid.5.xml
- create mode 100644 man/subuid.5.xml
-
-Index: shadow/man/Makefile.am
-===================================================================
---- shadow.orig/man/Makefile.am 2013-02-01 15:26:14.428082026 -0600
-+++ shadow/man/Makefile.am 2013-02-01 15:27:37.000000000 -0600
-@@ -43,6 +43,8 @@
- man5/shadow.5 \
- man1/su.1 \
- man5/suauth.5 \
-+ man5/subgid.5 \
-+ man5/subuid.5 \
- man8/useradd.8 \
- man8/userdel.8 \
- man8/usermod.8 \
-@@ -94,6 +96,8 @@
- sg.1.xml \
- su.1.xml \
- suauth.5.xml \
-+ subgid.5.xml \
-+ subuid.5.xml \
- useradd.8.xml \
- userdel.8.xml \
- usermod.8.xml \
-Index: shadow/man/subgid.5.xml
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/man/subgid.5.xml 2013-02-01 15:26:14.424082026 -0600
-@@ -0,0 +1,120 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+<!--
-+ Copyright (c) 2013 Eric W. Biederman
-+ All rights reserved.
-+
-+ Redistribution and use in source and binary forms, with or without
-+ modification, are permitted provided that the following conditions
-+ are met:
-+ 1. Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ 2. Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ 3. The name of the copyright holders or contributors may not be used to
-+ endorse or promote products derived from this software without
-+ specific prior written permission.
-+
-+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+-->
-+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.5//EN"
-+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-+<!-- SHADOW-CONFIG-HERE -->
-+]>
-+<refentry id='subgid.5'>
-+ <refmeta>
-+ <refentrytitle>subgid</refentrytitle>
-+ <manvolnum>5</manvolnum>
-+ <refmiscinfo class="sectdesc">File Formats and Conversions</refmiscinfo>
-+ <refmiscinfo class="source">shadow-utils</refmiscinfo>
-+ <refmiscinfo class="version">&SHADOW_UTILS_VERSION;</refmiscinfo>
-+ </refmeta>
-+ <refnamediv id='name'>
-+ <refname>subgid</refname>
-+ <refpurpose>the subordinate gid file</refpurpose>
-+ </refnamediv>
-+
-+ <refsect1 id='description'>
-+ <title>DESCRIPTION</title>
-+ <para>
-+ Each line in <filename>/etc/subgid</filename> contains
-+ a user id and a range of suboridinate user ids that user
-+ is allowed to use.
-+
-+ This is specified with three fields delimited by colons
-+ (<quote>:</quote>).
-+ These fields are:
-+ </para>
-+ <itemizedlist mark='bullet'>
-+ <listitem>
-+ <para>login name</para>
-+ </listitem>
-+ <listitem>
-+ <para>numerical subordinate user ID</para>
-+ </listitem>
-+ <listitem>
-+ <para>numerical subordinate user ID count</para>
-+ </listitem>
-+ </itemizedlist>
-+
-+ <para>
-+ This file specifies the group IDs to be that each user may use
-+ with the <command>newgidmap</command> command that ordinary users can use to
-+ configure gid mapping in a user namespace.
-+ </para>
-+
-+ <para>
-+ Multiple ranges may be specified per user ID.
-+ </para>
-+
-+ </refsect1>
-+
-+ <refsect1 id='files'>
-+ <title>FILES</title>
-+ <variablelist>
-+ <varlistentry>
-+ <term><filename>/etc/subgid</filename></term>
-+ <listitem>
-+ <para>Per user subordinate group IDs.</para>
-+ </listitem>
-+ </varlistentry>
-+ <varlistentry>
-+ <term><filename>/etc/subgid-</filename></term>
-+ <listitem>
-+ <para>Backup file for /etc/subgid.</para>
-+ </listitem>
-+ </varlistentry>
-+ </variablelist>
-+ </refsect1>
-+
-+ <refsect1 id='see_also'>
-+ <title>SEE ALSO</title>
-+ <para>
-+ <citerefentry>
-+ <refentrytitle>subuid</refentrytitle><manvolnum>5</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>logindefs</refentrytitle><manvolnum>5</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>newuidmap</refentrytitle><manvolnum>1</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>newgidmap</refentrytitle><manvolnum>1</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>usermod</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ </para>
-+ </refsect1>
-+</refentry>
-Index: shadow/man/subuid.5.xml
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/man/subuid.5.xml 2013-02-01 15:26:14.424082026 -0600
-@@ -0,0 +1,120 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+<!--
-+ Copyright (c) 2013 Eric W. Biederman
-+ All rights reserved.
-+
-+ Redistribution and use in source and binary forms, with or without
-+ modification, are permitted provided that the following conditions
-+ are met:
-+ 1. Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ 2. Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ 3. The name of the copyright holders or contributors may not be used to
-+ endorse or promote products derived from this software without
-+ specific prior written permission.
-+
-+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+-->
-+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.5//EN"
-+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-+<!-- SHADOW-CONFIG-HERE -->
-+]>
-+<refentry id='subuid.5'>
-+ <refmeta>
-+ <refentrytitle>subuid</refentrytitle>
-+ <manvolnum>5</manvolnum>
-+ <refmiscinfo class="sectdesc">File Formats and Conversions</refmiscinfo>
-+ <refmiscinfo class="source">shadow-utils</refmiscinfo>
-+ <refmiscinfo class="version">&SHADOW_UTILS_VERSION;</refmiscinfo>
-+ </refmeta>
-+ <refnamediv id='name'>
-+ <refname>subuid</refname>
-+ <refpurpose>the subordinate uid file</refpurpose>
-+ </refnamediv>
-+
-+ <refsect1 id='description'>
-+ <title>DESCRIPTION</title>
-+ <para>
-+ Each line in <filename>/etc/subuid</filename> contains
-+ a user id and a range of suboridinate user ids that user
-+ is allowed to use.
-+
-+ This is specified with three fields delimited by colons
-+ (<quote>:</quote>).
-+ These fields are:
-+ </para>
-+ <itemizedlist mark='bullet'>
-+ <listitem>
-+ <para>login name</para>
-+ </listitem>
-+ <listitem>
-+ <para>numerical subordinate user ID</para>
-+ </listitem>
-+ <listitem>
-+ <para>numerical subordinate user ID count</para>
-+ </listitem>
-+ </itemizedlist>
-+
-+ <para>
-+ This file specifies the user IDs to be that each user may use
-+ with the <command>newuidmap</command> command that ordinary users can use to
-+ configure uid mapping in a user namespace.
-+ </para>
-+
-+ <para>
-+ Multiple ranges may be specified per user ID.
-+ </para>
-+
-+ </refsect1>
-+
-+ <refsect1 id='files'>
-+ <title>FILES</title>
-+ <variablelist>
-+ <varlistentry>
-+ <term><filename>/etc/subuid</filename></term>
-+ <listitem>
-+ <para>Per user subordinate user IDs.</para>
-+ </listitem>
-+ </varlistentry>
-+ <varlistentry>
-+ <term><filename>/etc/subuid-</filename></term>
-+ <listitem>
-+ <para>Backup file for /etc/subuid.</para>
-+ </listitem>
-+ </varlistentry>
-+ </variablelist>
-+ </refsect1>
-+
-+ <refsect1 id='see_also'>
-+ <title>SEE ALSO</title>
-+ <para>
-+ <citerefentry>
-+ <refentrytitle>subgid</refentrytitle><manvolnum>5</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>logindefs</refentrytitle><manvolnum>5</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>newuidmap</refentrytitle><manvolnum>1</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>newgidmap</refentrytitle><manvolnum>1</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>usermod</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ </para>
-+ </refsect1>
-+</refentry>
diff --git a/debian/patches/userns/02_userns_doc_login.defs b/debian/patches/userns/02_userns_doc_login.defs
deleted file mode 100644
index 5d85cce..0000000
--- a/debian/patches/userns/02_userns_doc_login.defs
+++ /dev/null
@@ -1,218 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:14:55 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id 140DBC80F4; Tue, 22 Jan 2013 09:14:55 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00
- autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id 5D815C80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:14:50 +0000 (UTC)
-Received: from out03.mta.xmission.com ([166.70.13.233])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZum-0006il-0f; Tue, 22 Jan 2013 02:13:08 -0700
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZul-0004GF-Id; Tue, 22 Jan 2013 02:13:07 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZuf-0004T0-MS; Tue, 22 Jan 2013 02:13:07 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:12:58 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <871uddshr9.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX19iYyOCEx6dl2v1Ya/KIGpixG5+3MVA1bY=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 02/11] login.defs.5: Document the new variables in login.defs
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2072
-Status: RO
-Content-Length: 7615
-Lines: 170
-
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- man/Makefile.am | 2 +
- man/login.defs.5.xml | 8 ++++++
- man/login.defs.d/SUB_GID_COUNT.xml | 46 ++++++++++++++++++++++++++++++++++++
- man/login.defs.d/SUB_UID_COUNT.xml | 46 ++++++++++++++++++++++++++++++++++++
- 4 files changed, 102 insertions(+), 0 deletions(-)
- create mode 100644 man/login.defs.d/SUB_GID_COUNT.xml
- create mode 100644 man/login.defs.d/SUB_UID_COUNT.xml
-
-Index: shadow/man/Makefile.am
-===================================================================
---- shadow.orig/man/Makefile.am 2013-02-01 15:27:51.048080390 -0600
-+++ shadow/man/Makefile.am 2013-02-01 15:27:51.040080390 -0600
-@@ -163,6 +163,8 @@
- USERDEL_CMD.xml \
- USERGROUPS_ENAB.xml \
- USE_TCB.xml \
-+ SUB_GID_COUNT.xml \
-+ SUB_UID_COUNT.xml \
- SYS_GID_MAX.xml \
- SYS_UID_MAX.xml
-
-Index: shadow/man/login.defs.5.xml
-===================================================================
---- shadow.orig/man/login.defs.5.xml 2013-02-01 15:27:51.048080390 -0600
-+++ shadow/man/login.defs.5.xml 2013-02-01 15:27:51.044080390 -0600
-@@ -78,6 +78,8 @@
- <!ENTITY SULOG_FILE SYSTEM "login.defs.d/SULOG_FILE.xml">
- <!ENTITY SU_NAME SYSTEM "login.defs.d/SU_NAME.xml">
- <!ENTITY SU_WHEEL_ONLY SYSTEM "login.defs.d/SU_WHEEL_ONLY.xml">
-+<!ENTITY SUB_GID_COUNT SYSTEM "login.defs.d/SUB_GID_COUNT.xml">
-+<!ENTITY SUB_UID_COUNT SYSTEM "login.defs.d/SUB_UID_COUNT.xml">
- <!ENTITY SYS_GID_MAX SYSTEM "login.defs.d/SYS_GID_MAX.xml">
- <!ENTITY SYSLOG_SG_ENAB SYSTEM "login.defs.d/SYSLOG_SG_ENAB.xml">
- <!ENTITY SYSLOG_SU_ENAB SYSTEM "login.defs.d/SYSLOG_SU_ENAB.xml">
-@@ -216,6 +218,8 @@
- &SULOG_FILE;
- &SU_NAME;
- &SU_WHEEL_ONLY;
-+ &SUB_GID_COUNT; <!-- documents also SUB_GID_MIN SUB_GID_MAX -->
-+ &SUB_UID_COUNT; <!-- documents also SUB_UID_MIN SUB_UID_MAX -->
- &SYS_GID_MAX; <!-- documents also SYS_GID_MIN -->
- &SYS_UID_MAX; <!-- documents also SYS_UID_MIN -->
- &SYSLOG_SG_ENAB;
-@@ -393,6 +397,8 @@
- PASS_MAX_DAYS PASS_MIN_DAYS PASS_WARN_AGE
- <phrase condition="sha_crypt">SHA_CRYPT_MAX_ROUNDS
- SHA_CRYPT_MIN_ROUNDS</phrase>
-+ SUB_GID_COUNT SUB_GID_MAX SUB_GID_MIN
-+ SUB_UID_COUNT SUB_UID_MAX SUB_UID_MIN
- SYS_GID_MAX SYS_GID_MIN SYS_UID_MAX SYS_UID_MIN UID_MAX UID_MIN
- UMASK
- </para>
-@@ -470,6 +476,8 @@
- GID_MAX GID_MIN
- MAIL_DIR MAX_MEMBERS_PER_GROUP
- PASS_MAX_DAYS PASS_MIN_DAYS PASS_WARN_AGE
-+ SUB_GID_COUNT SUB_GID_MAX SUB_GID_MIN
-+ SUB_UID_COUNT SUB_UID_MAX SUB_UID_MIN
- SYS_GID_MAX SYS_GID_MIN SYS_UID_MAX SYS_UID_MIN UID_MAX UID_MIN
- UMASK
- <phrase condition="tcb">TCB_AUTH_GROUP TCB_SYMLINK USE_TCB</phrase>
-Index: shadow/man/login.defs.d/SUB_GID_COUNT.xml
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/man/login.defs.d/SUB_GID_COUNT.xml 2013-02-01 15:27:51.044080390 -0600
-@@ -0,0 +1,46 @@
-+<!--
-+ Copyright (c) 2013, Eric W. Biederman
-+ All rights reserved.
-+
-+ Redistribution and use in source and binary forms, with or without
-+ modification, are permitted provided that the following conditions
-+ are met:
-+ 1. Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ 2. Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ 3. The name of the copyright holders or contributors may not be used to
-+ endorse or promote products derived from this software without
-+ specific prior written permission.
-+
-+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+-->
-+<varlistentry>
-+ <term><option>SUB_GID_MIN</option> (number)</term>
-+ <term><option>SUB_GID_MAX</option> (number)</term>
-+ <term><option>SUB_GID_COUNT</option> (number)</term>
-+ <listitem>
-+ <para>
-+ The commands <command>useradd</command> and <command>newusers</command>
-+ allocate <option>SUB_GID_COUNT</option> unused group IDs from the range
-+ <option>SUB_GID_MIN</option> to <option>SUB_GID_MAX</option> for each
-+ new user.
-+ </para>
-+ <para>
-+ The default values for <option>SUB_GID_MAN</option>,
-+ <option>SUB_GID_MIN</option>, <option>SUB_GID_COUNT</option>
-+ are respectively 100000, 600100000 and 10000.
-+ </para>
-+ </listitem>
-+</varlistentry>
-Index: shadow/man/login.defs.d/SUB_UID_COUNT.xml
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/man/login.defs.d/SUB_UID_COUNT.xml 2013-02-01 15:27:51.044080390 -0600
-@@ -0,0 +1,46 @@
-+<!--
-+ Copyright (c) 2013, Eric W. Biederman
-+ All rights reserved.
-+
-+ Redistribution and use in source and binary forms, with or without
-+ modification, are permitted provided that the following conditions
-+ are met:
-+ 1. Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ 2. Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ 3. The name of the copyright holders or contributors may not be used to
-+ endorse or promote products derived from this software without
-+ specific prior written permission.
-+
-+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+-->
-+<varlistentry>
-+ <term><option>SUB_UID_MIN</option> (number)</term>
-+ <term><option>SUB_UID_MAX</option> (number)</term>
-+ <term><option>SUB_UID_COUNT</option> (number)</term>
-+ <listitem>
-+ <para>
-+ The commands <command>useradd</command> and <command>newusers</command>
-+ allocate <option>SUB_UID_COUNT</option> unused user IDs from the range
-+ <option>SUB_UID_MIN</option> to <option>SUB_UID_MAX</option> for each
-+ new user.
-+ </para>
-+ <para>
-+ The default values for <option>SUB_GID_MAN</option>,
-+ <option>SUB_GID_MIN</option>, <option>SUB_GID_COUNT</option>
-+ are respectively 100000, 600100000 and 10000.
-+ </para>
-+ </listitem>
-+</varlistentry>
diff --git a/debian/patches/userns/03_userns_implement_commonio_append b/debian/patches/userns/03_userns_implement_commonio_append
deleted file mode 100644
index b85d012..0000000
--- a/debian/patches/userns/03_userns_implement_commonio_append
+++ /dev/null
@@ -1,110 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:15:19 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id CAFA8C80F6; Tue, 22 Jan 2013 09:15:19 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00
- autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id 43FAEC80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:15:15 +0000 (UTC)
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZvA-0006sA-Pq; Tue, 22 Jan 2013 02:13:32 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZv8-0004VI-Fi; Tue, 22 Jan 2013 02:13:32 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:13:26 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <87vcapr361.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX1++0A/mQBimfZkeNedO095IfnCYGQfIolI=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 03/11] Implement commonio_append.
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2073
-Status: RO
-Content-Length: 1874
-Lines: 65
-
-
-To support files that do not have a simple unique key implement
-commonio_append to allow new entries to be added.
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- lib/commonio.c | 30 ++++++++++++++++++++++++++++++
- lib/commonio.h | 1 +
- 2 files changed, 31 insertions(+), 0 deletions(-)
-
-Index: shadow/lib/commonio.c
-===================================================================
---- shadow.orig/lib/commonio.c 2013-02-01 15:27:51.376080384 -0600
-+++ shadow/lib/commonio.c 2013-02-01 15:27:51.368080384 -0600
-@@ -1121,6 +1121,36 @@
- return 1;
- }
-
-+int commonio_append (struct commonio_db *db, const void *eptr)
-+{
-+ struct commonio_entry *p;
-+ void *nentry;
-+
-+ if (!db->isopen || db->readonly) {
-+ errno = EINVAL;
-+ return 0;
-+ }
-+ nentry = db->ops->dup (eptr);
-+ if (NULL == nentry) {
-+ errno = ENOMEM;
-+ return 0;
-+ }
-+ /* new entry */
-+ p = (struct commonio_entry *) malloc (sizeof *p);
-+ if (NULL == p) {
-+ db->ops->free (nentry);
-+ errno = ENOMEM;
-+ return 0;
-+ }
-+
-+ p->eptr = nentry;
-+ p->line = NULL;
-+ p->changed = true;
-+ add_one_entry (db, p);
-+
-+ db->changed = true;
-+ return 1;
-+}
-
- void commonio_del_entry (struct commonio_db *db, const struct commonio_entry *p)
- {
-Index: shadow/lib/commonio.h
-===================================================================
---- shadow.orig/lib/commonio.h 2013-02-01 15:27:51.376080384 -0600
-+++ shadow/lib/commonio.h 2013-02-01 15:27:51.368080384 -0600
-@@ -146,6 +146,7 @@
- extern int commonio_open (struct commonio_db *, int);
- extern /*@observer@*/ /*@null@*/const void *commonio_locate (struct commonio_db *, const char *);
- extern int commonio_update (struct commonio_db *, const void *);
-+extern int commonio_append (struct commonio_db *, const void *);
- extern int commonio_remove (struct commonio_db *, const char *);
- extern int commonio_rewind (struct commonio_db *);
- extern /*@observer@*/ /*@null@*/const void *commonio_next (struct commonio_db *);
diff --git a/debian/patches/userns/04_userns_add_backend_support b/debian/patches/userns/04_userns_add_backend_support
deleted file mode 100644
index 187b9b8..0000000
--- a/debian/patches/userns/04_userns_add_backend_support
+++ /dev/null
@@ -1,685 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:16:29 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id AF9A9C80F4; Tue, 22 Jan 2013 09:16:29 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00
- autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id EDF70C80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:16:24 +0000 (UTC)
-Received: from out01.mta.xmission.com ([166.70.13.231])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZwI-0007HS-Mn; Tue, 22 Jan 2013 02:14:42 -0700
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out01.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZwI-0005wP-8E; Tue, 22 Jan 2013 02:14:42 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZwE-0004bA-Mv; Tue, 22 Jan 2013 02:14:42 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:14:35 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <87liblr344.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX1/3QOlmT6VsAuzQbs/RJ/nb1IrpO++QYVA=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 04/11] Add backend support for suboridnate uids and gids
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2074
-Status: RO
-X-Status: A
-Content-Length: 15967
-Lines: 636
-
-
-These files list the set of subordinate uids and gids that users are allowed
-to use. The expect use case is with the user namespace but other uses are
-allowed.
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- etc/login.defs | 8 +
- lib/Makefile.am | 2 +
- lib/getdef.c | 6 +
- lib/subordinateio.c | 512 +++++++++++++++++++++++++++++++++++++++++++++++++++
- lib/subordinateio.h | 38 ++++
- 5 files changed, 566 insertions(+), 0 deletions(-)
- create mode 100644 lib/subordinateio.c
- create mode 100644 lib/subordinateio.h
-
-Index: shadow/etc/login.defs
-===================================================================
---- shadow.orig/etc/login.defs 2013-02-01 15:27:51.684080379 -0600
-+++ shadow/etc/login.defs 2013-02-01 15:27:51.676080379 -0600
-@@ -226,6 +226,10 @@
- # System accounts
- SYS_UID_MIN 101
- SYS_UID_MAX 999
-+# Extra per user uids
-+SUB_UID_MIN 100000
-+SUB_UID_MAX 600100000
-+SUB_UID_COUNT 10000
-
- #
- # Min/max values for automatic gid selection in groupadd
-@@ -235,6 +239,10 @@
- # System accounts
- SYS_GID_MIN 101
- SYS_GID_MAX 999
-+# Extra per user group ids
-+SUB_GID_MIN 100000
-+SUB_GID_MAX 600100000
-+SUB_GID_COUNT 10000
-
- #
- # Max number of login retries if password is bad
-Index: shadow/lib/Makefile.am
-===================================================================
---- shadow.orig/lib/Makefile.am 2013-02-01 15:27:51.684080379 -0600
-+++ shadow/lib/Makefile.am 2013-02-01 15:27:51.676080379 -0600
-@@ -39,6 +39,8 @@
- pwio.c \
- pwio.h \
- pwmem.c \
-+ subordinateio.h \
-+ subordinateio.c \
- selinux.c \
- semanage.c \
- sgetgrent.c \
-Index: shadow/lib/getdef.c
-===================================================================
---- shadow.orig/lib/getdef.c 2013-02-01 15:27:51.684080379 -0600
-+++ shadow/lib/getdef.c 2013-02-01 15:27:51.680080379 -0600
-@@ -82,6 +82,12 @@
- {"SHA_CRYPT_MAX_ROUNDS", NULL},
- {"SHA_CRYPT_MIN_ROUNDS", NULL},
- #endif
-+ {"SUB_GID_COUNT", NULL},
-+ {"SUB_GID_MAX", NULL},
-+ {"SUB_GID_MIN", NULL},
-+ {"SUB_UID_COUNT", NULL},
-+ {"SUB_UID_MAX", NULL},
-+ {"SUB_UID_MIN", NULL},
- {"SULOG_FILE", NULL},
- {"SU_NAME", NULL},
- {"SYS_GID_MAX", NULL},
-Index: shadow/lib/subordinateio.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/lib/subordinateio.c 2013-02-01 15:27:51.680080379 -0600
-@@ -0,0 +1,512 @@
-+/*
-+ * Copyright (c) 2012 - Eric Biederman
-+ */
-+
-+#include <config.h>
-+#include "prototypes.h"
-+#include "defines.h"
-+#include <stdio.h>
-+#include "commonio.h"
-+#include "subordinateio.h"
-+
-+struct subordinate_range {
-+ const char *owner;
-+ unsigned long start;
-+ unsigned long count;
-+};
-+
-+#define NFIELDS 3
-+
-+static /*@null@*/ /*@only@*/void *subordinate_dup (const void *ent)
-+{
-+ const struct subordinate_range *rangeent = ent;
-+ struct subordinate_range *range;
-+
-+ range = (struct subordinate_range *) malloc (sizeof *range);
-+ if (NULL == range) {
-+ return NULL;
-+ }
-+ range->owner = strdup (rangeent->owner);
-+ if (NULL == range->owner) {
-+ free(range);
-+ return NULL;
-+ }
-+ range->start = rangeent->start;
-+ range->count = rangeent->count;
-+
-+ return range;
-+}
-+
-+static void subordinate_free (/*@out@*/ /*@only@*/void *ent)
-+{
-+ struct subordinate_range *rangeent = ent;
-+
-+ free ((void *)(rangeent->owner));
-+ free (rangeent);
-+}
-+
-+static void *subordinate_parse (const char *line)
-+{
-+ static struct subordinate_range range;
-+ char rangebuf[1024];
-+ int i;
-+ char *cp;
-+ char *fields[NFIELDS];
-+
-+ /*
-+ * Copy the string to a temporary buffer so the substrings can
-+ * be modified to be NULL terminated.
-+ */
-+ if (strlen (line) >= sizeof rangebuf)
-+ return NULL; /* fail if too long */
-+ strcpy (rangebuf, line);
-+
-+ /*
-+ * Save a pointer to the start of each colon separated
-+ * field. The fields are converted into NUL terminated strings.
-+ */
-+
-+ for (cp = rangebuf, i = 0; (i < NFIELDS) && (NULL != cp); i++) {
-+ fields[i] = cp;
-+ while (('\0' != *cp) && (':' != *cp)) {
-+ cp++;
-+ }
-+
-+ if ('\0' != *cp) {
-+ *cp = '\0';
-+ cp++;
-+ } else {
-+ cp = NULL;
-+ }
-+ }
-+
-+ /*
-+ * There must be exactly NFIELDS colon separated fields or
-+ * the entry is invalid. Also, fields must be non-blank.
-+ */
-+ if (i != NFIELDS || *fields[0] == '\0' || *fields[1] == '\0' || *fields[2] == '\0')
-+ return NULL;
-+ range.owner = fields[0];
-+ if (getulong (fields[1], &range.start) == 0)
-+ return NULL;
-+ if (getulong (fields[2], &range.count) == 0)
-+ return NULL;
-+
-+ return ⦥
-+}
-+
-+static int subordinate_put (const void *ent, FILE * file)
-+{
-+ const struct subordinate_range *range = ent;
-+
-+ return fprintf(file, "%s:%lu:%lu\n",
-+ range->owner,
-+ range->start,
-+ range->count) < 0 ? -1 : 0;
-+}
-+
-+static struct commonio_ops subordinate_ops = {
-+ subordinate_dup, /* dup */
-+ subordinate_free, /* free */
-+ NULL, /* getname */
-+ subordinate_parse, /* parse */
-+ subordinate_put, /* put */
-+ fgets, /* fgets */
-+ fputs, /* fputs */
-+ NULL, /* open_hook */
-+ NULL, /* close_hook */
-+};
-+
-+static /*@observer@*/ /*@null*/const struct subordinate_range *subordinate_next(struct commonio_db *db)
-+{
-+ commonio_next (db);
-+}
-+
-+static bool is_range_free(struct commonio_db *db, unsigned long start,
-+ unsigned long count)
-+{
-+ const struct subordinate_range *range;
-+ unsigned long end = start + count - 1;
-+
-+ commonio_rewind(db);
-+ while ((range = commonio_next(db)) != NULL) {
-+ unsigned long first = range->start;
-+ unsigned long last = first + range->count - 1;
-+
-+ if ((end >= first) && (start <= last))
-+ return false;
-+ }
-+ return true;
-+}
-+
-+static const bool range_exists(struct commonio_db *db, const char *owner)
-+{
-+ const struct subordinate_range *range;
-+ commonio_rewind(db);
-+ while ((range = commonio_next(db)) != NULL) {
-+ unsigned long first = range->start;
-+ unsigned long last = first + range->count - 1;
-+
-+ if (0 == strcmp(range->owner, owner))
-+ return true;
-+ }
-+ return false;
-+}
-+
-+static const struct subordinate_range *find_range(struct commonio_db *db,
-+ const char *owner, unsigned long val)
-+{
-+ const struct subordinate_range *range;
-+ commonio_rewind(db);
-+ while ((range = commonio_next(db)) != NULL) {
-+ unsigned long first = range->start;
-+ unsigned long last = first + range->count - 1;
-+
-+ if (0 != strcmp(range->owner, owner))
-+ continue;
-+
-+ if ((val >= first) && (val <= last))
-+ return range;
-+ }
-+ return NULL;
-+}
-+
-+static bool have_range(struct commonio_db *db,
-+ const char *owner, unsigned long start, unsigned long count)
-+{
-+ const struct subordinate_range *range;
-+ unsigned long end;
-+
-+ if (count == 0)
-+ return false;
-+
-+ end = start + count - 1;
-+ range = find_range (db, owner, start);
-+ while (range) {
-+ unsigned long last;
-+
-+ last = range->start + range->count - 1;
-+ if (last >= (start + count - 1))
-+ return true;
-+
-+ count = end - last;
-+ start = last + 1;
-+ range = find_range(db, owner, start);
-+ }
-+ return false;
-+}
-+
-+static int subordinate_range_cmp (const void *p1, const void *p2)
-+{
-+ struct subordinate_range *range1, *range2;
-+
-+ if ((*(struct commonio_entry **) p1)->eptr == NULL)
-+ return 1;
-+ if ((*(struct commonio_entry **) p2)->eptr == NULL)
-+ return -1;
-+
-+ range1 = ((struct subordinate_range *) (*(struct commonio_entry **) p1)->eptr);
-+ range2 = ((struct subordinate_range *) (*(struct commonio_entry **) p2)->eptr);
-+
-+ if (range1->start < range2->start)
-+ return -1;
-+ else if (range1->start > range2->start)
-+ return 1;
-+ else if (range1->count < range2->count)
-+ return -1;
-+ else if (range1->count > range2->count)
-+ return 1;
-+ else
-+ return strcmp(range1->owner, range2->owner);
-+}
-+
-+static unsigned long find_free_range(struct commonio_db *db,
-+ unsigned long min, unsigned long max,
-+ unsigned long count)
-+{
-+ const struct subordinate_range *range;
-+ unsigned long low, high;
-+
-+ /* When given invalid parameters fail */
-+ if ((count == 0) || (max <= min))
-+ goto fail;
-+
-+ /* Sort by range than by owner */
-+ commonio_sort (db, subordinate_range_cmp);
-+ commonio_rewind(db);
-+
-+ low = min;
-+ while ((range = commonio_next(db)) != NULL) {
-+ unsigned long first = range->start;
-+ unsigned long last = first + range->count - 1;
-+
-+ /* Find the top end of the hole before this range */
-+ high = first;
-+ if (high > max)
-+ high = max;
-+
-+ /* Is the hole before this range large enough? */
-+ if ((high > low) && (((high - low) + 1) >= count))
-+ return low;
-+
-+ /* Compute the low end of the next hole */
-+ if (low < (last + 1))
-+ low = last + 1;
-+ if (low > max)
-+ goto fail;
-+ }
-+
-+ /* Is the remaining unclaimed area large enough? */
-+ if (((max - low) + 1) >= count)
-+ return low;
-+fail:
-+ return ULONG_MAX;
-+}
-+
-+static int add_range(struct commonio_db *db,
-+ const char *owner, unsigned long start, unsigned long count)
-+{
-+ struct subordinate_range range;
-+ range.owner = owner;
-+ range.start = start;
-+ range.count = count;
-+
-+ /* See if the range is already present */
-+ if (have_range(db, owner, start, count))
-+ return 1;
-+
-+ /* Oterwise append the range */
-+ return commonio_append(db, &range);
-+}
-+
-+static int remove_range(struct commonio_db *db,
-+ const char *owner, unsigned long start, unsigned long count)
-+{
-+ struct commonio_entry *ent;
-+ unsigned long end;
-+
-+ if (count == 0)
-+ return 1;
-+
-+ end = start + count - 1;
-+ for (ent = db->head; ent; ent = ent->next) {
-+ struct subordinate_range *range = ent->eptr;
-+ unsigned long first;
-+ unsigned long last;
-+
-+ /* Skip unparsed entries */
-+ if (!range)
-+ continue;
-+
-+ first = range->start;
-+ last = first + range->count - 1;
-+
-+ /* Skip entries with a different owner */
-+ if (0 != strcmp(range->owner, owner))
-+ continue;
-+
-+ /* Skip entries outside of the range to remove */
-+ if ((end < first) || (start > last))
-+ continue;
-+
-+ /* Is entry completely contained in the range to remove? */
-+ if ((start <= first) && (end >= last)) {
-+ commonio_del_entry (db, ent);
-+ }
-+ /* Is just the start of the entry removed? */
-+ else if ((start <= first) && (end < last)) {
-+ range->start = end + 1;
-+ range->count = (last - range->start) + 1;
-+
-+ ent->changed = true;
-+ }
-+ /* Is just the end of the entry removed? */
-+ else if ((start > first) && (end >= last)) {
-+ range->count = (start - range->start) + 1;
-+
-+ ent->changed = true;
-+ }
-+ /* The middle of the range is removed */
-+ else {
-+ struct subordinate_range tail;
-+ tail.owner = range->owner;
-+ tail.start = end + 1;
-+ tail.count = (last - tail.start) + 1;
-+
-+ if (!commonio_append(db, &tail))
-+ return 0;
-+
-+ range->count = (start - range->start) + 1;
-+
-+ ent->changed = true;
-+ }
-+ }
-+
-+ return 1;
-+}
-+
-+static struct commonio_db subordinate_uid_db = {
-+ "/etc/subuid", /* filename */
-+ &subordinate_ops, /* ops */
-+ NULL, /* fp */
-+#ifdef WITH_SELINUX
-+ NULL, /* scontext */
-+#endif
-+ NULL, /* head */
-+ NULL, /* tail */
-+ NULL, /* cursor */
-+ false, /* changed */
-+ false, /* isopen */
-+ false, /* locked */
-+ false /* readonly */
-+};
-+
-+int sub_uid_setdbname (const char *filename)
-+{
-+ return commonio_setname (&subordinate_uid_db, filename);
-+}
-+
-+/*@observer@*/const char *sub_uid_dbname (void)
-+{
-+ return subordinate_uid_db.filename;
-+}
-+
-+bool sub_uid_file_present (void)
-+{
-+ return commonio_present (&subordinate_uid_db);
-+}
-+
-+int sub_uid_lock (void)
-+{
-+ return commonio_lock (&subordinate_uid_db);
-+}
-+
-+int sub_uid_open (int mode)
-+{
-+ return commonio_open (&subordinate_uid_db, mode);
-+}
-+
-+bool is_sub_uid_range_free(uid_t start, unsigned long count)
-+{
-+ return is_range_free (&subordinate_uid_db, start, count);
-+}
-+
-+bool sub_uid_assigned(const char *owner)
-+{
-+ return range_exists (&subordinate_uid_db, owner);
-+}
-+
-+bool have_sub_uids(const char *owner, uid_t start, unsigned long count)
-+{
-+ return have_range (&subordinate_uid_db, owner, start, count);
-+}
-+
-+int sub_uid_add (const char *owner, uid_t start, unsigned long count)
-+{
-+ return add_range (&subordinate_uid_db, owner, start, count);
-+}
-+
-+int sub_uid_remove (const char *owner, uid_t start, unsigned long count)
-+{
-+ return remove_range (&subordinate_uid_db, owner, start, count);
-+}
-+
-+int sub_uid_close (void)
-+{
-+ return commonio_close (&subordinate_uid_db);
-+}
-+
-+int sub_uid_unlock (void)
-+{
-+ return commonio_unlock (&subordinate_uid_db);
-+}
-+
-+uid_t sub_uid_find_free_range(uid_t min, uid_t max, unsigned long count)
-+{
-+ unsigned long start;
-+ start = find_free_range (&subordinate_uid_db, min, max, count);
-+ return start == ULONG_MAX ? (uid_t) -1 : start;
-+}
-+
-+static struct commonio_db subordinate_gid_db = {
-+ "/etc/subgid", /* filename */
-+ &subordinate_ops, /* ops */
-+ NULL, /* fp */
-+#ifdef WITH_SELINUX
-+ NULL, /* scontext */
-+#endif
-+ NULL, /* head */
-+ NULL, /* tail */
-+ NULL, /* cursor */
-+ false, /* changed */
-+ false, /* isopen */
-+ false, /* locked */
-+ false /* readonly */
-+};
-+
-+int sub_gid_setdbname (const char *filename)
-+{
-+ return commonio_setname (&subordinate_gid_db, filename);
-+}
-+
-+/*@observer@*/const char *sub_gid_dbname (void)
-+{
-+ return subordinate_gid_db.filename;
-+}
-+
-+bool sub_gid_file_present (void)
-+{
-+ return commonio_present (&subordinate_gid_db);
-+}
-+
-+int sub_gid_lock (void)
-+{
-+ return commonio_lock (&subordinate_gid_db);
-+}
-+
-+int sub_gid_open (int mode)
-+{
-+ return commonio_open (&subordinate_gid_db, mode);
-+}
-+
-+bool is_sub_gid_range_free(gid_t start, unsigned long count)
-+{
-+ return is_range_free (&subordinate_gid_db, start, count);
-+}
-+
-+bool have_sub_gids(const char *owner, gid_t start, unsigned long count)
-+{
-+ return have_range(&subordinate_gid_db, owner, start, count);
-+}
-+
-+bool sub_gid_assigned(const char *owner)
-+{
-+ return range_exists (&subordinate_gid_db, owner);
-+}
-+
-+int sub_gid_add (const char *owner, gid_t start, unsigned long count)
-+{
-+ return add_range (&subordinate_gid_db, owner, start, count);
-+}
-+
-+int sub_gid_remove (const char *owner, gid_t start, unsigned long count)
-+{
-+ return remove_range (&subordinate_gid_db, owner, start, count);
-+}
-+
-+int sub_gid_close (void)
-+{
-+ return commonio_close (&subordinate_gid_db);
-+}
-+
-+int sub_gid_unlock (void)
-+{
-+ return commonio_unlock (&subordinate_gid_db);
-+}
-+
-+gid_t sub_gid_find_free_range(gid_t min, gid_t max, unsigned long count)
-+{
-+ unsigned long start;
-+ start = find_free_range (&subordinate_gid_db, min, max, count);
-+ return start == ULONG_MAX ? (gid_t) -1 : start;
-+}
-Index: shadow/lib/subordinateio.h
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/lib/subordinateio.h 2013-02-01 15:27:51.680080379 -0600
-@@ -0,0 +1,38 @@
-+/*
-+ * Copyright (c) 2012- Eric W. Biederman
-+ */
-+
-+#ifndef _SUBORDINATEIO_H
-+#define _SUBORDINATEIO_H
-+
-+#include <sys/types.h>
-+
-+extern int sub_uid_close(void);
-+extern bool is_sub_uid_range_free(uid_t start, unsigned long count);
-+extern bool have_sub_uids(const char *owner, uid_t start, unsigned long count);
-+extern bool sub_uid_file_present (void);
-+extern bool sub_uid_assigned(const char *owner);
-+extern int sub_uid_lock (void);
-+extern int sub_uid_setdbname (const char *filename);
-+extern /*@observer@*/const char *sub_uid_dbname (void);
-+extern int sub_uid_open (int mode);
-+extern int sub_uid_unlock (void);
-+extern int sub_uid_add (const char *owner, uid_t start, unsigned long count);
-+extern int sub_uid_remove (const char *owner, uid_t start, unsigned long count);
-+extern uid_t sub_uid_find_free_range(uid_t min, uid_t max, unsigned long count);
-+
-+extern int sub_gid_close(void);
-+extern bool is_sub_gid_range_free(gid_t start, unsigned long count);
-+extern bool have_sub_gids(const char *owner, gid_t start, unsigned long count);
-+extern bool sub_gid_file_present (void);
-+extern bool sub_gid_assigned(const char *owner);
-+extern int sub_gid_lock (void);
-+extern int sub_gid_setdbname (const char *filename);
-+extern /*@observer@*/const char *sub_gid_dbname (void);
-+extern int sub_gid_open (int mode);
-+extern int sub_gid_unlock (void);
-+extern int sub_gid_add (const char *owner, gid_t start, unsigned long count);
-+extern int sub_gid_remove (const char *owner, gid_t start, unsigned long count);
-+extern uid_t sub_gid_find_free_range(gid_t min, gid_t max, unsigned long count);
-+
-+#endif
diff --git a/debian/patches/userns/05_userns_implemend_find_new_sub_xids b/debian/patches/userns/05_userns_implemend_find_new_sub_xids
deleted file mode 100644
index 707b552..0000000
--- a/debian/patches/userns/05_userns_implemend_find_new_sub_xids
+++ /dev/null
@@ -1,283 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:17:02 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id 480ABC80F4; Tue, 22 Jan 2013 09:17:02 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00
- autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id 90ACFC80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:16:57 +0000 (UTC)
-Received: from out01.mta.xmission.com ([166.70.13.231])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZwp-0007cg-9X; Tue, 22 Jan 2013 02:15:15 -0700
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out01.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZwo-0006DN-OT; Tue, 22 Jan 2013 02:15:14 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZwj-0004g0-9e; Tue, 22 Jan 2013 02:15:14 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:15:05 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <87fw1tr33a.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX19KHX5xUOkaLY5iIEqDVLxZKDTByyA0Xk8=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 05/11] Implement find_new_sub_uids find_new_sub_gids
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2075
-Status: RO
-Content-Length: 8108
-Lines: 235
-
-
-Functions for finding new subordinate uid and gids ranges for use
-with useradd.
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- lib/prototypes.h | 9 ++++
- libmisc/Makefile.am | 2 +
- libmisc/find_new_sub_gids.c | 87 +++++++++++++++++++++++++++++++++++++++++++
- libmisc/find_new_sub_uids.c | 87 +++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 185 insertions(+), 0 deletions(-)
- create mode 100644 libmisc/find_new_sub_gids.c
- create mode 100644 libmisc/find_new_sub_uids.c
-
-Index: shadow/lib/prototypes.h
-===================================================================
---- shadow.orig/lib/prototypes.h 2013-02-01 15:27:52.044080373 -0600
-+++ shadow/lib/prototypes.h 2013-02-01 15:27:52.040080373 -0600
-@@ -149,6 +149,15 @@
- uid_t *uid,
- /*@null@*/uid_t const *preferred_uid);
-
-+/* find_new_sub_gids.c */
-+extern int find_new_sub_gids (const char *owner,
-+ gid_t *range_start, unsigned long *range_count);
-+
-+/* find_new_sub_uids.c */
-+extern int find_new_sub_uids (const char *owner,
-+ uid_t *range_start, unsigned long *range_count);
-+
-+
- /* get_gid.c */
- extern int get_gid (const char *gidstr, gid_t *gid);
-
-Index: shadow/libmisc/Makefile.am
-===================================================================
---- shadow.orig/libmisc/Makefile.am 2013-02-01 15:27:52.044080373 -0600
-+++ shadow/libmisc/Makefile.am 2013-02-01 15:27:52.040080373 -0600
-@@ -25,6 +25,8 @@
- failure.h \
- find_new_gid.c \
- find_new_uid.c \
-+ find_new_sub_gids.c \
-+ find_new_sub_uids.c \
- getdate.h \
- getdate.y \
- getgr_nam_gid.c \
-Index: shadow/libmisc/find_new_sub_gids.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/libmisc/find_new_sub_gids.c 2013-02-01 15:27:52.040080373 -0600
-@@ -0,0 +1,87 @@
-+/*
-+ * Copyright (c) 2012 Eric Biederman
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. The name of the copyright holders or contributors may not be used to
-+ * endorse or promote products derived from this software without
-+ * specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#include <config.h>
-+
-+#include <assert.h>
-+#include <stdio.h>
-+#include <errno.h>
-+
-+#include "prototypes.h"
-+#include "subordinateio.h"
-+#include "getdef.h"
-+
-+/*
-+ * find_new_sub_gids - Find a new unused range of GIDs.
-+ *
-+ * If successful, find_new_sub_gids provides a range of unused
-+ * user IDs in the [SUB_GID_MIN:SUB_GID_MAX] range.
-+ *
-+ * Return 0 on success, -1 if no unused GIDs are available.
-+ */
-+int find_new_sub_gids (const char *owner,
-+ gid_t *range_start, unsigned long *range_count)
-+{
-+ unsigned long min, max;
-+ unsigned long count;
-+ gid_t start;
-+
-+ assert (range_start != NULL);
-+ assert (range_count != NULL);
-+
-+ min = getdef_ulong ("SUB_GID_MIN", 100000UL);
-+ max = getdef_ulong ("SUB_GID_MAX", 600100000UL);
-+ count = getdef_ulong ("SUB_GID_COUNT", 10000);
-+
-+ /* Is there a preferred range that works? */
-+ if ((*range_count != 0) &&
-+ (*range_start >= min) &&
-+ (((*range_start) + (*range_count) - 1) <= max) &&
-+ is_sub_gid_range_free(*range_start, *range_count)) {
-+ return 0;
-+ }
-+
-+ if (max < (min + count)) {
-+ (void) fprintf (stderr,
-+ _("%s: Invalid configuration: SUB_GID_MIN (%lu), SUB_GID_MAX (%lu)\n"),
-+ Prog, min, max);
-+ return -1;
-+ }
-+ start = sub_gid_find_free_range(min, max, count);
-+ if (start == (gid_t)-1) {
-+ fprintf (stderr,
-+ _("%s: Can't get unique secondary GID range\n"),
-+ Prog);
-+ SYSLOG ((LOG_WARN, "no more available secondary GIDs on the system"));
-+ return -1;
-+ }
-+ *range_start = start;
-+ *range_count = count;
-+ return 0;
-+}
-+
-Index: shadow/libmisc/find_new_sub_uids.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/libmisc/find_new_sub_uids.c 2013-02-01 15:27:52.040080373 -0600
-@@ -0,0 +1,87 @@
-+/*
-+ * Copyright (c) 2012 Eric Biederman
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. The name of the copyright holders or contributors may not be used to
-+ * endorse or promote products derived from this software without
-+ * specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#include <config.h>
-+
-+#include <assert.h>
-+#include <stdio.h>
-+#include <errno.h>
-+
-+#include "prototypes.h"
-+#include "subordinateio.h"
-+#include "getdef.h"
-+
-+/*
-+ * find_new_sub_uids - Find a new unused range of UIDs.
-+ *
-+ * If successful, find_new_sub_uids provides a range of unused
-+ * user IDs in the [SUB_UID_MIN:SUB_UID_MAX] range.
-+ *
-+ * Return 0 on success, -1 if no unused UIDs are available.
-+ */
-+int find_new_sub_uids (const char *owner,
-+ uid_t *range_start, unsigned long *range_count)
-+{
-+ unsigned long min, max;
-+ unsigned long count;
-+ uid_t start;
-+
-+ assert (range_start != NULL);
-+ assert (range_count != NULL);
-+
-+ min = getdef_ulong ("SUB_UID_MIN", 100000UL);
-+ max = getdef_ulong ("SUB_UID_MAX", 600100000UL);
-+ count = getdef_ulong ("SUB_UID_COUNT", 10000);
-+
-+ /* Is there a preferred range that works? */
-+ if ((*range_count != 0) &&
-+ (*range_start >= min) &&
-+ (((*range_start) + (*range_count) - 1) <= max) &&
-+ is_sub_uid_range_free(*range_start, *range_count)) {
-+ return 0;
-+ }
-+
-+ if (max < (min + count)) {
-+ (void) fprintf (stderr,
-+ _("%s: Invalid configuration: SUB_UID_MIN (%lu), SUB_UID_MAX (%lu)\n"),
-+ Prog, min, max);
-+ return -1;
-+ }
-+ start = sub_uid_find_free_range(min, max, count);
-+ if (start == (uid_t)-1) {
-+ fprintf (stderr,
-+ _("%s: Can't get unique secondary UID range\n"),
-+ Prog);
-+ SYSLOG ((LOG_WARN, "no more available secondary UIDs on the system"));
-+ return -1;
-+ }
-+ *range_start = start;
-+ *range_count = count;
-+ return 0;
-+}
-+
diff --git a/debian/patches/userns/06_userns_userdel b/debian/patches/userns/06_userns_userdel
deleted file mode 100644
index 16e7051..0000000
--- a/debian/patches/userns/06_userns_userdel
+++ /dev/null
@@ -1,236 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:18:47 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id F2E6AC80F6; Tue, 22 Jan 2013 09:18:46 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00
- autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id 996B1C80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:18:42 +0000 (UTC)
-Received: from out03.mta.xmission.com ([166.70.13.233])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZyW-0008Bi-3X; Tue, 22 Jan 2013 02:17:00 -0700
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZyU-0005NA-Qm; Tue, 22 Jan 2013 02:16:59 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZyQ-0004qs-T1; Tue, 22 Jan 2013 02:16:58 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:16:51 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <878v7lr30c.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX1/1l7dElNy9uNLAXx8eC28OMs/pxPM8NEo=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 06/11] userdel: Add support for removing subordinate user and group ids.
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2076
-Status: O
-Content-Length: 5573
-Lines: 186
-
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- src/userdel.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 1 files changed, 115 insertions(+), 0 deletions(-)
-
-Index: shadow/src/userdel.c
-===================================================================
---- shadow.orig/src/userdel.c 2013-02-01 15:27:52.380080367 -0600
-+++ shadow/src/userdel.c 2013-02-01 15:27:52.372080367 -0600
-@@ -65,6 +65,7 @@
- #endif /* WITH_TCB */
- /*@-exitarg@*/
- #include "exitcodes.h"
-+#include "subordinateio.h"
-
- /*
- * exit status values
-@@ -75,6 +76,8 @@
- #define E_GRP_UPDATE 10 /* can't update group file */
- #define E_HOMEDIR 12 /* can't remove home directory */
- #define E_SE_UPDATE 14 /* can't update SELinux user mapping */
-+#define E_SUB_UID_UPDATE 16 /* can't update the subordinate uid file */
-+#define E_SUB_GID_UPDATE 18 /* can't update the subordinate gid file */
-
- /*
- * Global variables
-@@ -96,9 +99,13 @@
- static bool is_shadow_grp;
- static bool sgr_locked = false;
- #endif /* SHADOWGRP */
-+static bool is_sub_uid;
-+static bool is_sub_gid;
- static bool pw_locked = false;
- static bool gr_locked = false;
- static bool spw_locked = false;
-+static bool sub_uid_locked = false;
-+static bool sub_gid_locked = false;
-
- /* local function prototypes */
- static void usage (int status);
-@@ -437,6 +444,34 @@
- sgr_locked = false;
- }
- #endif /* SHADOWGRP */
-+
-+ if (is_sub_uid) {
-+ if (sub_uid_close () == 0) {
-+ fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ()));
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ if (sub_uid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
-+ /* continue */
-+ }
-+ sub_uid_locked = false;
-+ }
-+
-+ if (is_sub_gid) {
-+ if (sub_gid_close () == 0) {
-+ fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_gid_dbname ()));
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ if (sub_gid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
-+ /* continue */
-+ }
-+ sub_gid_locked = false;
-+ }
- }
-
- /*
-@@ -474,6 +509,20 @@
- }
- }
- #endif /* SHADOWGRP */
-+ if (sub_uid_locked) {
-+ if (sub_uid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
-+ /* continue */
-+ }
-+ }
-+ if (sub_gid_locked) {
-+ if (sub_gid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
-+ /* continue */
-+ }
-+ }
-
- #ifdef WITH_AUDIT
- audit_logger (AUDIT_DEL_USER, Prog,
-@@ -595,6 +644,58 @@
- }
- }
- #endif /* SHADOWGRP */
-+ if (is_sub_uid) {
-+ if (sub_uid_lock () == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot lock %s; try again later.\n"),
-+ Prog, sub_uid_dbname ());
-+#ifdef WITH_AUDIT
-+ audit_logger (AUDIT_DEL_USER, Prog,
-+ "locking subordinate user file",
-+ user_name, (unsigned int) user_id,
-+ SHADOW_AUDIT_FAILURE);
-+#endif /* WITH_AUDIT */
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ sub_uid_locked = true;
-+ if (sub_uid_open (O_RDWR) == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot open %s\n"), Prog, sub_uid_dbname ());
-+#ifdef WITH_AUDIT
-+ audit_logger (AUDIT_DEL_USER, Prog,
-+ "opening subordinate user file",
-+ user_name, (unsigned int) user_id,
-+ SHADOW_AUDIT_FAILURE);
-+#endif /* WITH_AUDIT */
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ }
-+ if (is_sub_gid) {
-+ if (sub_gid_lock () == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot lock %s; try again later.\n"),
-+ Prog, sub_gid_dbname ());
-+#ifdef WITH_AUDIT
-+ audit_logger (AUDIT_DEL_USER, Prog,
-+ "locking subordinate group file",
-+ user_name, (unsigned int) user_id,
-+ SHADOW_AUDIT_FAILURE);
-+#endif /* WITH_AUDIT */
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ sub_gid_locked = true;
-+ if (sub_gid_open (O_RDWR) == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot open %s\n"), Prog, sub_gid_dbname ());
-+#ifdef WITH_AUDIT
-+ audit_logger (AUDIT_DEL_USER, Prog,
-+ "opening subordinate group file",
-+ user_name, (unsigned int) user_id,
-+ SHADOW_AUDIT_FAILURE);
-+#endif /* WITH_AUDIT */
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ }
- }
-
- /*
-@@ -619,6 +720,18 @@
- Prog, user_name, spw_dbname ());
- fail_exit (E_PW_UPDATE);
- }
-+ if (is_sub_uid && sub_uid_remove(user_name, 0, ULONG_MAX) == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot remove entry %lu from %s\n"),
-+ Prog, (unsigned long)user_id, sub_uid_dbname ());
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ if (is_sub_gid && sub_gid_remove(user_name, 0, ULONG_MAX) == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot remove entry %lu from %s\n"),
-+ Prog, (unsigned long)user_id, sub_gid_dbname ());
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
- #ifdef WITH_AUDIT
- audit_logger (AUDIT_DEL_USER, Prog,
- "deleting user entries",
-@@ -966,6 +1079,8 @@
- #ifdef SHADOWGRP
- is_shadow_grp = sgr_file_present ();
- #endif /* SHADOWGRP */
-+ is_sub_uid = sub_uid_file_present ();
-+ is_sub_gid = sub_gid_file_present ();
-
- /*
- * Start with a quick check to see if the user exists.
diff --git a/debian/patches/userns/07_userns_useradd b/debian/patches/userns/07_userns_useradd
deleted file mode 100644
index 35757e9..0000000
--- a/debian/patches/userns/07_userns_useradd
+++ /dev/null
@@ -1,285 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:19:29 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id 61652C80DB; Tue, 22 Jan 2013 09:19:29 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00
- autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id E0ABBC80F4
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:19:23 +0000 (UTC)
-Received: from out03.mta.xmission.com ([166.70.13.233])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZzB-0008QG-Kq; Tue, 22 Jan 2013 02:17:41 -0700
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZz7-0005Ui-1H; Tue, 22 Jan 2013 02:17:37 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZz4-0004tF-BP; Tue, 22 Jan 2013 02:17:36 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:17:30 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <8738xtr2z9.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX1/Jm5H2PcjgcLXEyKh9YL3DVs2WZBJhDB8=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 07/11] useradd: Add support for subordinate user identifiers
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2077
-Status: RO
-Content-Length: 6886
-Lines: 235
-
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- src/useradd.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
- 1 files changed, 140 insertions(+), 1 deletions(-)
-
-Index: shadow/src/useradd.c
-===================================================================
---- shadow.orig/src/useradd.c 2013-02-01 15:27:52.668080362 -0600
-+++ shadow/src/useradd.c 2013-02-01 15:27:52.660080362 -0600
-@@ -65,6 +65,7 @@
- #include "sgroupio.h"
- #endif
- #include "shadowio.h"
-+#include "subordinateio.h"
- #ifdef WITH_TCB
- #include "tcbfuncs.h"
- #endif
-@@ -121,12 +122,20 @@
- static bool is_shadow_grp;
- static bool sgr_locked = false;
- #endif
-+static bool is_sub_uid = false;
-+static bool is_sub_gid = false;
- static bool pw_locked = false;
- static bool gr_locked = false;
- static bool spw_locked = false;
-+static bool sub_uid_locked = false;
-+static bool sub_gid_locked = false;
- static char **user_groups; /* NULL-terminated list */
- static long sys_ngroups;
- static bool do_grp_update = false; /* group files need to be updated */
-+static uid_t sub_uid_start; /* New subordinate uid range */
-+static unsigned long sub_uid_count;
-+static gid_t sub_gid_start; /* New subordinate gid range */
-+static unsigned long sub_gid_count;
-
- static bool
- bflg = false, /* new default root of home directory */
-@@ -168,6 +177,8 @@
- #define E_GRP_UPDATE 10 /* can't update group file */
- #define E_HOMEDIR 12 /* can't create home directory */
- #define E_SE_UPDATE 14 /* can't update SELinux user mapping */
-+#define E_SUB_UID_UPDATE 16 /* can't update the subordinate uid file */
-+#define E_SUB_GID_UPDATE 18 /* can't update the subordinate gid file */
-
- #define DGROUP "GROUP="
- #define DHOME "HOME="
-@@ -268,6 +279,32 @@
- }
- }
- #endif
-+ if (sub_uid_locked) {
-+ if (sub_uid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
-+#ifdef WITH_AUDIT
-+ audit_logger (AUDIT_ADD_USER, Prog,
-+ "unlocking subodinate user file",
-+ user_name, AUDIT_NO_ID,
-+ SHADOW_AUDIT_FAILURE);
-+#endif
-+ /* continue */
-+ }
-+ }
-+ if (sub_gid_locked) {
-+ if (sub_gid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
-+#ifdef WITH_AUDIT
-+ audit_logger (AUDIT_ADD_USER, Prog,
-+ "unlocking subodinate group file",
-+ user_name, AUDIT_NO_ID,
-+ SHADOW_AUDIT_FAILURE);
-+#endif
-+ /* continue */
-+ }
-+ }
-
- #ifdef WITH_AUDIT
- audit_logger (AUDIT_ADD_USER, Prog,
-@@ -1379,6 +1416,18 @@
- }
- #endif
- }
-+ if (is_sub_uid && (sub_uid_close () == 0)) {
-+ fprintf (stderr,
-+ _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ()));
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ if (is_sub_gid && (sub_gid_close () == 0)) {
-+ fprintf (stderr,
-+ _("%s: failure while writing changes to %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_gid_dbname ()));
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
- if (is_shadow_pwd) {
- if (spw_unlock () == 0) {
- fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, spw_dbname ());
-@@ -1433,6 +1482,34 @@
- sgr_locked = false;
- }
- #endif
-+ if (is_sub_uid) {
-+ if (sub_uid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
-+#ifdef WITH_AUDIT
-+ audit_logger (AUDIT_ADD_USER, Prog,
-+ "unlocking subordinate user file",
-+ user_name, AUDIT_NO_ID,
-+ SHADOW_AUDIT_FAILURE);
-+#endif
-+ /* continue */
-+ }
-+ sub_uid_locked = false;
-+ }
-+ if (is_sub_gid) {
-+ if (sub_gid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
-+#ifdef WITH_AUDIT
-+ audit_logger (AUDIT_ADD_USER, Prog,
-+ "unlocking subordinate group file",
-+ user_name, AUDIT_NO_ID,
-+ SHADOW_AUDIT_FAILURE);
-+#endif
-+ /* continue */
-+ }
-+ sub_gid_locked = false;
-+ }
- }
-
- /*
-@@ -1487,6 +1564,36 @@
- }
- }
- #endif
-+ if (is_sub_uid) {
-+ if (sub_uid_lock () == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot lock %s; try again later.\n"),
-+ Prog, sub_uid_dbname ());
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ sub_uid_locked = true;
-+ if (sub_uid_open (O_RDWR) == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot open %s\n"),
-+ Prog, sub_uid_dbname ());
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ }
-+ if (is_sub_gid) {
-+ if (sub_gid_lock () == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot lock %s; try again later.\n"),
-+ Prog, sub_gid_dbname ());
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ sub_gid_locked = true;
-+ if (sub_gid_open (O_RDWR) == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot open %s\n"),
-+ Prog, sub_gid_dbname ());
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ }
- }
-
- static void open_shadow (void)
-@@ -1733,13 +1840,27 @@
- #endif
- fail_exit (E_PW_UPDATE);
- }
-+ if (is_sub_uid &&
-+ (sub_uid_add(user_name, sub_uid_start, sub_uid_count) == 0)) {
-+ fprintf (stderr,
-+ _("%s: failed to prepare the new %s entry\n"),
-+ Prog, sub_uid_dbname ());
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ if (is_sub_gid &&
-+ (sub_gid_add(user_name, sub_gid_start, sub_gid_count) == 0)) {
-+ fprintf (stderr,
-+ _("%s: failed to prepare the new %s entry\n"),
-+ Prog, sub_uid_dbname ());
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+
- #ifdef WITH_AUDIT
- audit_logger (AUDIT_ADD_USER, Prog,
- "adding user",
- user_name, (unsigned int) user_id,
- SHADOW_AUDIT_SUCCESS);
- #endif
--
- /*
- * Do any group file updates for this user.
- */
-@@ -1885,6 +2006,8 @@
- #ifdef SHADOWGRP
- is_shadow_grp = sgr_file_present ();
- #endif
-+ is_sub_uid = sub_uid_file_present ();
-+ is_sub_gid = sub_gid_file_present ();
-
- get_defaults ();
-
-@@ -2035,6 +2158,22 @@
- grp_add ();
- }
-
-+ if (is_sub_uid) {
-+ if (find_new_sub_uids(user_name, &sub_uid_start, &sub_uid_count) < 0) {
-+ fprintf (stderr,
-+ _("%s: can't find subordinate user range\n"),
-+ Prog);
-+ fail_exit(E_SUB_UID_UPDATE);
-+ }
-+ }
-+ if (is_sub_gid) {
-+ if (find_new_sub_gids(user_name, &sub_gid_start, &sub_gid_count) < 0) {
-+ fprintf (stderr,
-+ _("%s: can't find subordinate group range\n"),
-+ Prog);
-+ fail_exit(E_SUB_GID_UPDATE);
-+ }
-+ }
- usr_update ();
-
- if (mflg) {
diff --git a/debian/patches/userns/08_userns_detect_busy_subids b/debian/patches/userns/08_userns_detect_busy_subids
deleted file mode 100644
index 72c2862..0000000
--- a/debian/patches/userns/08_userns_detect_busy_subids
+++ /dev/null
@@ -1,133 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:19:49 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id E0EA3C80F4; Tue, 22 Jan 2013 09:19:49 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=-2.2 required=8.0 tests=BAD_ENC_HEADER,BAYES_00,
- RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id 1A2C7C80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:19:46 +0000 (UTC)
-Received: from out03.mta.xmission.com ([166.70.13.233])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZzX-00006D-G7; Tue, 22 Jan 2013 02:18:03 -0700
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZzV-0005Zh-Qq; Tue, 22 Jan 2013 02:18:02 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZzN-0004ul-H6; Tue, 22 Jan 2013 02:18:01 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:17:50 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <87y5flpoe9.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX1/ZWJZMWIVV2ekPIrRQjHLl4Oh/kdyWJUw=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 08/11] Add support for detecting busy subordinate user ids
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2078
-Status: RO
-Content-Length: 2655
-Lines: 83
-
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- libmisc/user_busy.c | 18 +++++++++++++-----
- 1 files changed, 13 insertions(+), 5 deletions(-)
-
-Index: shadow/libmisc/user_busy.c
-===================================================================
---- shadow.orig/libmisc/user_busy.c 2013-02-01 15:27:52.952080357 -0600
-+++ shadow/libmisc/user_busy.c 2013-02-01 15:27:52.948080357 -0600
-@@ -38,11 +38,13 @@
- #include <stdio.h>
- #include <sys/types.h>
- #include <dirent.h>
-+#include <fcntl.h>
- #include "defines.h"
- #include "prototypes.h"
-+#include "subordinateio.h"
-
- #ifdef __linux__
--static int check_status (const char *sname, uid_t uid);
-+static int check_status (const char *name, const char *sname, uid_t uid);
- static int user_busy_processes (const char *name, uid_t uid);
- #else /* !__linux__ */
- static int user_busy_utmp (const char *name);
-@@ -102,7 +104,7 @@
- #endif /* !__linux__ */
-
- #ifdef __linux__
--static int check_status (const char *sname, uid_t uid)
-+static int check_status (const char *name, const char *sname, uid_t uid)
- {
- /* 40: /proc/xxxxxxxxxx/task/xxxxxxxxxx/status + \0 */
- char status[40];
-@@ -125,7 +127,10 @@
- &ruid, &euid, &suid) == 3) {
- if ( (ruid == (unsigned long) uid)
- || (euid == (unsigned long) uid)
-- || (suid == (unsigned long) uid)) {
-+ || (suid == (unsigned long) uid)
-+ || have_sub_uids(name, ruid, 1)
-+ || have_sub_uids(name, euid, 1)
-+ || have_sub_uids(name, suid, 1)) {
- (void) fclose (sfile);
- return 1;
- }
-@@ -153,6 +158,8 @@
- struct stat sbroot;
- struct stat sbroot_process;
-
-+ sub_uid_open (O_RDONLY);
-+
- proc = opendir ("/proc");
- if (proc == NULL) {
- perror ("opendir /proc");
-@@ -196,7 +203,7 @@
- continue;
- }
-
-- if (check_status (tmp_d_name, uid) != 0) {
-+ if (check_status (name, tmp_d_name, uid) != 0) {
- (void) closedir (proc);
- fprintf (stderr,
- _("%s: user %s is currently used by process %d\n"),
-@@ -216,7 +223,7 @@
- if (tid == pid) {
- continue;
- }
-- if (check_status (task_path+6, uid) != 0) {
-+ if (check_status (name, task_path+6, uid) != 0) {
- (void) closedir (proc);
- fprintf (stderr,
- _("%s: user %s is currently used by process %d\n"),
-@@ -231,6 +238,7 @@
- }
-
- (void) closedir (proc);
-+ sub_uid_close();
- return 0;
- }
- #endif /* __linux__ */
diff --git a/debian/patches/userns/09_userns_usermod b/debian/patches/userns/09_userns_usermod
deleted file mode 100644
index 2fa5493..0000000
--- a/debian/patches/userns/09_userns_usermod
+++ /dev/null
@@ -1,536 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:20:27 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id 8625BC80F4; Tue, 22 Jan 2013 09:20:27 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00
- autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id 69CACC80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:20:23 +0000 (UTC)
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1Txa08-0000JL-Uo; Tue, 22 Jan 2013 02:18:41 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1TxZzw-0004wm-8g; Tue, 22 Jan 2013 02:18:40 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:18:24 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <87sj5tpodb.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX1/EkNiL4owL54HOscHbdbK8RucFTofOBo8=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 09/11] usermod: Add support for subordinate uids and gids.
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2079
-Status: O
-Content-Length: 15455
-Lines: 491
-
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- man/usermod.8.xml | 80 +++++++++++++++++
- src/usermod.c | 255 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
- 2 files changed, 332 insertions(+), 3 deletions(-)
-
-Index: shadow/man/usermod.8.xml
-===================================================================
---- shadow.orig/man/usermod.8.xml 2013-02-01 15:27:53.240080352 -0600
-+++ shadow/man/usermod.8.xml 2013-02-01 15:27:53.232080353 -0600
-@@ -391,6 +391,86 @@
- </varlistentry>
- <varlistentry>
- <term>
-+ <option>-v</option>, <option>--add-sub-uids</option>
-+ <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
-+ </term>
-+ <listitem>
-+ <para>
-+ Add a range of subordinate uids to the users account.
-+ </para>
-+ <para>
-+ This option may be specified multiple times to add multiple ranges to a users account.
-+ </para>
-+ <para>
-+ No checks will be performed with regard to
-+ <option>SUB_UID_MIN</option>, <option>SUB_UID_MAX</option>, or
-+ <option>SUB_UID_COUNT</option> from /etc/login.defs.
-+ </para>
-+ </listitem>
-+ </varlistentry>
-+ <varlistentry>
-+ <term>
-+ <option>-V</option>, <option>--del-sub-uids</option>
-+ <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
-+ </term>
-+ <listitem>
-+ <para>
-+ Remove a range of subordinate uids from the users account.
-+ </para>
-+ <para>
-+ This option may be specified multiple times to remove multiple ranges to a users account.
-+ When both <option>--del-sub-uids</option> and <option>--add-sub-uids</option> are specified
-+ remove of all subordinate uid ranges happens before any subordinate uid ranges are added.
-+ </para>
-+ <para>
-+ No checks will be performed with regard to
-+ <option>SUB_UID_MIN</option>, <option>SUB_UID_MAX</option>, or
-+ <option>SUB_UID_COUNT</option> from /etc/login.defs.
-+ </para>
-+ </listitem>
-+ </varlistentry>
-+ <varlistentry>
-+ <term>
-+ <option>-w</option>, <option>--add-sub-gids</option>
-+ <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
-+ </term>
-+ <listitem>
-+ <para>
-+ Add a range of subordinate gids to the users account.
-+ </para>
-+ <para>
-+ This option may be specified multiple times to add multiple ranges to a users account.
-+ </para>
-+ <para>
-+ No checks will be performed with regard to
-+ <option>SUB_GID_MIN</option>, <option>SUB_GID_MAX</option>, or
-+ <option>SUB_GID_COUNT</option> from /etc/login.defs.
-+ </para>
-+ </listitem>
-+ </varlistentry>
-+ <varlistentry>
-+ <term>
-+ <option>-W</option>, <option>--del-sub-gids</option>
-+ <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
-+ </term>
-+ <listitem>
-+ <para>
-+ Remove a range of subordinate gids from the users account.
-+ </para>
-+ <para>
-+ This option may be specified multiple times to remove multiple ranges to a users account.
-+ When both <option>--del-sub-gids</option> and <option>--add-sub-gids</option> are specified
-+ remove of all subordinate gid ranges happens before any subordinate gid ranges are added.
-+ </para>
-+ <para>
-+ No checks will be performed with regard to
-+ <option>SUB_GID_MIN</option>, <option>SUB_GID_MAX</option>, or
-+ <option>SUB_GID_COUNT</option> from /etc/login.defs.
-+ </para>
-+ </listitem>
-+ </varlistentry>
-+ <varlistentry>
-+ <term>
- <option>-Z</option>, <option>--selinux-user</option>
- <replaceable>SEUSER</replaceable>
- </term>
-Index: shadow/src/usermod.c
-===================================================================
---- shadow.orig/src/usermod.c 2013-02-01 15:27:53.240080352 -0600
-+++ shadow/src/usermod.c 2013-02-01 15:27:53.236080353 -0600
-@@ -63,6 +63,7 @@
- #include "sgroupio.h"
- #endif
- #include "shadowio.h"
-+#include "subordinateio.h"
- #ifdef WITH_TCB
- #include "tcbfuncs.h"
- #endif
-@@ -86,6 +87,8 @@
- /* #define E_NOSPACE 11 insufficient space to move home dir */
- #define E_HOMEDIR 12 /* unable to complete home dir move */
- #define E_SE_UPDATE 13 /* can't update SELinux user mapping */
-+#define E_SUB_UID_UPDATE 16 /* can't update the subordinate uid file */
-+#define E_SUB_GID_UPDATE 18 /* can't update the subordinate gid file */
- #define VALID(s) (strcspn (s, ":\n") == strlen (s))
- /*
- * Global variables
-@@ -133,7 +136,11 @@
- Zflg = false, /* new selinux user */
- #endif
- uflg = false, /* specify new user ID */
-- Uflg = false; /* unlock the password */
-+ Uflg = false, /* unlock the password */
-+ vflg = false, /* add subordinate uids */
-+ Vflg = false, /* delete subordinate uids */
-+ wflg = false, /* add subordinate gids */
-+ Wflg = false; /* delete subordinate gids */
-
- static bool is_shadow_pwd;
-
-@@ -141,12 +148,17 @@
- static bool is_shadow_grp;
- #endif
-
-+static bool is_sub_uid = false;
-+static bool is_sub_gid = false;
-+
- static bool pw_locked = false;
- static bool spw_locked = false;
- static bool gr_locked = false;
- #ifdef SHADOWGRP
- static bool sgr_locked = false;
- #endif
-+static bool sub_uid_locked = false;
-+static bool sub_gid_locked = false;
-
-
- /* local function prototypes */
-@@ -302,6 +314,69 @@
- return 0;
- }
-
-+struct ulong_range
-+{
-+ unsigned long first;
-+ unsigned long last;
-+};
-+
-+static struct ulong_range getulong_range(const char *str)
-+{
-+ struct ulong_range result = { .first = ULONG_MAX, .last = 0 };
-+ unsigned long long first, last;
-+ char *pos;
-+
-+ errno = 0;
-+ first = strtoll(str, &pos, 10);
-+ if (('\0' == *str) || ('-' != *pos ) || (ERANGE == errno) ||
-+ (first != (unsigned long int)first))
-+ goto out;
-+
-+ errno = 0;
-+ last = strtoul(pos + 1, &pos, 10);
-+ if (('\0' != *pos ) || (ERANGE == errno) ||
-+ (last != (unsigned long int)last))
-+ goto out;
-+
-+ if (first > last)
-+ goto out;
-+
-+ result.first = (unsigned long int)first;
-+ result.last = (unsigned long int)last;
-+out:
-+ return result;
-+
-+}
-+
-+struct ulong_range_list_entry {
-+ struct ulong_range_list_entry *next;
-+ struct ulong_range range;
-+};
-+
-+static struct ulong_range_list_entry *add_sub_uids = NULL, *del_sub_uids = NULL;
-+static struct ulong_range_list_entry *add_sub_gids = NULL, *del_sub_gids = NULL;
-+
-+static int prepend_range(const char *str, struct ulong_range_list_entry **head)
-+{
-+ struct ulong_range range;
-+ struct ulong_range_list_entry *entry;
-+ range = getulong_range(str);
-+ if (range.first > range.last)
-+ return 0;
-+
-+ entry = malloc(sizeof(*entry));
-+ if (!entry) {
-+ fprintf (stderr,
-+ _("%s: failed to allocate memory: %s\n"),
-+ Prog, strerror (errno));
-+ return 0;
-+ }
-+ entry->next = *head;
-+ entry->range = range;
-+ *head = entry;
-+ return 1;
-+}
-+
- /*
- * usage - display usage message and exit
- */
-@@ -334,6 +409,10 @@
- (void) fputs (_(" -s, --shell SHELL new login shell for the user account\n"), usageout);
- (void) fputs (_(" -u, --uid UID new UID for the user account\n"), usageout);
- (void) fputs (_(" -U, --unlock unlock the user account\n"), usageout);
-+ (void) fputs (_(" -v, --add-subuids FIRST-LAST add range of subordinate uids\n"), usageout);
-+ (void) fputs (_(" -V, --del-subuids FIRST-LAST remvoe range of subordinate uids\n"), usageout);
-+ (void) fputs (_(" -w, --add-subgids FIRST-LAST add range of subordinate gids\n"), usageout);
-+ (void) fputs (_(" -W, --del-subgids FIRST-LAST remvoe range of subordinate gids\n"), usageout);
- #ifdef WITH_SELINUX
- (void) fputs (_(" -Z, --selinux-user SEUSER new SELinux user mapping for the user account\n"), usageout);
- #endif /* WITH_SELINUX */
-@@ -590,6 +669,20 @@
- /* continue */
- }
- }
-+ if (sub_uid_locked) {
-+ if (sub_uid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
-+ /* continue */
-+ }
-+ }
-+ if (sub_gid_locked) {
-+ if (sub_gid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
-+ /* continue */
-+ }
-+ }
-
- #ifdef WITH_AUDIT
- audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
-@@ -889,6 +982,10 @@
- {"shell", required_argument, NULL, 's'},
- {"uid", required_argument, NULL, 'u'},
- {"unlock", no_argument, NULL, 'U'},
-+ {"add-subuids", required_argument, NULL, 'v'},
-+ {"del-subuids", required_argument, NULL, 'V'},
-+ {"add-subgids", required_argument, NULL, 'w'},
-+ {"del-subgids", required_argument, NULL, 'W'},
- #ifdef WITH_SELINUX
- {"selinux-user", required_argument, NULL, 'Z'},
- #endif /* WITH_SELINUX */
-@@ -1018,6 +1115,41 @@
- case 'U':
- Uflg = true;
- break;
-+ case 'v':
-+ if (prepend_range (optarg, &add_sub_uids) == 0) {
-+ fprintf (stderr,
-+ _("%s: invalid subordinate uid range '%s'\n"),
-+ Prog, optarg);
-+ exit(E_BAD_ARG);
-+ }
-+ vflg = true;
-+ break;
-+ case 'V':
-+ if (prepend_range (optarg, &del_sub_uids) == 0) {
-+ fprintf (stderr,
-+ _("%s: invalid subordinate uid range '%s'\n"),
-+ Prog, optarg);
-+ exit(E_BAD_ARG);
-+ }
-+ Vflg = true;
-+ break;
-+ case 'w':
-+ if (prepend_range (optarg, &add_sub_gids) == 0) {
-+ fprintf (stderr,
-+ _("%s: invalid subordinate gid range '%s'\n"),
-+ Prog, optarg);
-+ exit(E_BAD_ARG);
-+ }
-+ wflg = true;
-+ case 'W':
-+ if (prepend_range (optarg, &del_sub_gids) == 0) {
-+ fprintf (stderr,
-+ _("%s: invalid subordinate gid range '%s'\n"),
-+ Prog, optarg);
-+ exit(E_BAD_ARG);
-+ }
-+ Wflg = true;
-+ break;
- #ifdef WITH_SELINUX
- case 'Z':
- if (is_selinux_enabled () > 0) {
-@@ -1170,6 +1302,7 @@
-
- if (!(Uflg || uflg || sflg || pflg || mflg || Lflg ||
- lflg || Gflg || gflg || fflg || eflg || dflg || cflg
-+ || vflg || Vflg || wflg || Wflg
- #ifdef WITH_SELINUX
- || Zflg
- #endif /* WITH_SELINUX */
-@@ -1200,6 +1333,7 @@
- Prog, (unsigned long) user_newid);
- exit (E_UID_IN_USE);
- }
-+
- }
-
- /*
-@@ -1248,6 +1382,10 @@
- sgr_dbname ()));
- fail_exit (E_GRP_UPDATE);
- }
-+ }
-+#endif
-+#ifdef SHADOWGRP
-+ if (is_shadow_grp) {
- if (sgr_unlock () == 0) {
- fprintf (stderr,
- _("%s: failed to unlock %s\n"),
-@@ -1296,6 +1434,33 @@
- sgr_locked = false;
- #endif
-
-+ if (vflg || Vflg) {
-+ if (!is_sub_uid || (sub_uid_close () == 0)) {
-+ fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ()));
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ if (!is_sub_uid || (sub_uid_unlock () == 0)) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
-+ /* continue */
-+ }
-+ sub_uid_locked = false;
-+ }
-+ if (wflg || Wflg) {
-+ if (!is_sub_gid || (sub_gid_close () == 0)) {
-+ fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_gid_dbname ()));
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ if (!is_sub_gid || (sub_gid_unlock () == 0)) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
-+ /* continue */
-+ }
-+ sub_gid_locked = false;
-+ }
-+
- /*
- * Close the DBM and/or flat files
- */
-@@ -1375,6 +1540,36 @@
- }
- #endif
- }
-+ if (vflg || Vflg) {
-+ if (!is_sub_uid || (sub_uid_lock () == 0)) {
-+ fprintf (stderr,
-+ _("%s: cannot lock %s; try again later.\n"),
-+ Prog, sub_uid_dbname ());
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ sub_uid_locked = true;
-+ if (!is_sub_uid || (sub_uid_open (O_RDWR) == 0)) {
-+ fprintf (stderr,
-+ _("%s: cannot open %s\n"),
-+ Prog, sub_uid_dbname ());
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ }
-+ if (wflg || Wflg) {
-+ if (!is_sub_gid || (sub_gid_lock () == 0)) {
-+ fprintf (stderr,
-+ _("%s: cannot lock %s; try again later.\n"),
-+ Prog, sub_gid_dbname ());
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ sub_gid_locked = true;
-+ if (!is_sub_gid || (sub_gid_open (O_RDWR) == 0)) {
-+ fprintf (stderr,
-+ _("%s: cannot open %s\n"),
-+ Prog, sub_gid_dbname ());
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ }
- }
-
- /*
-@@ -1476,6 +1671,58 @@
- fail_exit (E_PW_UPDATE);
- }
- }
-+ if (Vflg) {
-+ struct ulong_range_list_entry *ptr;
-+ for (ptr = del_sub_uids; ptr != NULL; ptr = ptr->next) {
-+ unsigned long count = ptr->range.last - ptr->range.first + 1;
-+ if (sub_uid_remove(user_name, ptr->range.first, count) == 0) {
-+ fprintf (stderr,
-+ _("%s: failed to remove uid range %lu-%lu from '%s'\n"),
-+ Prog, ptr->range.first, ptr->range.last,
-+ sub_uid_dbname ());
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ }
-+ }
-+ if (vflg) {
-+ struct ulong_range_list_entry *ptr;
-+ for (ptr = add_sub_uids; ptr != NULL; ptr = ptr->next) {
-+ unsigned long count = ptr->range.last - ptr->range.first + 1;
-+ if (sub_uid_add(user_name, ptr->range.first, count) == 0) {
-+ fprintf (stderr,
-+ _("%s: failed to add uid range %lu-%lu from '%s'\n"),
-+ Prog, ptr->range.first, ptr->range.last,
-+ sub_uid_dbname ());
-+ fail_exit (E_SUB_UID_UPDATE);
-+ }
-+ }
-+ }
-+ if (Wflg) {
-+ struct ulong_range_list_entry *ptr;
-+ for (ptr = del_sub_gids; ptr != NULL; ptr = ptr->next) {
-+ unsigned long count = ptr->range.last - ptr->range.first + 1;
-+ if (sub_gid_remove(user_name, ptr->range.first, count) == 0) {
-+ fprintf (stderr,
-+ _("%s: failed to remove gid range %lu-%lu from '%s'\n"),
-+ Prog, ptr->range.first, ptr->range.last,
-+ sub_gid_dbname ());
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ }
-+ }
-+ if (wflg) {
-+ struct ulong_range_list_entry *ptr;
-+ for (ptr = add_sub_gids; ptr != NULL; ptr = ptr->next) {
-+ unsigned long count = ptr->range.last - ptr->range.first + 1;
-+ if (sub_gid_add(user_name, ptr->range.first, count) == 0) {
-+ fprintf (stderr,
-+ _("%s: failed to add gid range %lu-%lu from '%s'\n"),
-+ Prog, ptr->range.first, ptr->range.last,
-+ sub_gid_dbname ());
-+ fail_exit (E_SUB_GID_UPDATE);
-+ }
-+ }
-+ }
- }
-
- /*
-@@ -1811,6 +2058,8 @@
- #ifdef SHADOWGRP
- is_shadow_grp = sgr_file_present ();
- #endif
-+ is_sub_uid = sub_uid_file_present ();
-+ is_sub_gid = sub_gid_file_present ();
-
- process_flags (argc, argv);
-
-@@ -1818,7 +2067,7 @@
- * The home directory, the username and the user's UID should not
- * be changed while the user is logged in.
- */
-- if ( (uflg || lflg || dflg)
-+ if ( (uflg || lflg || dflg || Vflg || Wflg)
- && (user_busy (user_name, user_id) != 0)) {
- exit (E_USER_BUSY);
- }
-@@ -1871,7 +2120,7 @@
- */
- open_files ();
- if ( cflg || dflg || eflg || fflg || gflg || Lflg || lflg || pflg
-- || sflg || uflg || Uflg) {
-+ || sflg || uflg || Uflg || vflg || Vflg || wflg || Wflg) {
- usr_update ();
- }
- if (Gflg || lflg) {
diff --git a/debian/patches/userns/10_userns_newusers b/debian/patches/userns/10_userns_newusers
deleted file mode 100644
index 8072cf7..0000000
--- a/debian/patches/userns/10_userns_newusers
+++ /dev/null
@@ -1,256 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:21:21 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id ADE59C80F5; Tue, 22 Jan 2013 09:21:21 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=-2.2 required=8.0 tests=BAD_ENC_HEADER,BAYES_00,
- RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id D56AEC80DB
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:21:17 +0000 (UTC)
-Received: from out03.mta.xmission.com ([166.70.13.233])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1Txa11-0000bo-MQ; Tue, 22 Jan 2013 02:19:35 -0700
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1Txa11-0005wx-1p; Tue, 22 Jan 2013 02:19:35 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1Txa0y-000519-2O; Tue, 22 Jan 2013 02:19:34 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:19:28 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <87k3r5pobj.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX1+qhualZ5pxk+DVqanIJA7JrJwlPXicL8c=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 10/11] newusers: Add support for assiging subordinate uids and gids.
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2080
-Status: O
-Content-Length: 5597
-Lines: 206
-
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- src/newusers.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 1 files changed, 124 insertions(+), 0 deletions(-)
-
-Index: shadow/src/newusers.c
-===================================================================
---- shadow.orig/src/newusers.c 2013-02-01 15:27:53.548080347 -0600
-+++ shadow/src/newusers.c 2013-02-01 15:27:53.540080347 -0600
-@@ -65,6 +65,7 @@
- #include "pwio.h"
- #include "sgroupio.h"
- #include "shadowio.h"
-+#include "subordinateio.h"
- #include "chkname.h"
-
- /*
-@@ -82,6 +83,8 @@
- #endif /* USE_SHA_CRYPT */
- #endif /* !USE_PAM */
-
-+static bool is_sub_uid = false;
-+static bool is_sub_gid = false;
- static bool is_shadow;
- #ifdef SHADOWGRP
- static bool is_shadow_grp;
-@@ -90,6 +93,8 @@
- static bool pw_locked = false;
- static bool gr_locked = false;
- static bool spw_locked = false;
-+static bool sub_uid_locked = false;
-+static bool sub_gid_locked = false;
-
- /* local function prototypes */
- static void usage (int status);
-@@ -178,6 +183,20 @@
- }
- }
- #endif
-+ if (sub_uid_locked) {
-+ if (sub_uid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
-+ /* continue */
-+ }
-+ }
-+ if (sub_gid_locked) {
-+ if (sub_gid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
-+ /* continue */
-+ }
-+ }
-
- exit (code);
- }
-@@ -732,6 +751,24 @@
- sgr_locked = true;
- }
- #endif
-+ if (is_sub_uid) {
-+ if (sub_uid_lock () == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot lock %s; try again later.\n"),
-+ Prog, sub_uid_dbname ());
-+ fail_exit (EXIT_FAILURE);
-+ }
-+ sub_uid_locked = true;
-+ }
-+ if (is_sub_gid) {
-+ if (sub_gid_lock () == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot lock %s; try again later.\n"),
-+ Prog, sub_gid_dbname ());
-+ fail_exit (EXIT_FAILURE);
-+ }
-+ sub_gid_locked = true;
-+ }
-
- if (pw_open (O_RDWR) == 0) {
- fprintf (stderr, _("%s: cannot open %s\n"), Prog, pw_dbname ());
-@@ -751,6 +788,22 @@
- fail_exit (EXIT_FAILURE);
- }
- #endif
-+ if (is_sub_uid) {
-+ if (sub_uid_open (O_RDWR) == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot open %s\n"),
-+ Prog, sub_uid_dbname ());
-+ fail_exit (EXIT_FAILURE);
-+ }
-+ }
-+ if (is_sub_gid) {
-+ if (sub_gid_open (O_RDWR) == 0) {
-+ fprintf (stderr,
-+ _("%s: cannot open %s\n"),
-+ Prog, sub_gid_dbname ());
-+ fail_exit (EXIT_FAILURE);
-+ }
-+ }
- }
-
- /*
-@@ -795,6 +848,19 @@
- SYSLOG ((LOG_ERR, "failure while writing changes to %s", gr_dbname ()));
- fail_exit (EXIT_FAILURE);
- }
-+ if (is_sub_uid && (sub_uid_close () == 0)) {
-+ fprintf (stderr,
-+ _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ()));
-+ fail_exit (EXIT_FAILURE);
-+ }
-+ if (is_sub_gid && (sub_gid_close () == 0)) {
-+ fprintf (stderr,
-+ _("%s: failure while writing changes to %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_gid_dbname ()));
-+ fail_exit (EXIT_FAILURE);
-+ }
-+
- if (gr_unlock () == 0) {
- fprintf (stderr,
- _("%s: failed to unlock %s\n"),
-@@ -823,6 +889,22 @@
- sgr_locked = false;
- }
- #endif
-+ if (is_sub_uid) {
-+ if (sub_uid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ()));
-+ /* continue */
-+ }
-+ sub_uid_locked = false;
-+ }
-+ if (is_sub_gid) {
-+ if (sub_gid_unlock () == 0) {
-+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ());
-+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ()));
-+ /* continue */
-+ }
-+ sub_gid_locked = false;
-+ }
- }
-
- int main (int argc, char **argv)
-@@ -864,6 +946,8 @@
- #ifdef SHADOWGRP
- is_shadow_grp = sgr_file_present ();
- #endif
-+ is_sub_uid = sub_uid_file_present ();
-+ is_sub_gid = sub_gid_file_present ();
-
- open_files ();
-
-@@ -1044,6 +1128,46 @@
- errors++;
- continue;
- }
-+
-+ /*
-+ * Add subordinate uids if the user does not have them.
-+ */
-+ if (is_sub_uid && !sub_uid_assigned(fields[0])) {
-+ uid_t sub_uid_start = 0;
-+ unsigned long sub_uid_count = 0;
-+ if (find_new_sub_uids(fields[0], &sub_uid_start, &sub_uid_count) == 0) {
-+ if (sub_uid_add(fields[0], sub_uid_start, sub_uid_count) == 0) {
-+ fprintf (stderr,
-+ _("%s: failed to prepare new %s entry\n"),
-+ Prog, sub_uid_dbname ());
-+ }
-+ } else {
-+ fprintf (stderr,
-+ _("%s: can't find subordinate user range\n"),
-+ Prog);
-+ errors++;
-+ }
-+ }
-+
-+ /*
-+ * Add subordinate gids if the user does not have them.
-+ */
-+ if (is_sub_gid && !sub_gid_assigned(fields[0])) {
-+ gid_t sub_gid_start = 0;
-+ unsigned long sub_gid_count = 0;
-+ if (find_new_sub_gids(fields[0], &sub_gid_start, &sub_gid_count) == 0) {
-+ if (sub_gid_add(fields[0], sub_gid_start, sub_gid_count) == 0) {
-+ fprintf (stderr,
-+ _("%s: failed to prepare new %s entry\n"),
-+ Prog, sub_uid_dbname ());
-+ }
-+ } else {
-+ fprintf (stderr,
-+ _("%s: can't find subordinate group range\n"),
-+ Prog);
-+ errors++;
-+ }
-+ }
- }
-
- /*
diff --git a/debian/patches/userns/11_userns_newxidmap b/debian/patches/userns/11_userns_newxidmap
deleted file mode 100644
index f4e6a19..0000000
--- a/debian/patches/userns/11_userns_newxidmap
+++ /dev/null
@@ -1,1004 +0,0 @@
-From ebiederm at xmission.com Tue Jan 22 09:22:07 2013
-Return-Path: <ebiederm at xmission.com>
-X-Original-To: serge at hallyn.com
-Delivered-To: serge at hallyn.com
-Received: by mail.hallyn.com (Postfix, from userid 5001)
- id E5D16C80F4; Tue, 22 Jan 2013 09:22:07 +0000 (UTC)
-X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail
-X-Spam-Level:
-X-Spam-Status: No, score=-0.2 required=8.0 tests=BAD_ENC_HEADER,BAYES_00,
- LONGWORDS,RCVD_IN_DNSWL_MED autolearn=no version=3.3.1
-Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232])
- (using TLSv1 with cipher AES256-SHA (256/256 bits))
- (No client certificate requested)
- by mail.hallyn.com (Postfix) with ESMTPS id 2E206C80D1
- for <serge at hallyn.com>; Tue, 22 Jan 2013 09:22:03 +0000 (UTC)
-Received: from in02.mta.xmission.com ([166.70.13.52])
- by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1Txa1k-0000xE-Ix; Tue, 22 Jan 2013 02:20:20 -0700
-Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com)
- by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16)
- (Exim 4.76)
- (envelope-from <ebiederm at xmission.com>)
- id 1Txa1b-00059T-Lu; Tue, 22 Jan 2013 02:20:20 -0700
-From: ebiederm at xmission.com (Eric W. Biederman)
-To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= <nicolas.francois at centraliens.net>
-Cc: <Pkg-shadow-devel at lists.alioth.debian.org>, Linux Containers <containers at lists.linux-foundation.org>, "Michael Kerrisk \(man-pages\)" <mtk.manpages at gmail.com>, "Serge E. Hallyn" <serge at hallyn.com>
-References: <87d2wxshu0.fsf at xmission.com>
-Date: Tue, 22 Jan 2013 01:20:07 -0800
-In-Reply-To: <87d2wxshu0.fsf at xmission.com> (Eric W. Biederman's message of
- "Tue, 22 Jan 2013 01:11:19 -0800")
-Message-ID: <87ehhdpoag.fsf at xmission.com>
-User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)
-MIME-Version: 1.0
-Content-Type: text/plain
-X-XM-AID: U2FsdGVkX1/nox3f5bDq7zL9eOiGra/HoCkv7o07HDs=
-X-SA-Exim-Connect-IP: 98.207.153.68
-X-SA-Exim-Mail-From: ebiederm at xmission.com
-Subject: [PATCH 11/11] newuidmap,newgidmap: New suid helpers for using subordinate uids and gids
-X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700)
-X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com)
-X-UID: 2081
-Status: RO
-Content-Length: 31344
-Lines: 965
-
-
-Signed-off-by: "Eric W. Biederman" <ebiederm at xmission.com>
----
- libmisc/Makefile.am | 2 +
- libmisc/idmapping.c | 126 +++++++++++++++++++++++++++++++++++
- libmisc/idmapping.h | 44 ++++++++++++
- man/Makefile.am | 4 +
- man/newgidmap.1.xml | 157 +++++++++++++++++++++++++++++++++++++++++++
- man/newuidmap.1.xml | 154 +++++++++++++++++++++++++++++++++++++++++++
- src/Makefile.am | 5 +-
- src/newgidmap.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++
- src/newuidmap.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++
- 9 files changed, 856 insertions(+), 2 deletions(-)
- create mode 100644 libmisc/idmapping.c
- create mode 100644 libmisc/idmapping.h
- create mode 100644 man/newgidmap.1.xml
- create mode 100644 man/newuidmap.1.xml
- create mode 100644 src/newgidmap.c
- create mode 100644 src/newuidmap.c
-
-Index: shadow/libmisc/Makefile.am
-===================================================================
---- shadow.orig/libmisc/Makefile.am 2013-02-01 15:27:53.836080342 -0600
-+++ shadow/libmisc/Makefile.am 2013-02-01 15:27:53.828080343 -0600
-@@ -32,6 +32,8 @@
- getgr_nam_gid.c \
- getrange.c \
- hushed.c \
-+ idmapping.h \
-+ idmapping.c \
- isexpired.c \
- limits.c \
- list.c log.c \
-Index: shadow/libmisc/idmapping.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/libmisc/idmapping.c 2013-02-01 15:27:53.828080343 -0600
-@@ -0,0 +1,126 @@
-+/*
-+ * Copyright (c) 2013 Eric Biederman
-+ * All rights reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. The name of the copyright holders or contributors may not be used to
-+ * endorse or promote products derived from this software without
-+ * specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#include <config.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include <limits.h>
-+#include <stdlib.h>
-+#include "prototypes.h"
-+#include "idmapping.h"
-+
-+struct map_range *get_map_ranges(int ranges, int argc, char **argv)
-+{
-+ struct map_range *mappings, *mapping;
-+ int idx, argidx;
-+
-+ if ((ranges * 3) > argc) {
-+ fprintf(stderr, "ranges: %u argc: %d\n",
-+ ranges, argc);
-+ fprintf(stderr,
-+ _( "%s: Not enough arguments to form %u mappings\n"),
-+ Prog, ranges);
-+ return NULL;
-+ }
-+
-+ mappings = calloc(ranges, sizeof(*mappings));
-+ if (!mappings) {
-+ fprintf(stderr, _( "%s: Memory allocation failure\n"),
-+ Prog);
-+ exit(EXIT_FAILURE);
-+ }
-+
-+ /* Gather up the ranges from the command line */
-+ mapping = mappings;
-+ for (idx = 0; idx < ranges; idx++, argidx += 3, mapping++) {
-+ if (!getulong(argv[argidx + 0], &mapping->upper))
-+ return NULL;
-+ if (!getulong(argv[argidx + 1], &mapping->lower))
-+ return NULL;
-+ if (!getulong(argv[argidx + 2], &mapping->count))
-+ return NULL;
-+ }
-+ return mappings;
-+}
-+
-+/* Number of ascii digits needed to print any unsigned long in decimal.
-+ * There are approximately 10 bits for every 3 decimal digits.
-+ * So from bits to digits the formula is roundup((Number of bits)/10) * 3.
-+ * For common sizes of integers this works out to:
-+ * 2bytes --> 6 ascii estimate -> 65536 (5 real)
-+ * 4bytes --> 12 ascii estimated -> 4294967296 (10 real)
-+ * 8bytes --> 21 ascii estimated -> 18446744073709551616 (20 real)
-+ * 16bytes --> 39 ascii estimated -> 340282366920938463463374607431768211456 (39 real)
-+ */
-+#define ULONG_DIGITS ((((sizeof(unsigned long) * CHAR_BIT) + 9)/10)*3)
-+
-+
-+void write_mapping(int proc_dir_fd, int ranges, struct map_range *mappings,
-+ const char *map_file)
-+{
-+ int idx;
-+ struct map_range *mapping;
-+ size_t bufsize;
-+ char *buf, *pos;
-+ int fd;
-+
-+ bufsize = ranges * ((ULONG_DIGITS + 1) * 3);
-+ pos = buf = xmalloc(bufsize);
-+
-+ /* Build the mapping command */
-+ mapping = mappings;
-+ for (idx = 0; idx < ranges; idx++, mapping++) {
-+ /* Append this range to the string that will be written */
-+ int written = snprintf(pos, bufsize - (pos - buf),
-+ "%lu %lu %lu\n",
-+ mapping->upper,
-+ mapping->lower,
-+ mapping->count);
-+ if ((written <= 0) || (written >= (bufsize - (pos - buf)))) {
-+ fprintf(stderr, _("%s: snprintf failed!\n"), Prog);
-+ exit(EXIT_FAILURE);
-+ }
-+ pos += written;
-+ }
-+
-+ /* Write the mapping to the maping file */
-+ fd = openat(proc_dir_fd, map_file, O_WRONLY);
-+ if (fd < 0) {
-+ fprintf(stderr, _("%s: open of %s failed: %s\n"),
-+ Prog, map_file, strerror(errno));
-+ exit(EXIT_FAILURE);
-+ }
-+ if (write(fd, buf, pos - buf) != (pos - buf)) {
-+ fprintf(stderr, _("%s: write to %s failed: %s\n"),
-+ Prog, map_file, strerror(errno));
-+ exit(EXIT_FAILURE);
-+ }
-+ close(fd);
-+}
-Index: shadow/libmisc/idmapping.h
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/libmisc/idmapping.h 2013-02-01 15:27:53.828080343 -0600
-@@ -0,0 +1,44 @@
-+/*
-+ * Copyright (c) 2013 Eric Biederman
-+ * All rights reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. The name of the copyright holders or contributors may not be used to
-+ * endorse or promote products derived from this software without
-+ * specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#ifndef _IDMAPPING_H_
-+#define _IDMAPPING_H_
-+
-+struct map_range {
-+ unsigned long upper;
-+ unsigned long lower;
-+ unsigned long count;
-+};
-+
-+extern struct map_range *get_map_ranges(int ranges, int argc, char **argv);
-+extern void write_mapping(int proc_dir_fd, int ranges,
-+ struct map_range *mappings, const char *map_file);
-+
-+#endif /* _ID_MAPPING_H_ */
-+
-Index: shadow/man/Makefile.am
-===================================================================
---- shadow.orig/man/Makefile.am 2013-02-01 15:27:53.836080342 -0600
-+++ shadow/man/Makefile.am 2013-02-01 15:27:53.828080343 -0600
-@@ -30,7 +30,9 @@
- man1/login.1 \
- man5/login.defs.5 \
- man8/logoutd.8 \
-+ man1/newgidmap.1 \
- man1/newgrp.1 \
-+ man1/newuidmap.1 \
- man8/newusers.8 \
- man8/nologin.8 \
- man1/passwd.1 \
-@@ -83,7 +85,9 @@
- login.access.5.xml \
- login.defs.5.xml \
- logoutd.8.xml \
-+ newgidmap.1.xml \
- newgrp.1.xml \
-+ newuidmap.1.xml \
- newusers.8.xml \
- nologin.8.xml \
- passwd.1.xml \
-Index: shadow/man/newgidmap.1.xml
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/man/newgidmap.1.xml 2013-02-01 15:27:53.828080343 -0600
-@@ -0,0 +1,157 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+<!--
-+ Copyright (c) 2013 Eric W. Biederman
-+ All rights reserved.
-+
-+ Redistribution and use in source and binary forms, with or without
-+ modification, are permitted provided that the following conditions
-+ are met:
-+ 1. Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ 2. Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ 3. The name of the copyright holders or contributors may not be used to
-+ endorse or promote products derived from this software without
-+ specific prior written permission.
-+
-+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+-->
-+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.5//EN"
-+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-+<!-- SHADOW-CONFIG-HERE -->
-+]>
-+
-+<refentry id='newgidmap.1'>
-+ <refmeta>
-+ <refentrytitle>newgidmap</refentrytitle>
-+ <manvolnum>1</manvolnum>
-+ <refmiscinfo class="sectdesc">User Commands</refmiscinfo>
-+ <refmiscinfo class="source">shadow-utils</refmiscinfo>
-+ <refmiscinfo class="version">&SHADOW_UTILS_VERSION;</refmiscinfo>
-+ </refmeta>
-+ <refnamediv id='name'>
-+ <refname>newgidmap</refname>
-+ <refpurpose>set the gid mapping of a user namespace</refpurpose>
-+ </refnamediv>
-+
-+ <refsynopsisdiv id='synopsis'>
-+ <cmdsynopsis>
-+ <command>newgidmap</command>
-+ <arg choice='plain'>
-+ <replaceable>pid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>gid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>lowergid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>count</replaceable>
-+ </arg>
-+ <arg choice='opt'>
-+ <arg choice='plain'>
-+ <replaceable>pid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>gid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>lowergid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>count</replaceable>
-+ </arg>
-+ <arg choice='opt'>
-+ <replaceable>...</replaceable>
-+ </arg>
-+ </arg>
-+ </cmdsynopsis>
-+ </refsynopsisdiv>
-+
-+ <refsect1 id='description'>
-+ <title>DESCRIPTION</title>
-+ <para>
-+ The <command>newgidmap</command> sets <filename>/proc/[pid]/gid_map</filename> based on it's
-+ command line arguments and the gids allowed in <filename>/etc/subgid</filename>.
-+ </para>
-+
-+ </refsect1>
-+
-+ <refsect1 id='options'>
-+ <title>OPTIONS</title>
-+ <para>
-+ There currently are no options to the <command>newgidmap</command> command.
-+ </para>
-+ <variablelist remap='IP'>
-+ </variablelist>
-+ </refsect1>
-+
-+ <refsect1 id='note'>
-+ <title>NOTE</title>
-+ <para>
-+ The only restriction placed on the login shell is that the command
-+ name must be listed in <filename>/etc/shells</filename>, unless the
-+ invoker is the superuser, and then any value may be added. An
-+ account with a restricted login shell may not change her login shell.
-+ For this reason, placing <filename>/bin/rsh</filename> in
-+ <filename>/etc/shells</filename> is discouraged since accidentally
-+ changing to a restricted shell would prevent the user from ever
-+ changing her login shell back to its original value.
-+ </para>
-+ </refsect1>
-+
-+
-+ <refsect1 id='files'>
-+ <title>FILES</title>
-+ <variablelist>
-+ <varlistentry>
-+ <term><filename>/etc/subgid</filename></term>
-+ <listitem>
-+ <para>List of users subordinate user IDs.</para>
-+ </listitem>
-+ </varlistentry>
-+ <varlistentry>
-+ <term><filename>/proc/[pid]/gid_map</filename></term>
-+ <listitem>
-+ <para>Mapping of gids from one between user namespaces.</para>
-+ </listitem>
-+ </varlistentry>
-+ </variablelist>
-+ </refsect1>
-+
-+ <refsect1 id='see_also'>
-+ <title>SEE ALSO</title>
-+ <para>
-+ <citerefentry>
-+ <refentrytitle>login.defs</refentrytitle><manvolnum>5</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>useradd</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>usermod</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>newusers</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>userdel</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>subgid</refentrytitle><manvolnum>5</manvolnum>
-+ </citerefentry>.
-+ </para>
-+ </refsect1>
-+</refentry>
-Index: shadow/man/newuidmap.1.xml
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/man/newuidmap.1.xml 2013-02-01 15:27:53.828080343 -0600
-@@ -0,0 +1,154 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+<!--
-+ Copyright (c) 2013 Eric W. Biederman
-+ All rights reserved.
-+
-+ Redistribution and use in source and binary forms, with or without
-+ modification, are permitted provided that the following conditions
-+ are met:
-+ 1. Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ 2. Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ 3. The name of the copyright holders or contributors may not be used to
-+ endorse or promote products derived from this software without
-+ specific prior written permission.
-+
-+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+-->
-+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.5//EN"
-+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-+<!-- SHADOW-CONFIG-HERE -->
-+]>
-+
-+<refentry id='newuidmap.1'>
-+ <refmeta>
-+ <refentrytitle>newuidmap</refentrytitle>
-+ <manvolnum>1</manvolnum>
-+ <refmiscinfo class="sectdesc">User Commands</refmiscinfo>
-+ <refmiscinfo class="source">shadow-utils</refmiscinfo>
-+ <refmiscinfo class="version">&SHADOW_UTILS_VERSION;</refmiscinfo>
-+ </refmeta>
-+ <refnamediv id='name'>
-+ <refname>newuidmap</refname>
-+ <refpurpose>set the uid mapping of a user namespace</refpurpose>
-+ </refnamediv>
-+
-+ <refsynopsisdiv id='synopsis'>
-+ <cmdsynopsis>
-+ <command>newuidmap</command>
-+ <arg choice='plain'>
-+ <replaceable>pid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>uid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>loweruid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>count</replaceable>
-+ </arg>
-+ <arg choice='opt'>
-+ <arg choice='plain'>
-+ <replaceable>uid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>loweruid</replaceable>
-+ </arg>
-+ <arg choice='plain'>
-+ <replaceable>count</replaceable>
-+ </arg>
-+ <arg choice='opt'>
-+ <replaceable>...</replaceable>
-+ </arg>
-+ </arg>
-+ </cmdsynopsis>
-+ </refsynopsisdiv>
-+
-+ <refsect1 id='description'>
-+ <title>DESCRIPTION</title>
-+ <para>
-+ The <command>newuidmap</command> sets <filename>/proc/[pid]/uid_map</filename> based on it's
-+ command line arguments and the uids allowed in <filename>/etc/subuid</filename>.
-+ </para>
-+
-+ </refsect1>
-+
-+ <refsect1 id='options'>
-+ <title>OPTIONS</title>
-+ <para>
-+ There currently are no options to the <command>newuidmap</command> command.
-+ </para>
-+ <variablelist remap='IP'>
-+ </variablelist>
-+ </refsect1>
-+
-+ <refsect1 id='note'>
-+ <title>NOTE</title>
-+ <para>
-+ The only restriction placed on the login shell is that the command
-+ name must be listed in <filename>/etc/shells</filename>, unless the
-+ invoker is the superuser, and then any value may be added. An
-+ account with a restricted login shell may not change her login shell.
-+ For this reason, placing <filename>/bin/rsh</filename> in
-+ <filename>/etc/shells</filename> is discouraged since accidentally
-+ changing to a restricted shell would prevent the user from ever
-+ changing her login shell back to its original value.
-+ </para>
-+ </refsect1>
-+
-+
-+ <refsect1 id='files'>
-+ <title>FILES</title>
-+ <variablelist>
-+ <varlistentry>
-+ <term><filename>/etc/subuid</filename></term>
-+ <listitem>
-+ <para>List of users subordinate user IDs.</para>
-+ </listitem>
-+ </varlistentry>
-+ <varlistentry>
-+ <term><filename>/proc/[pid]/uid_map</filename></term>
-+ <listitem>
-+ <para>Mapping of uids from one between user namespaces.</para>
-+ </listitem>
-+ </varlistentry>
-+ </variablelist>
-+ </refsect1>
-+
-+ <refsect1 id='see_also'>
-+ <title>SEE ALSO</title>
-+ <para>
-+ <citerefentry>
-+ <refentrytitle>login.defs</refentrytitle><manvolnum>5</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>useradd</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>usermod</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>newusers</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>userdel</refentrytitle><manvolnum>8</manvolnum>
-+ </citerefentry>,
-+ <citerefentry>
-+ <refentrytitle>subuid</refentrytitle><manvolnum>5</manvolnum>
-+ </citerefentry>.
-+ </para>
-+ </refsect1>
-+</refentry>
-Index: shadow/src/Makefile.am
-===================================================================
---- shadow.orig/src/Makefile.am 2013-02-01 15:27:53.836080342 -0600
-+++ shadow/src/Makefile.am 2013-02-01 15:27:53.832080342 -0600
-@@ -23,7 +23,8 @@
- # $prefix/bin and $prefix/sbin, no install-data hacks...)
-
- bin_PROGRAMS = groups login su
--ubin_PROGRAMS = faillog lastlog chage chfn chsh expiry gpasswd newgrp passwd
-+ubin_PROGRAMS = faillog lastlog chage chfn chsh expiry gpasswd newgrp passwd \
-+ newgidmap newuidmap
- usbin_PROGRAMS = \
- cppw \
- chgpasswd \
-@@ -50,7 +51,7 @@
- noinst_PROGRAMS = id sulogin
-
- suidbins = su
--suidubins = chage chfn chsh expiry gpasswd newgrp passwd
-+suidubins = chage chfn chsh expiry gpasswd newgrp passwd newuidmap newgidmap
- if ACCT_TOOLS_SETUID
- suidubins += chage chgpasswd chpasswd groupadd groupdel groupmod newusers useradd userdel usermod
- endif
-Index: shadow/src/newgidmap.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/src/newgidmap.c 2013-02-01 15:27:53.832080342 -0600
-@@ -0,0 +1,183 @@
-+/*
-+ * Copyright (c) 2013 Eric Biederman
-+ * All rights reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. The name of the copyright holders or contributors may not be used to
-+ * endorse or promote products derived from this software without
-+ * specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#include <config.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <errno.h>
-+#include <stdbool.h>
-+#include <stdlib.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include "defines.h"
-+#include "prototypes.h"
-+#include "subordinateio.h"
-+#include "idmapping.h"
-+
-+/*
-+ * Global variables
-+ */
-+const char *Prog;
-+
-+static bool verify_range(struct passwd *pw, struct map_range *range)
-+{
-+ /* An empty range is invalid */
-+ if (range->count == 0)
-+ return false;
-+
-+ /* Test /etc/subgid */
-+ if (have_sub_gids(pw->pw_name, range->lower, range->count))
-+ return true;
-+
-+ /* Allow a process to map it's own gid */
-+ if ((range->count == 1) && (pw->pw_gid == range->lower))
-+ return true;
-+
-+ return false;
-+}
-+
-+static void verify_ranges(struct passwd *pw, int ranges,
-+ struct map_range *mappings)
-+{
-+ struct map_range *mapping;
-+ int idx;
-+
-+ mapping = mappings;
-+ for (idx = 0; idx < ranges; idx++, mapping++) {
-+ if (!verify_range(pw, mapping)) {
-+ fprintf(stderr, _( "%s: gid range [%lu-%lu) -> [%lu-%lu) not allowed\n"),
-+ Prog,
-+ mapping->upper,
-+ mapping->upper + mapping->count,
-+ mapping->lower,
-+ mapping->lower + mapping->count);
-+ exit(EXIT_FAILURE);
-+ }
-+ }
-+}
-+
-+static void usage(void)
-+{
-+ fprintf(stderr, _("usage: %s <pid> <gid> <lowergid> <count> [ <gid> <lowergid> <count> ] ... \n"), Prog);
-+ exit(EXIT_FAILURE);
-+}
-+
-+/*
-+ * newgidmap - Set the gid_map for the specified process
-+ */
-+int main(int argc, char **argv)
-+{
-+ char proc_dir_name[PATH_MAX];
-+ char *target_str;
-+ pid_t target, parent;
-+ int proc_dir_fd;
-+ int ranges;
-+ struct map_range *mappings;
-+ struct stat st;
-+ struct passwd *pw;
-+ int written;
-+
-+ Prog = Basename (argv[0]);
-+
-+ /*
-+ * The valid syntax are
-+ * newgidmap target_pid
-+ */
-+ if (argc < 2)
-+ usage();
-+
-+ /* Find the process that needs it's user namespace
-+ * gid mapping set.
-+ */
-+ target_str = argv[1];
-+ if (!get_pid(target_str, &target))
-+ usage();
-+
-+ written = snprintf(proc_dir_name, sizeof(proc_dir_name), "/proc/%u/",
-+ target);
-+ if ((written <= 0) || (written >= sizeof(proc_dir_name))) {
-+ fprintf(stderr, "%s: snprintf of proc path failed: %s\n",
-+ Prog, strerror(errno));
-+ }
-+
-+ proc_dir_fd = open(proc_dir_name, O_DIRECTORY);
-+ if (proc_dir_fd < 0) {
-+ fprintf(stderr, _("%s: Could not open proc directory for target %u\n"),
-+ Prog, target);
-+ return EXIT_FAILURE;
-+ }
-+
-+ /* Who am i? */
-+ pw = get_my_pwent ();
-+ if (NULL == pw) {
-+ fprintf (stderr,
-+ _("%s: Cannot determine your user name.\n"),
-+ Prog);
-+ SYSLOG ((LOG_WARN, "Cannot determine the user name of the caller (UID %lu)",
-+ (unsigned long) getuid ()));
-+ return EXIT_FAILURE;
-+ }
-+
-+ /* Get the effective uid and effective gid of the target process */
-+ if (fstat(proc_dir_fd, &st) < 0) {
-+ fprintf(stderr, _("%s: Could not stat directory for target %u\n"),
-+ Prog, target);
-+ return EXIT_FAILURE;
-+ }
-+
-+ /* Verify real user and real group matches the password entry
-+ * and the effective user and group of the program whose
-+ * mappings we have been asked to set.
-+ */
-+ if ((getuid() != pw->pw_uid) ||
-+ (getgid() != pw->pw_gid) ||
-+ (pw->pw_uid != st.st_uid) ||
-+ (pw->pw_gid != st.st_gid)) {
-+ fprintf(stderr, _( "%s: Target %u is owned by a different user\n" ),
-+ Prog, target);
-+ return EXIT_FAILURE;
-+ }
-+
-+ if (!sub_gid_open(O_RDONLY)) {
-+ return EXIT_FAILURE;
-+ }
-+
-+ ranges = ((argc - 2) + 2) / 3;
-+ mappings = get_map_ranges(ranges, argc - 2, argv + 2);
-+ if (!mappings)
-+ usage();
-+
-+ verify_ranges(pw, ranges, mappings);
-+
-+ write_mapping(proc_dir_fd, ranges, mappings, "gid_map");
-+ sub_gid_close();
-+
-+ return EXIT_SUCCESS;
-+}
-Index: shadow/src/newuidmap.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ shadow/src/newuidmap.c 2013-02-01 15:27:53.832080342 -0600
-@@ -0,0 +1,183 @@
-+/*
-+ * Copyright (c) 2013 Eric Biederman
-+ * All rights reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. The name of the copyright holders or contributors may not be used to
-+ * endorse or promote products derived from this software without
-+ * specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#include <config.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <errno.h>
-+#include <stdbool.h>
-+#include <stdlib.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include "defines.h"
-+#include "prototypes.h"
-+#include "subordinateio.h"
-+#include "idmapping.h"
-+
-+/*
-+ * Global variables
-+ */
-+const char *Prog;
-+
-+static bool verify_range(struct passwd *pw, struct map_range *range)
-+{
-+ /* An empty range is invalid */
-+ if (range->count == 0)
-+ return false;
-+
-+ /* Test /etc/subuid */
-+ if (have_sub_uids(pw->pw_name, range->lower, range->count))
-+ return true;
-+
-+ /* Allow a process to map it's own uid */
-+ if ((range->count == 1) && (pw->pw_uid == range->lower))
-+ return true;
-+
-+ return false;
-+}
-+
-+static void verify_ranges(struct passwd *pw, int ranges,
-+ struct map_range *mappings)
-+{
-+ struct map_range *mapping;
-+ int idx;
-+
-+ mapping = mappings;
-+ for (idx = 0; idx < ranges; idx++, mapping++) {
-+ if (!verify_range(pw, mapping)) {
-+ fprintf(stderr, _( "%s: uid range [%lu-%lu) -> [%lu-%lu) not allowed\n"),
-+ Prog,
-+ mapping->upper,
-+ mapping->upper + mapping->count,
-+ mapping->lower,
-+ mapping->lower + mapping->count);
-+ exit(EXIT_FAILURE);
-+ }
-+ }
-+}
-+
-+void usage(void)
-+{
-+ fprintf(stderr, _("usage: %s <pid> <uid> <loweruid> <count> [ <uid> <loweruid> <count> ] ... \n"), Prog);
-+ exit(EXIT_FAILURE);
-+}
-+
-+/*
-+ * newuidmap - Set the uid_map for the specified process
-+ */
-+int main(int argc, char **argv)
-+{
-+ char proc_dir_name[PATH_MAX];
-+ char *target_str;
-+ pid_t target, parent;
-+ int proc_dir_fd;
-+ int ranges;
-+ struct map_range *mappings;
-+ struct stat st;
-+ struct passwd *pw;
-+ int written;
-+
-+ Prog = Basename (argv[0]);
-+
-+ /*
-+ * The valid syntax are
-+ * newuidmap target_pid
-+ */
-+ if (argc < 2)
-+ usage();
-+
-+ /* Find the process that needs it's user namespace
-+ * uid mapping set.
-+ */
-+ target_str = argv[1];
-+ if (!get_pid(target_str, &target))
-+ usage();
-+
-+ written = snprintf(proc_dir_name, sizeof(proc_dir_name), "/proc/%u/",
-+ target);
-+ if ((written <= 0) || (written >= sizeof(proc_dir_name))) {
-+ fprintf(stderr, "%s: snprintf of proc path failed: %s\n",
-+ Prog, strerror(errno));
-+ }
-+
-+ proc_dir_fd = open(proc_dir_name, O_DIRECTORY);
-+ if (proc_dir_fd < 0) {
-+ fprintf(stderr, _("%s: Could not open proc directory for target %u\n"),
-+ Prog, target);
-+ return EXIT_FAILURE;
-+ }
-+
-+ /* Who am i? */
-+ pw = get_my_pwent ();
-+ if (NULL == pw) {
-+ fprintf (stderr,
-+ _("%s: Cannot determine your user name.\n"),
-+ Prog);
-+ SYSLOG ((LOG_WARN, "Cannot determine the user name of the caller (UID %lu)",
-+ (unsigned long) getuid ()));
-+ return EXIT_FAILURE;
-+ }
-+
-+ /* Get the effective uid and effective gid of the target process */
-+ if (fstat(proc_dir_fd, &st) < 0) {
-+ fprintf(stderr, _("%s: Could not stat directory for target %u\n"),
-+ Prog, target);
-+ return EXIT_FAILURE;
-+ }
-+
-+ /* Verify real user and real group matches the password entry
-+ * and the effective user and group of the program whose
-+ * mappings we have been asked to set.
-+ */
-+ if ((getuid() != pw->pw_uid) ||
-+ (getgid() != pw->pw_gid) ||
-+ (pw->pw_uid != st.st_uid) ||
-+ (pw->pw_gid != st.st_gid)) {
-+ fprintf(stderr, _( "%s: Target %u is owned by a different user\n" ),
-+ Prog, target);
-+ return EXIT_FAILURE;
-+ }
-+
-+ if (!sub_uid_open(O_RDONLY)) {
-+ return EXIT_FAILURE;
-+ }
-+
-+ ranges = ((argc - 2) + 2) / 3;
-+ mappings = get_map_ranges(ranges, argc - 2, argv + 2);
-+ if (!mappings)
-+ usage();
-+
-+ verify_ranges(pw, ranges, mappings);
-+
-+ write_mapping(proc_dir_fd, ranges, mappings, "uid_map");
-+ sub_uid_close();
-+
-+ return EXIT_SUCCESS;
-+}
diff --git a/debian/patches/userns/12_userns_selinuxlibs b/debian/patches/userns/12_userns_selinuxlibs
deleted file mode 100644
index 71833c4..0000000
--- a/debian/patches/userns/12_userns_selinuxlibs
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: shadow-4.1.5.1/src/Makefile.am
-===================================================================
---- shadow-4.1.5.1.orig/src/Makefile.am 2013-02-04 11:56:40.485335430 -0600
-+++ shadow-4.1.5.1/src/Makefile.am 2013-02-04 11:57:49.525334261 -0600
-@@ -80,6 +80,8 @@
- endif
-
- chage_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX)
-+newuidmap_LDADD = $(LDADD) $(LIBSELINUX)
-+newgidmap_LDADD = $(LDADD) $(LIBSELINUX)
- chfn_LDADD = $(LDADD) $(LIBPAM) $(LIBSELINUX) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD)
- chgpasswd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBSELINUX) $(LIBCRYPT)
- chsh_LDADD = $(LDADD) $(LIBPAM) $(LIBSELINUX) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD)
diff --git a/debian/patches/userns/13_subordinate_parse_static_buf b/debian/patches/userns/13_subordinate_parse_static_buf
deleted file mode 100644
index 7c9eb3a..0000000
--- a/debian/patches/userns/13_subordinate_parse_static_buf
+++ /dev/null
@@ -1,23 +0,0 @@
-Description: subordinateio: Fix subordinate_parse to have an internal static buffer
- subordinate_parse is supposed to return a static structure that
- represents one line in /etc/subuid or /etc/subgid. I goofed and
- failed to make the variable rangebuf that holds the username of
- in the returned structure static.
- .
- Add this missing static specification.
-Author: <Eric W. Biederman" <ebiederm at xmission.com>
-Origin: upstream
-Forwarded: no
-Index: shadow-4.1.5.1/lib/subordinateio.c
-===================================================================
---- shadow-4.1.5.1.orig/lib/subordinateio.c 2013-02-04 11:56:40.265335433 -0600
-+++ shadow-4.1.5.1/lib/subordinateio.c 2013-02-04 12:32:46.653298752 -0600
-@@ -48,7 +48,7 @@
- static void *subordinate_parse (const char *line)
- {
- static struct subordinate_range range;
-- char rangebuf[1024];
-+ static char rangebuf[1024];
- int i;
- char *cp;
- char *fields[NFIELDS];
diff --git a/debian/patches/userns/14_fix_getopt b/debian/patches/userns/14_fix_getopt
deleted file mode 100644
index 988e9d0..0000000
--- a/debian/patches/userns/14_fix_getopt
+++ /dev/null
@@ -1,24 +0,0 @@
-Index: shadow-userns/src/usermod.c
-===================================================================
---- shadow-userns.orig/src/usermod.c 2013-02-05 16:35:10.608485591 +0000
-+++ shadow-userns/src/usermod.c 2013-02-05 17:16:20.540485591 +0000
-@@ -993,9 +993,9 @@
- };
- while ((c = getopt_long (argc, argv,
- #ifdef WITH_SELINUX
-- "ac:d:e:f:g:G:hl:Lmop:R:s:u:UZ:",
-+ "ac:d:e:f:g:G:hl:Lmop:R:s:u:UZ:v:w:V:W:",
- #else /* !WITH_SELINUX */
-- "ac:d:e:f:g:G:hl:Lmop:R:s:u:U",
-+ "ac:d:e:f:g:G:hl:Lmop:R:s:u:Uv:w:V:W:",
- #endif /* !WITH_SELINUX */
- long_options, NULL)) != -1) {
- switch (c) {
-@@ -1141,6 +1141,7 @@
- exit(E_BAD_ARG);
- }
- wflg = true;
-+ break;
- case 'W':
- if (prepend_range (optarg, &del_sub_gids) == 0) {
- fprintf (stderr,
diff --git a/debian/patches/userns/16_add-argument-sanity-checking.patch b/debian/patches/userns/16_add-argument-sanity-checking.patch
deleted file mode 100644
index d2f3515..0000000
--- a/debian/patches/userns/16_add-argument-sanity-checking.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From df3c8c1f7f47ceff607595067458f1d8e53eaab8 Mon Sep 17 00:00:00 2001
-From: Serge Hallyn <serge.hallyn at ubuntu.com>
-Date: Fri, 21 Jun 2013 11:47:36 -0500
-Subject: [PATCH 1/1] userns: add argument sanity checking
-
-In find_new_sub_{u,g}ids, check for min, count and max values.
-
-In idmapping.c:get_map_ranges(), make sure that the value passed
-in for ranges did not overflow. Couldn't happen with the current
-code, but this is a sanity check for any future potential mis-uses.
-
-Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
----
- libmisc/find_new_sub_gids.c | 8 ++++++++
- libmisc/find_new_sub_uids.c | 8 ++++++++
- libmisc/idmapping.c | 10 ++++++++++
- 3 files changed, 26 insertions(+)
-
-diff --git a/libmisc/find_new_sub_gids.c b/libmisc/find_new_sub_gids.c
-index 68046ac..fd44978 100644
---- a/libmisc/find_new_sub_gids.c
-+++ b/libmisc/find_new_sub_gids.c
-@@ -58,6 +58,14 @@ int find_new_sub_gids (const char *owner,
- max = getdef_ulong ("SUB_GID_MAX", 600100000UL);
- count = getdef_ulong ("SUB_GID_COUNT", 10000);
-
-+ if (min >= max || count >= max || (min + count) >= max) {
-+ (void) fprintf (stderr,
-+ _("%s: Invalid configuration: SUB_GID_MIN (%lu),"
-+ " SUB_GID_MAX (%lu), SUB_GID_COUNT (%lu)\n"),
-+ Prog, min, max, count);
-+ return -1;
-+ }
-+
- /* Is there a preferred range that works? */
- if ((*range_count != 0) &&
- (*range_start >= min) &&
-diff --git a/libmisc/find_new_sub_uids.c b/libmisc/find_new_sub_uids.c
-index f1720f9..b608c59 100644
---- a/libmisc/find_new_sub_uids.c
-+++ b/libmisc/find_new_sub_uids.c
-@@ -58,6 +58,14 @@ int find_new_sub_uids (const char *owner,
- max = getdef_ulong ("SUB_UID_MAX", 600100000UL);
- count = getdef_ulong ("SUB_UID_COUNT", 10000);
-
-+ if (min >= max || count >= max || (min + count) >= max) {
-+ (void) fprintf (stderr,
-+ _("%s: Invalid configuration: SUB_UID_MIN (%lu),"
-+ " SUB_UID_MAX (%lu), SUB_UID_COUNT (%lu)\n"),
-+ Prog, min, max, count);
-+ return -1;
-+ }
-+
- /* Is there a preferred range that works? */
- if ((*range_count != 0) &&
- (*range_start >= min) &&
-diff --git a/libmisc/idmapping.c b/libmisc/idmapping.c
-index cb9e898..4147796 100644
---- a/libmisc/idmapping.c
-+++ b/libmisc/idmapping.c
-@@ -41,6 +41,16 @@ struct map_range *get_map_ranges(int ranges, int argc, char **argv)
- struct map_range *mappings, *mapping;
- int idx, argidx;
-
-+ if (ranges < 0 || argc < 0) {
-+ fprintf(stderr, "%s: error calculating number of arguments\n", Prog);
-+ return NULL;
-+ }
-+
-+ if (ranges != ((argc - 2) + 2) / 3) {
-+ fprintf(stderr, "%s: ranges: %u is wrong for argc: %d\n", Prog, ranges, argc);
-+ return NULL;
-+ }
-+
- if ((ranges * 3) > argc) {
- fprintf(stderr, "ranges: %u argc: %d\n",
- ranges, argc);
---
-1.8.1.2
-
diff --git a/debian/patches/userns/manpagetypo b/debian/patches/userns/manpagetypo
deleted file mode 100644
index 5c88585..0000000
--- a/debian/patches/userns/manpagetypo
+++ /dev/null
@@ -1,26 +0,0 @@
-Index: shadow/man/subgid.5.xml
-===================================================================
---- shadow.orig/man/subgid.5.xml 2013-03-06 15:19:23.848386200 -0600
-+++ shadow/man/subgid.5.xml 2013-03-06 15:19:51.240386816 -0600
-@@ -104,7 +104,7 @@
- <refentrytitle>subuid</refentrytitle><manvolnum>5</manvolnum>
- </citerefentry>,
- <citerefentry>
-- <refentrytitle>logindefs</refentrytitle><manvolnum>5</manvolnum>
-+ <refentrytitle>login.defs</refentrytitle><manvolnum>5</manvolnum>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>newuidmap</refentrytitle><manvolnum>1</manvolnum>
-Index: shadow/man/subuid.5.xml
-===================================================================
---- shadow.orig/man/subuid.5.xml 2013-03-06 15:19:09.660385881 -0600
-+++ shadow/man/subuid.5.xml 2013-03-06 15:19:44.956386675 -0600
-@@ -104,7 +104,7 @@
- <refentrytitle>subgid</refentrytitle><manvolnum>5</manvolnum>
- </citerefentry>,
- <citerefentry>
-- <refentrytitle>logindefs</refentrytitle><manvolnum>5</manvolnum>
-+ <refentrytitle>login.defs</refentrytitle><manvolnum>5</manvolnum>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>newuidmap</refentrytitle><manvolnum>1</manvolnum>
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-shadow/shadow.git
More information about the Pkg-shadow-devel
mailing list