2012-10-31 2 views
1

함수에서 암호 구조를 업데이트하려고합니다. 이 함수는 세부 정보를 업데이트해야하는 암호 구조에 대한 포인터를 가져옵니다.getpwnam getpwnam_r

인수로 함수에 struct passwd*이 전달되고 사용자의 다른 사용자 (user2) 정보로 멤버를 업데이트해야하며이 함수의 호출자는 이러한 모든 업데이트 된 세부 정보를 포함해야합니다.

다음과 같이 시도해 보았습니다. 어떻게해야 이상적인 방법인지 제안하여 도움을받을 수 있습니까?

내 함수는 다음과 같다 :

struct passwd* myfunc(struct passwd *pw) 

pw에, 나는 세부 사항을 업데이트해야합니다.

Try1 :

getpwnam() 통과 struct passwd *pw에 사용자 2의 세부 사항을 얻을 사용. 우리는 회원이 아니라 우리가 다른 구조체에 pw를 가리키는 PW 업데이트하지 않는 한

pw = getpwnam("user2"); 
return pw; 

이 작동하지 않습니다, pw의 포인터 멤버들은 여전히 ​​오래된 데이터를 가리 킵니다. 따라서 myfunc()의 부모는 업데이트 된 세부 정보를 가져 오지 않습니다.

회원에게 글을 작성해야합니다.

Try2 : getpwnam()는 임시 struct passwd*으로 사용자 2의 세부 사항을 얻을 사용

. memcpy대로 작동하지 않는 memcpy(pw, temppasswd, sizeof(struct passwd))

를 수행 것은 얕은 복사 및 그에 따른입니다 getpwnam()가 정적 버퍼 영역을 작성하며, pw 다른 값을 가질 수있다 (반환은 temppasswd에게 제공되지는 않지만).

Try3 :

오히려 정적 데이터 영역 (getpwnam 등)에 비해 그 인수로서 건네 버퍼 상세 getpwnam_r() 기록을 시도했다.

pw이 없기 때문에 이것을 사용할 수 없습니다. 나는 *pw입니다. 따라서 pw에 할당 된 메모리의 주소를 getpwnam_r에 전달할 수 없습니다.

4를보십시오 :

내가 Try2에 회원 사본 구성원을 할 수 있지만 내가 그들에 데이터를 복사하기 전에 여유 pw 구조 포인터 구성원을 할 경우 메모리 누수가 발생할 수 있습니다.

pw*을 전달하는 세부 정보를 복사하는 다른 방법은 pw* 포인터 멤버를 모두 사용하지 않고도 가능합니다.

다소 혼란 스럽지만 누군가에게 이해되기를 바랍니다.

답변

0

처음 두 대안을 *pw = *getpwnam("user2");으로 결합 할 수 있습니다. 그래도 여전히 얕은 사본입니다.

문제의 경우 프로토 타입을 struct passwd* myfunc(struct passwd **pw)으로 변경할 수 있으면 구조와 필요한 모든 필드를 직접 할당 할 수 있습니다. 그런 다음 사용자가 할당 된 모든 데이터를 확보하기 위해 호출해야하는 별도의 기능을 갖습니다.

+0

아니요, 많은 발신자가 있기 때문에 함수 프로토 타입을 변경할 수 없습니다. 그리고 나는 그 모든 기능을 바꾸고 싶지 않습니다. ( – Ram

+0

@Ram 그런데 불행히도 얕은 복사와 정적 버퍼로 살아야합니다. –