* are special. */
#include "rsync.h"
+#include "io.h"
#ifdef HAVE_GETGROUPS
# ifndef GETGROUPS_T
extern int am_root;
extern int preserve_uid;
extern int preserve_gid;
+extern int preserve_acls;
extern int numeric_ids;
struct idlist {
{
struct idlist *list;
- if (preserve_uid) {
+ if (preserve_uid || preserve_acls) {
int len;
/* we send sequences of uid/byte-length/name */
for (list = uidlist; list; list = list->next) {
if (!list->name)
continue;
len = strlen(list->name);
- write_int(f, list->id);
+ write_abbrevint30(f, list->id);
write_byte(f, len);
write_buf(f, list->name, len);
}
/* terminate the uid list with a 0 uid. We explicitly exclude
* 0 from the list */
- write_int(f, 0);
+ write_abbrevint30(f, 0);
}
- if (preserve_gid) {
+ if (preserve_gid || preserve_acls) {
int len;
for (list = gidlist; list; list = list->next) {
if (!list->name)
continue;
len = strlen(list->name);
- write_int(f, list->id);
+ write_abbrevint30(f, list->id);
write_byte(f, len);
write_buf(f, list->name, len);
}
- write_int(f, 0);
+ write_abbrevint30(f, 0);
}
}
{
int id, i;
- if (preserve_uid && !numeric_ids) {
+ if ((preserve_uid || preserve_acls) && !numeric_ids) {
/* read the uid list */
- while ((id = read_int(f)) != 0)
+ while ((id = read_abbrevint30(f)) != 0)
recv_user_name(f, (uid_t)id);
}
- if (preserve_gid && !numeric_ids) {
+ if ((preserve_gid || preserve_acls) && !numeric_ids) {
/* read the gid list */
- while ((id = read_int(f)) != 0)
+ while ((id = read_abbrevint30(f)) != 0)
recv_group_name(f, (gid_t)id);
}
+#ifdef SUPPORT_ACLS
+ if (preserve_acls && !numeric_ids) {
+ id_t *id;
+ while ((id = next_acl_uid(flist)) != NULL)
+ *id = match_uid(*id);
+ while ((id = next_acl_gid(flist)) != NULL)
+ *id = match_gid(*id);
+ }
+#endif
+
/* Now convert all the uids/gids from sender values to our values. */
if (am_root && preserve_uid && !numeric_ids) {
for (i = 0; i < flist->count; i++)