* Compares two struct group's. */
| 380 | * Compares two struct group's. |
| 381 | */ |
| 382 | int |
| 383 | gr_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. |