comparison src/w32.c @ 94797:89a5cb9cf680

Rename the_passwd_* to dflt_passwd_*. (dflt_group_name): New static variable. (dflt_group): Renamed from the_group. (init_user_info): Init dflt_group fields. Get user's group name from LookupAccountSid.
author Eli Zaretskii <eliz@gnu.org>
date Fri, 09 May 2008 09:40:56 +0000
parents ca9efc5939fc
children 5ad1f4d9b15c
comparison
equal deleted inserted replaced
94796:6a8a15e68e80 94797:89a5cb9cf680
511 511
512 /* Emulate getpwuid, getpwnam and others. */ 512 /* Emulate getpwuid, getpwnam and others. */
513 513
514 #define PASSWD_FIELD_SIZE 256 514 #define PASSWD_FIELD_SIZE 256
515 515
516 static char the_passwd_name[PASSWD_FIELD_SIZE]; 516 static char dflt_passwd_name[PASSWD_FIELD_SIZE];
517 static char the_passwd_passwd[PASSWD_FIELD_SIZE]; 517 static char dflt_passwd_passwd[PASSWD_FIELD_SIZE];
518 static char the_passwd_gecos[PASSWD_FIELD_SIZE]; 518 static char dflt_passwd_gecos[PASSWD_FIELD_SIZE];
519 static char the_passwd_dir[PASSWD_FIELD_SIZE]; 519 static char dflt_passwd_dir[PASSWD_FIELD_SIZE];
520 static char the_passwd_shell[PASSWD_FIELD_SIZE]; 520 static char dflt_passwd_shell[PASSWD_FIELD_SIZE];
521 521
522 static struct passwd the_passwd = 522 static struct passwd dflt_passwd =
523 { 523 {
524 the_passwd_name, 524 dflt_passwd_name,
525 the_passwd_passwd, 525 dflt_passwd_passwd,
526 0, 526 0,
527 0, 527 0,
528 0, 528 0,
529 the_passwd_gecos, 529 dflt_passwd_gecos,
530 the_passwd_dir, 530 dflt_passwd_dir,
531 the_passwd_shell, 531 dflt_passwd_shell,
532 }; 532 };
533 533
534 static struct group the_group = 534 static char dflt_group_name[GNLEN+1];
535 { 535
536 /* There are no groups on NT, so we just return "root" as the 536 static struct group dflt_group =
537 group name. */ 537 {
538 "root", 538 /* When group information is not available, we return this as the
539 group for all files. */
540 dflt_group_name,
541 0,
539 }; 542 };
540 543
541 int 544 int
542 getuid () 545 getuid ()
543 { 546 {
544 return the_passwd.pw_uid; 547 return dflt_passwd.pw_uid;
545 } 548 }
546 549
547 int 550 int
548 geteuid () 551 geteuid ()
549 { 552 {
554 } 557 }
555 558
556 int 559 int
557 getgid () 560 getgid ()
558 { 561 {
559 return the_passwd.pw_gid; 562 return dflt_passwd.pw_gid;
560 } 563 }
561 564
562 int 565 int
563 getegid () 566 getegid ()
564 { 567 {
566 } 569 }
567 570
568 struct passwd * 571 struct passwd *
569 getpwuid (int uid) 572 getpwuid (int uid)
570 { 573 {
571 if (uid == the_passwd.pw_uid) 574 if (uid == dflt_passwd.pw_uid)
572 return &the_passwd; 575 return &dflt_passwd;
573 return NULL; 576 return NULL;
574 } 577 }
575 578
576 struct group * 579 struct group *
577 getgrgid (gid_t gid) 580 getgrgid (gid_t gid)
578 { 581 {
579 return &the_group; 582 return &dflt_group;
580 } 583 }
581 584
582 struct passwd * 585 struct passwd *
583 getpwnam (char *name) 586 getpwnam (char *name)
584 { 587 {
602 605
603 Use the relative portion of the identifier authority value from 606 Use the relative portion of the identifier authority value from
604 the user-sid as the user id value (same for group id using the 607 the user-sid as the user id value (same for group id using the
605 primary group sid from the process token). */ 608 primary group sid from the process token). */
606 609
607 char name[UNLEN+1], domain[1025]; 610 char uname[UNLEN+1], gname[GNLEN+1], domain[1025];
608 DWORD length = sizeof (name), dlength = sizeof (domain), trash; 611 DWORD ulength = sizeof (uname), dlength = sizeof (domain), trash;
612 DWORD glength = sizeof (gname);
609 HANDLE token = NULL; 613 HANDLE token = NULL;
610 SID_NAME_USE user_type; 614 SID_NAME_USE user_type;
611 unsigned char buf[1024]; 615 unsigned char buf[1024];
612 TOKEN_USER user_token; 616 TOKEN_USER user_token;
613 TOKEN_PRIMARY_GROUP group_token; 617 TOKEN_PRIMARY_GROUP group_token;
614 618
619 /* "None" is the default group name on standalone workstations. */
620 strcpy (dflt_group_name, "None");
615 if (open_process_token (GetCurrentProcess (), TOKEN_QUERY, &token) 621 if (open_process_token (GetCurrentProcess (), TOKEN_QUERY, &token)
616 && get_token_information (token, TokenUser, 622 && get_token_information (token, TokenUser,
617 (PVOID)buf, sizeof (buf), &trash) 623 (PVOID)buf, sizeof (buf), &trash)
618 && (memcpy (&user_token, buf, sizeof (user_token)), 624 && (memcpy (&user_token, buf, sizeof (user_token)),
619 lookup_account_sid (NULL, user_token.User.Sid, name, &length, 625 lookup_account_sid (NULL, user_token.User.Sid, uname, &ulength,
620 domain, &dlength, &user_type))) 626 domain, &dlength, &user_type)))
621 { 627 {
622 strcpy (the_passwd.pw_name, name); 628 strcpy (dflt_passwd.pw_name, uname);
623 /* Determine a reasonable uid value. */ 629 /* Determine a reasonable uid value. */
624 if (stricmp ("administrator", name) == 0) 630 if (stricmp ("administrator", uname) == 0)
625 { 631 {
626 the_passwd.pw_uid = 500; /* well-known Administrator uid */ 632 dflt_passwd.pw_uid = 500; /* well-known Administrator uid */
627 the_passwd.pw_gid = 513; /* well-known None gid */ 633 dflt_passwd.pw_gid = 513; /* well-known None gid */
628 } 634 }
629 else 635 else
630 { 636 {
631 /* Use the last sub-authority value of the RID, the relative 637 /* Use the last sub-authority value of the RID, the relative
632 portion of the SID, as user/group ID. */ 638 portion of the SID, as user/group ID. */
633 DWORD n_subauthorities = 639 DWORD n_subauthorities =
634 *get_sid_sub_authority_count (user_token.User.Sid); 640 *get_sid_sub_authority_count (user_token.User.Sid);
635 641
636 if (n_subauthorities < 1) 642 if (n_subauthorities < 1)
637 the_passwd.pw_uid = 0; /* the "World" RID */ 643 dflt_passwd.pw_uid = 0; /* the "World" RID */
638 else 644 else
639 { 645 {
640 the_passwd.pw_uid = 646 dflt_passwd.pw_uid =
641 *get_sid_sub_authority (user_token.User.Sid, 647 *get_sid_sub_authority (user_token.User.Sid,
642 n_subauthorities - 1); 648 n_subauthorities - 1);
643 } 649 }
644 650
645 /* Get group id */ 651 /* Get group id */
649 memcpy (&group_token, buf, sizeof (group_token)); 655 memcpy (&group_token, buf, sizeof (group_token));
650 n_subauthorities = 656 n_subauthorities =
651 *get_sid_sub_authority_count (group_token.PrimaryGroup); 657 *get_sid_sub_authority_count (group_token.PrimaryGroup);
652 658
653 if (n_subauthorities < 1) 659 if (n_subauthorities < 1)
654 the_passwd.pw_gid = 0; /* the "World" RID */ 660 dflt_passwd.pw_gid = 0; /* the "World" RID */
655 else 661 else
656 { 662 {
657 the_passwd.pw_gid = 663 dflt_passwd.pw_gid =
658 *get_sid_sub_authority (group_token.PrimaryGroup, 664 *get_sid_sub_authority (group_token.PrimaryGroup,
659 n_subauthorities - 1); 665 n_subauthorities - 1);
660 } 666 }
667 dlength = sizeof (domain);
668 if (lookup_account_sid (NULL, group_token.PrimaryGroup,
669 gname, &glength, NULL, &dlength,
670 &user_type))
671 strcpy (dflt_group_name, gname);
661 } 672 }
662 else 673 else
663 the_passwd.pw_gid = the_passwd.pw_uid; 674 dflt_passwd.pw_gid = dflt_passwd.pw_uid;
664 } 675 }
665 } 676 }
666 /* If security calls are not supported (presumably because we 677 /* If security calls are not supported (presumably because we
667 are running under Windows 95), fallback to this. */ 678 are running under Windows 95), fallback to this. */
668 else if (GetUserName (name, &length)) 679 else if (GetUserName (uname, &ulength))
669 { 680 {
670 strcpy (the_passwd.pw_name, name); 681 strcpy (dflt_passwd.pw_name, uname);
671 if (stricmp ("administrator", name) == 0) 682 if (stricmp ("administrator", uname) == 0)
672 the_passwd.pw_uid = 0; 683 dflt_passwd.pw_uid = 0;
673 else 684 else
674 the_passwd.pw_uid = 123; 685 dflt_passwd.pw_uid = 123;
675 the_passwd.pw_gid = the_passwd.pw_uid; 686 dflt_passwd.pw_gid = dflt_passwd.pw_uid;
676 } 687 }
677 else 688 else
678 { 689 {
679 strcpy (the_passwd.pw_name, "unknown"); 690 strcpy (dflt_passwd.pw_name, "unknown");
680 the_passwd.pw_uid = 123; 691 dflt_passwd.pw_uid = 123;
681 the_passwd.pw_gid = 123; 692 dflt_passwd.pw_gid = 123;
682 } 693 }
694 dflt_group.gr_gid = dflt_passwd.pw_gid;
683 695
684 /* Ensure HOME and SHELL are defined. */ 696 /* Ensure HOME and SHELL are defined. */
685 if (getenv ("HOME") == NULL) 697 if (getenv ("HOME") == NULL)
686 abort (); 698 abort ();
687 if (getenv ("SHELL") == NULL) 699 if (getenv ("SHELL") == NULL)
688 abort (); 700 abort ();
689 701
690 /* Set dir and shell from environment variables. */ 702 /* Set dir and shell from environment variables. */
691 strcpy (the_passwd.pw_dir, getenv ("HOME")); 703 strcpy (dflt_passwd.pw_dir, getenv ("HOME"));
692 strcpy (the_passwd.pw_shell, getenv ("SHELL")); 704 strcpy (dflt_passwd.pw_shell, getenv ("SHELL"));
693 705
694 if (token) 706 if (token)
695 CloseHandle (token); 707 CloseHandle (token);
696 } 708 }
697 709
2725 buf->st_ino = fake_inode ^ (fake_inode >> 16); 2737 buf->st_ino = fake_inode ^ (fake_inode >> 16);
2726 else 2738 else
2727 buf->st_ino = fake_inode; 2739 buf->st_ino = fake_inode;
2728 2740
2729 /* consider files to belong to current user */ 2741 /* consider files to belong to current user */
2730 buf->st_uid = the_passwd.pw_uid; 2742 buf->st_uid = dflt_passwd.pw_uid;
2731 buf->st_gid = the_passwd.pw_gid; 2743 buf->st_gid = dflt_passwd.pw_gid;
2732 2744
2733 /* volume_info is set indirectly by map_w32_filename */ 2745 /* volume_info is set indirectly by map_w32_filename */
2734 buf->st_dev = volume_info.serialnum; 2746 buf->st_dev = volume_info.serialnum;
2735 buf->st_rdev = volume_info.serialnum; 2747 buf->st_rdev = volume_info.serialnum;
2736 2748
2813 buf->st_ino = fake_inode ^ (fake_inode >> 16); 2825 buf->st_ino = fake_inode ^ (fake_inode >> 16);
2814 else 2826 else
2815 buf->st_ino = fake_inode; 2827 buf->st_ino = fake_inode;
2816 2828
2817 /* consider files to belong to current user */ 2829 /* consider files to belong to current user */
2818 buf->st_uid = the_passwd.pw_uid; 2830 buf->st_uid = dflt_passwd.pw_uid;
2819 buf->st_gid = the_passwd.pw_gid; 2831 buf->st_gid = dflt_passwd.pw_gid;
2820 2832
2821 buf->st_dev = info.dwVolumeSerialNumber; 2833 buf->st_dev = info.dwVolumeSerialNumber;
2822 buf->st_rdev = info.dwVolumeSerialNumber; 2834 buf->st_rdev = info.dwVolumeSerialNumber;
2823 2835
2824 buf->st_size = info.nFileSizeLow; 2836 buf->st_size = info.nFileSizeLow;