1

I am trying to update a password structure in a function. This function gets a pointer to password structure, into which I have to update details.

I get a struct passwd* to a function as an argument and my requirement is to update it's members to someother user's(user2) information and caller of this function should have all these updated details.

I tried following, can you please help me by suggesting what is an ideal way to do it.

My function is like this:

struct passwd* myfunc(struct passwd *pw)

To this pw, I have to update details.

Try1:

Using getpwnam() get details of user2 into passed struct passwd *pw.

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

Does not work, as we are not updating pw members rather we are just pointing pw to some other struct, pointer members of pw, still point to older data. And thus parent of myfunc() does not get updated details.

We have to write into members.

Try2:

Using getpwnam() get details of user2 into a temp struct passwd*. Do a memcpy(pw, temppasswd, sizeof(struct passwd))

Does not work as memcpy is a shallow copy and consequent getpwnam() (although the return is not given to temppasswd) will over write static buffer area, and pw may have different values.

Try3:

Tried getpwnam_r() which writes details into buffer passed as an argument to it rather than into a static data area (like getpwnam).

Can not use this, as I don't have pw, I have *pw. So, I can not pass address of memory allocated to pw to getpwnam_r.

Try 4:

I can do member by member copy in Try2, but it can result in memory leaks if I don't free pw structure pointer members before copying data into them.

Is there any other way to copy details to passed pw* without free-ing all struct pw* pointer members.

It is a bit confusing, I hope I make sense to someone.

4

1 回答 1

0

您可以将前两个选项组合为*pw = *getpwnam("user2");. 尽管如此,它仍然是一个浅拷贝。

至于您的问题,如果您可以将原型更改为,struct passwd* myfunc(struct passwd **pw)那么您可以自己分配结构和所有需要的字段。然后有一个单独的函数,用户必须调用它来释放所有分配的数据。

于 2012-10-31T06:23:44.333 回答