Mercurial > emacs
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; |