2014-02-03 2 views
2

Необходимо реализовать функциональность для добавления/удаления пользователей и групп в системе Linux. Я использую этот POSIX вызовов:Группа Linux и управление пользователями

  • недействительного setgrent (аннулируется) - для открытия группы файлов
  • структуры группы * getgrent (Недействительные); - для чтения групповой структуры
  • недействительным endgrent (аннулируются) - для закрытия файла

Идея заключается в том, чтобы прочитать все пользовательские и групповые структуры в векторе, изменять их, а затем переписать существующие/и т.д./пароль и/etc/групповые файлы. Описание функции Getgrent() говорит, что эти функции имеют статические переменные с выделенной памятью, и этот указатель не должен быть освобожден вручную. Это означает, что endgrent() должен освобождать все указатели на кучу. Это вызывает проблему, потому что группа структур содержит много данных о куче. Поэтому, если я решил сохранить его где-то, мне нужно сделать strdup() для каждого члена в gr_mem, а также для других членов, поэтому я не теряю никаких данных.

Есть ли способ более эффективно хранить групповые структуры? Может быть, есть еще один способ решить эту проблему?

struct group 
{ 
    char *gr_name; // The name of the group. 
    gid_t gr_gid; // The group ID of the group. 
    char **gr_mem; // array of group members 
} 
+1

Нет, но зачем делать несколько 'strdup' беспокоить вас? У вас не будет таких пользователей (системы с тысячами пользователей редки, и это легко подходит для всех настольных компьютеров ....) –

+1

Все эти вызовы - POSIX. – Duck

+0

@BasileStarynkevitch На самом деле я разрабатываю встроенную систему. Вот почему я пытаюсь минимизировать операции чтения/записи, а также получать максимальную производительность. Я в порядке с этим решением, просто надеясь на критику со стороны сообщества. – incogn1to

ответ

1

Имеются реентерабельные версии этих функций. См человек getgrent_r, например:

int getgrent_r(struct group *gbuf, char *buf,size_t buflen, struct group **gbufp); 

Эта версия принимает указатель на ячейку памяти, что вы должны предоставить.

Затем вы можете бесплатно() создать структуру, когда это удобно, без необходимости делать ненужные копии.

Смежные вопросы