From aa9eb1fc6718aec0a6a67b2dc748c3416056411e Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 16 Oct 2008 13:29:13 +0000 Subject: [PATCH] rpm: fix incompatibilities which prevented rpm -i foo.src.rpm function old new delta fileaction_setowngrp 57 89 +32 --- archival/rpm.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/archival/rpm.c b/archival/rpm.c index e1f3c8930..78568687e 100644 --- a/archival/rpm.c +++ b/archival/rpm.c @@ -202,7 +202,12 @@ static void extract_cpio_gz(int fd) archive_handle->seek = seek_by_read; //archive_handle->action_header = header_list; archive_handle->action_data = data_extract_all; - archive_handle->ah_flags = ARCHIVE_PRESERVE_DATE | ARCHIVE_CREATE_LEADING_DIRS; + archive_handle->ah_flags = ARCHIVE_PRESERVE_DATE | ARCHIVE_CREATE_LEADING_DIRS + /* compat: overwrite existing files. + * try "rpm -i foo.src.rpm" few times in a row - + * standard rpm will not complain. + * (TODO? real rpm creates "file;1234" and then renames it) */ + | ARCHIVE_EXTRACT_UNCONDITIONAL; archive_handle->src_fd = fd; /*archive_handle->offset = 0; - init_handle() did it */ @@ -378,9 +383,11 @@ static void fileaction_dobackup(char *filename, int fileref) static void fileaction_setowngrp(char *filename, int fileref) { - int uid, gid; - uid = xuname2uid(rpm_getstr(TAG_FILEUSERNAME, fileref)); - gid = xgroup2gid(rpm_getstr(TAG_FILEGROUPNAME, fileref)); + /* real rpm warns: "user foo does not exist - using " */ + struct passwd *pw = getpwnam(rpm_getstr(TAG_FILEUSERNAME, fileref)); + int uid = pw ? pw->pw_uid : getuid(); /* or euid? */ + struct group *gr = getgrnam(rpm_getstr(TAG_FILEGROUPNAME, fileref)); + int gid = gr ? gr->gr_gid : getgid(); chown(filename, uid, gid); }