MCPcopy Index your code
hub / github.com/F-Stack/f-stack / gr_equal

Function gr_equal

tools/libutil/gr_util.c:382–423  ·  view source on GitHub ↗

* Compares two struct group's. */

Source from the content-addressed store, hash-verified

380 * Compares two struct group's.
381 */
382int
383gr_equal(const struct group *gr1, const struct group *gr2)
384{
385
386 /* Check that the non-member information is the same. */
387 if (gr1->gr_name == NULL || gr2->gr_name == NULL) {
388 if (gr1->gr_name != gr2->gr_name)
389 return (false);
390 } else if (strcmp(gr1->gr_name, gr2->gr_name) != 0)
391 return (false);
392 if (gr1->gr_passwd == NULL || gr2->gr_passwd == NULL) {
393 if (gr1->gr_passwd != gr2->gr_passwd)
394 return (false);
395 } else if (strcmp(gr1->gr_passwd, gr2->gr_passwd) != 0)
396 return (false);
397 if (gr1->gr_gid != gr2->gr_gid)
398 return (false);
399
400 /*
401 * Check all members in both groups.
402 * getgrnam can return gr_mem with a pointer to NULL.
403 * gr_dup and gr_add strip out this superfluous NULL, setting
404 * gr_mem to NULL for no members.
405 */
406 if (gr1->gr_mem != NULL && gr2->gr_mem != NULL) {
407 int i;
408
409 for (i = 0;
410 gr1->gr_mem[i] != NULL && gr2->gr_mem[i] != NULL; i++) {
411 if (strcmp(gr1->gr_mem[i], gr2->gr_mem[i]) != 0)
412 return (false);
413 }
414 if (gr1->gr_mem[i] != NULL || gr2->gr_mem[i] != NULL)
415 return (false);
416 } else if (gr1->gr_mem != NULL && gr1->gr_mem[0] != NULL) {
417 return (false);
418 } else if (gr2->gr_mem != NULL && gr2->gr_mem[0] != NULL) {
419 return (false);
420 }
421
422 return (true);
423}
424
425/*
426 * Make a group line out of a struct group.

Callers 2

gr_copyFunction · 0.85
mainFunction · 0.85

Calls 1

strcmpFunction · 0.85

Tested by 1

mainFunction · 0.68