61
61
gid_min = (gid_t) getdef_ulong ("GID_MIN", 1000UL);
62
62
gid_max = (gid_t) getdef_ulong ("GID_MAX", 60000UL);
64
gid_min = (gid_t) getdef_ulong ("SYS_GID_MIN", 1UL);
64
gid_min = (gid_t) getdef_ulong ("SYS_GID_MIN", 101UL);
65
65
gid_max = (gid_t) getdef_ulong ("GID_MIN", 1000UL) - 1;
66
66
gid_max = (gid_t) getdef_ulong ("SYS_GID_MAX", (unsigned long) gid_max);
90
89
* but we also check the local database (gr_rewind/gr_next) in case
91
90
* some groups were created but the changes were not committed yet.
94
while ((grp = getgrent ()) != NULL) {
95
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {
96
group_id = grp->gr_gid + 1;
98
/* create index of used GIDs */
99
if (grp->gr_gid <= gid_max) {
100
used_gids[grp->gr_gid] = true;
105
while ((grp = gr_next ()) != NULL) {
106
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {
107
group_id = grp->gr_gid + 1;
109
/* create index of used GIDs */
110
if (grp->gr_gid <= gid_max) {
111
used_gids[grp->gr_gid] = true;
115
/* find free system account in reverse order */
117
for (group_id = gid_max; group_id >= gid_min; group_id--) {
118
if (false == used_gids[group_id]) {
122
if ( group_id < gid_min ) {
124
_("%s: Can't get unique GID (no more available GIDs)\n"),
127
"no more available GID on the system"));
93
/* setgrent / getgrent / endgrent can be very slow with
94
* LDAP configurations (and many accounts).
95
* Since there is a limited amount of IDs to be tested
96
* for system accounts, we just check the existence
97
* of IDs with getgrgid.
100
for (id = gid_max; id >= gid_min; id--) {
101
if (getgrgid (id) != NULL) {
103
used_gids[id] = true;
108
while ((grp = gr_next ()) != NULL) {
109
if ((grp->gr_gid <= group_id) && (grp->gr_gid >= gid_min)) {
110
group_id = grp->gr_gid - 1;
112
/* create index of used GIDs */
113
if (grp->gr_gid <= gid_max) {
114
used_gids[grp->gr_gid] = true;
120
while ((grp = getgrent ()) != NULL) {
121
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {
122
group_id = grp->gr_gid + 1;
124
/* create index of used GIDs */
125
if (grp->gr_gid <= gid_max) {
126
used_gids[grp->gr_gid] = true;
132
while ((grp = gr_next ()) != NULL) {
133
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {
134
group_id = grp->gr_gid + 1;
136
/* create index of used GIDs */
137
if (grp->gr_gid <= gid_max) {
138
used_gids[grp->gr_gid] = true;
134
145
* will give us GID_MAX+1 even if not unique. Search for the first
135
146
* free GID starting with GID_MIN.
137
if (group_id == gid_max + 1) {
138
for (group_id = gid_min; group_id < gid_max; group_id++) {
139
if (false == used_gids[group_id]) {
149
if (group_id == gid_min - 1) {
150
for (group_id = gid_max; group_id >= gid_min; group_id--) {
151
if (false == used_gids[group_id]) {
155
if ( group_id < gid_min ) {
157
_("%s: Can't get unique system GID (no more available GIDs)\n"),
160
"no more available GID on the system"));
143
if (group_id == gid_max) {
144
fprintf (stderr, _("%s: Can't get unique GID (no more available GIDs)\n"), Prog);
145
SYSLOG ((LOG_WARN, "no more available GID on the system"));
165
if (group_id == gid_max + 1) {
166
for (group_id = gid_min; group_id < gid_max; group_id++) {
167
if (false == used_gids[group_id]) {
171
if (group_id == gid_max) {
173
_("%s: Can't get unique GID (no more available GIDs)\n"),
175
SYSLOG ((LOG_WARN, "no more available GID on the system"));