2013-09-16 3 views
0

Fedora를 실행하는 원격 빌드 서버에서 컴파일 및 링크 된 PostgreSQL의 Initdb 유틸리티 빌드가 있습니다. 내 시스템에서 (우분투 13.04 64 비트) 유틸리티는 명령 initdb -D /home/me/postgres_files/ -L /home/me/postgres_init_files/을 사용하여 실행되는 반환 다음 : 나는 유틸리티를 로컬로 만들 경우원격 시스템에서 빌드 할 때 오해의 소지가있는 오류 메시지와 함께 Postdbres에 대한 Initdb가 실패했습니다.

initdb: could not obtain information about current user: Success 

이 우리의 빌드에서 원격 빌드, 발생하지 않습니다 농장.

pw = getpwuid(geteuid()); 
if (!pw) 
{ 
    fprintf(stderr, 
      _("%s: could not obtain information about current user: %s\n"), 
      progname, strerror(errno)); 
    exit(1); 
} 

호출 중 하나가() 실패를 (geteuid) 또는 getpwuid 할 것으로 보인다 있지만, errno를 설정하지 않을 : 지금까지 initdb.c에 다음 코드 조각에 이르기까지 문제를 추적 관리해야 실패한 함수에 의해. 불행히도 나는 쉽게 들어가서 유틸리티를 직접 디버깅 할 수 없다. 이것은 유틸리티의 원격 빌드 버전에서만 발생하기 때문이다.

누구든지이 점을 밝힐 수 있다면 크게 감사 할 것입니다.

감사합니다.

NULL 반환 getpwuid() 경우이 아닌 necessarilly 오류를 inidicate 필요 :은 "일관성"오류 메시지를 참조

+1

코드 (https://github.com/postgres/postgres/blob/master/src/bin/initdb/initdb.c)를 아주 자세히 보면 스레드되지 않은 것 같습니다. – Pete

답변

1

. man getpwuid에서

(내게로 기울임 강조) :

getpwuid() 기능은 사용자 ID와 일치하는 암호 데이터베이스에있는 레코드의 파단 필드를 포함하는 구조체에 대한 포인터를 반환 uid.

[...]

에서 getpwnam()getpwuid()가 일치하는 엔트리가 없거나 에러가 발생하지 않은 경우 기능은 passwd 파일 구조, 또는 NULL 에 대한 포인터를 리턴한다. errno 내가 geteuid()의 결과가 단순히 getpwuid()에 의해 찾을 수 없다는 결론을 내릴 것보다 두 문에서도 ANF 0을 보인다는 사실에서

.

+1

오류가 발생하면 다음과 같이 표시됩니다. * "** 0 ** ** ENOENT 또는 ESRCH 또는 EBADF 또는 EPERM ... : 주어진 이름 또는 uid를 찾을 수 없습니다"* 다소 구현에 따라 달라집니다. 또 다른. – delicateLatticeworkFever

+0

그래도이 기능은 로컬에서 작성한 복사본에서 작동하며 원격으로 만들어진 복사본에서는 작동하지 않습니다. 우리는 소스에서 완전히 빌드되어 모든 시스템에서 동일해야하는 런타임을 사용하므로 서로 다른 시스템 라이브러리로 인한 것 같지는 않습니다. Additonally, geteuid()는 호출 한 프로세스의 사용자 ID를 반환합니다. 반환 된 값을 사용하는 getpwuid()에 대한 후속 호출이 실패하는 이유는 무엇입니까? – Pete

+0

@ Pete : 내 대답은 질문 제목대로 오류 메시지의 불일치를 말합니다. 'getpwuid()'의 근본 원인을'NULL'을 반환하는 것에 관해서는 실제로 알지 못하지만 단지 추측 할 수 있습니다 : 두 빌드 모두 동일한 libc를 사용합니까? – alk