3 Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
6 This file is part of Cygwin.
8 This software is a copyrighted work licensed under the terms of the
9 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
12 #define _WIN32_WINNT 0x0600
21 #include <sys/fcntl.h>
22 #include <sys/cygwin.h>
31 #define print_win_error(x) _print_win_error(x, __LINE__)
33 #define MAX_SID_LEN 40
35 static const char version
[] = "$Revision$";
37 extern char *__progname
;
39 SID_IDENTIFIER_AUTHORITY sid_world_auth
= {SECURITY_WORLD_SID_AUTHORITY
};
40 SID_IDENTIFIER_AUTHORITY sid_nt_auth
= {SECURITY_NT_AUTHORITY
};
42 NET_API_STATUS
WINAPI (*dsgetdcname
)(LPWSTR
,LPWSTR
,GUID
*,LPWSTR
,ULONG
,PDOMAIN_CONTROLLER_INFOW
*);
45 #define min(a,b) (((a)<(b))?(a):(b))
57 _print_win_error(DWORD code
, int line
)
61 if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
62 | FORMAT_MESSAGE_IGNORE_INSERTS
,
65 MAKELANGID (LANG_NEUTRAL
, SUBLANG_DEFAULT
),
66 (LPTSTR
) buf
, sizeof (buf
), NULL
))
67 fprintf (stderr
, "mkpasswd (%d): [%lu] %s", line
, code
, buf
);
69 fprintf (stderr
, "mkpasswd (%d): error %lu", line
, code
);
75 HANDLE h
= LoadLibrary ("netapi32.dll");
78 dsgetdcname
= (void *) GetProcAddress (h
, "DsGetDcNameW");
82 get_dcname (char *domain
)
84 static WCHAR server
[INTERNET_MAX_HOST_NAME_LENGTH
+ 1];
87 WCHAR domain_name
[MAX_DOMAIN_NAME_LEN
+ 1];
88 PDOMAIN_CONTROLLER_INFOW pdci
= NULL
;
94 mbstowcs (domain_name
, domain
, strlen (domain
) + 1);
95 rc
= dsgetdcname (NULL
, domain_name
, NULL
, NULL
, 0, &pdci
);
98 rc
= dsgetdcname (NULL
, NULL
, NULL
, NULL
, 0, &pdci
);
99 if (rc
!= ERROR_SUCCESS
)
104 wcscpy (server
, pdci
->DomainControllerName
);
105 NetApiBufferFree (pdci
);
109 rc
= NetGetDCName (NULL
, NULL
, (void *) &servername
);
110 if (rc
== ERROR_SUCCESS
&& domain
)
112 LPWSTR server
= servername
;
113 mbstowcs (domain_name
, domain
, strlen (domain
) + 1);
114 rc
= NetGetDCName (server
, domain_name
, (void *) &servername
);
115 NetApiBufferFree (server
);
117 if (rc
!= ERROR_SUCCESS
)
122 wcscpy (server
, servername
);
123 NetApiBufferFree ((PVOID
) servername
);
136 sprintf(t
, "%u", GetSidIdentifierAuthority (sid
)->Value
[5]);
138 for (i
= 0; i
< *GetSidSubAuthorityCount (sid
); ++i
)
140 sprintf(t
, "-%lu", *GetSidSubAuthority (sid
, i
));
147 psx_dir (char *in
, char *out
)
149 if (isalpha (in
[0]) && in
[1] == ':')
151 sprintf (out
, "/cygdrive/%c", in
[0]);
170 uni2ansi (LPWSTR wcs
, char *mbs
, int size
)
173 wcstombs (mbs
, wcs
, size
);
185 BOOL got_curr_user
= FALSE
;
188 fetch_current_user_sid ()
193 if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY
, &ptok
)
194 || !GetTokenInformation (ptok
, TokenUser
, &curr_user
, sizeof curr_user
,
196 || !GetTokenInformation (ptok
, TokenPrimaryGroup
, &curr_pgrp
,
197 sizeof curr_pgrp
, &len
)
198 || !CloseHandle (ptok
))
200 print_win_error (GetLastError ());
206 current_user (int print_cygpath
, const char *sep
, const char *passed_home_path
,
207 DWORD id_offset
, const char *disp_username
)
209 WCHAR user
[UNLEN
+ 1];
210 WCHAR dom
[MAX_DOMAIN_NAME_LEN
+ 1];
211 DWORD ulen
= UNLEN
+ 1;
212 DWORD dlen
= MAX_DOMAIN_NAME_LEN
+ 1;
213 SID_NAME_USE acc_type
;
215 char homedir_psx
[PATH_MAX
] = {0}, homedir_w32
[MAX_PATH
] = {0};
217 if (!curr_user
.psid
|| !curr_pgrp
.psid
218 || !LookupAccountSidW (NULL
, curr_user
.psid
, user
, &ulen
, dom
, &dlen
,
221 print_win_error (GetLastError ());
225 uid
= *GetSidSubAuthority (curr_user
.psid
,
226 *GetSidSubAuthorityCount(curr_user
.psid
) - 1);
227 gid
= *GetSidSubAuthority (curr_pgrp
.psid
,
228 *GetSidSubAuthorityCount(curr_pgrp
.psid
) - 1);
229 if (passed_home_path
[0] == '\0')
231 char *envhome
= getenv ("HOME");
232 char *envhomedrive
= getenv ("HOMEDRIVE");
233 char *envhomepath
= getenv ("HOMEPATH");
235 if (envhome
&& envhome
[0])
238 cygwin_conv_path (CCP_WIN_A_TO_POSIX
| CCP_ABSOLUTE
, envhome
,
239 homedir_psx
, PATH_MAX
);
241 psx_dir (envhome
, homedir_psx
);
243 else if (envhomepath
&& envhomepath
[0])
246 strlcpy (homedir_w32
, envhomedrive
, sizeof (homedir_w32
));
247 if (envhomepath
[0] != '\\')
248 strlcat (homedir_w32
, "\\", sizeof (homedir_w32
));
249 strlcat (homedir_w32
, envhomepath
, sizeof (homedir_w32
));
251 cygwin_conv_path (CCP_WIN_A_TO_POSIX
| CCP_ABSOLUTE
, homedir_w32
,
252 homedir_psx
, PATH_MAX
);
254 psx_dir (homedir_w32
, homedir_psx
);
258 wcstombs (stpncpy (homedir_psx
, "/home/", sizeof (homedir_psx
)),
259 user
, sizeof (homedir_psx
) - 6);
260 homedir_psx
[PATH_MAX
- 1] = '\0';
265 char *p
= stpncpy (homedir_psx
, passed_home_path
, sizeof (homedir_psx
));
266 wcstombs (p
, user
, sizeof (homedir_psx
) - (p
- homedir_psx
));
267 homedir_psx
[PATH_MAX
- 1] = '\0';
270 printf ("%ls%s%ls:unused:%lu:%lu:U-%ls\\%ls,%s:%s:/bin/bash\n",
278 put_sid (curr_user
.psid
),
283 enum_unix_users (domlist_t
*dom_or_machine
, const char *sep
, DWORD id_offset
,
284 char *unix_user_list
)
286 WCHAR machine
[INTERNET_MAX_HOST_NAME_LENGTH
+ 1];
287 PWCHAR servername
= NULL
;
288 char *d_or_m
= dom_or_machine
? dom_or_machine
->str
: NULL
;
289 BOOL with_dom
= dom_or_machine
? dom_or_machine
->with_dom
: FALSE
;
290 SID_IDENTIFIER_AUTHORITY auth
= { { 0, 0, 0, 0, 0, 22 } };
291 char *ustr
, *user_list
;
292 WCHAR user
[UNLEN
+ sizeof ("Unix User\\") + 1];
293 WCHAR dom
[MAX_DOMAIN_NAME_LEN
+ 1];
294 DWORD ulen
, dlen
, sidlen
;
296 char psid_buffer
[MAX_SID_LEN
];
297 SID_NAME_USE acc_type
;
302 int ret
= mbstowcs (machine
, d_or_m
, INTERNET_MAX_HOST_NAME_LENGTH
+ 1);
303 if (ret
< 1 || ret
>= INTERNET_MAX_HOST_NAME_LENGTH
+ 1)
305 fprintf (stderr
, "%s: Invalid machine name '%s'. Skipping...\n",
309 servername
= machine
;
311 if (!AllocateAndInitializeSid (&auth
, 2, 1, 0, 0, 0, 0, 0, 0, 0, &psid
))
314 if (!(user_list
= strdup (unix_user_list
)))
320 for (ustr
= strtok (user_list
, ","); ustr
; ustr
= strtok (NULL
, ","))
322 if (!isdigit (ustr
[0]) && ustr
[0] != '-')
324 PWCHAR p
= wcpcpy (user
, L
"Unix User\\");
325 ret
= mbstowcs (p
, ustr
, UNLEN
+ 1);
326 if (ret
< 1 || ret
>= UNLEN
+ 1)
327 fprintf (stderr
, "%s: Invalid user name '%s'. Skipping...\n",
329 else if (LookupAccountNameW (servername
, user
,
330 psid
= (PSID
) psid_buffer
,
331 (sidlen
= MAX_SID_LEN
, &sidlen
),
333 (dlen
= MAX_DOMAIN_NAME_LEN
+ 1, &dlen
),
335 printf ("%s%s%ls:unused:%lu:99999:,%s::\n",
336 with_dom
? "Unix User" : "",
340 *GetSidSubAuthority (psid
,
341 *GetSidSubAuthorityCount(psid
) - 1),
351 start
= strtol (p
, &p
, 10);
354 else if (*p
++ != '-' || !isdigit (*p
)
355 || (stop
= strtol (p
, &p
, 10)) < start
|| *p
)
357 fprintf (stderr
, "%s: Malformed unix user list entry '%s'. "
358 "Skipping...\n", __progname
, ustr
);
361 for (; start
<= stop
; ++ start
)
363 *GetSidSubAuthority (psid
, *GetSidSubAuthorityCount(psid
) - 1)
365 if (LookupAccountSidW (servername
, psid
,
366 user
, (ulen
= GNLEN
+ 1, &ulen
),
368 (dlen
= MAX_DOMAIN_NAME_LEN
+ 1, &dlen
),
370 && !iswdigit (user
[0]))
371 printf ("%s%s%ls:unused:%lu:99999:,%s::\n",
372 with_dom
? "Unix User" : "",
386 enum_users (BOOL domain
, domlist_t
*dom_or_machine
, const char *sep
,
387 int print_cygpath
, const char *passed_home_path
, DWORD id_offset
,
390 WCHAR machine
[INTERNET_MAX_HOST_NAME_LENGTH
+ 1];
391 PWCHAR servername
= NULL
;
392 char *d_or_m
= dom_or_machine
? dom_or_machine
->str
: NULL
;
393 BOOL with_dom
= dom_or_machine
? dom_or_machine
->with_dom
: FALSE
;
395 DWORD entriesread
= 0;
396 DWORD totalentries
= 0;
397 DWORD resume_handle
= 0;
399 WCHAR uni_name
[UNLEN
+ 1];
403 servername
= get_dcname (d_or_m
);
404 if (servername
== (PWCHAR
) -1)
409 int ret
= mbstowcs (machine
, d_or_m
, INTERNET_MAX_HOST_NAME_LENGTH
+ 1);
410 if (ret
< 1 || ret
>= INTERNET_MAX_HOST_NAME_LENGTH
+ 1)
412 fprintf (stderr
, "%s: Invalid machine name '%s'. Skipping...\n",
416 servername
= machine
;
423 if (disp_username
!= NULL
)
425 mbstowcs (uni_name
, disp_username
, UNLEN
+ 1);
426 rc
= NetUserGetInfo (servername
, (LPWSTR
) &uni_name
, 3,
431 rc
= NetUserEnum (servername
, 3, FILTER_NORMAL_ACCOUNT
,
432 (void *) &buffer
, MAX_PREFERRED_LENGTH
,
433 &entriesread
, &totalentries
, &resume_handle
);
436 case ERROR_ACCESS_DENIED
:
440 case ERROR_MORE_DATA
:
449 for (i
= 0; i
< entriesread
; i
++)
451 char homedir_psx
[PATH_MAX
];
452 char homedir_w32
[MAX_PATH
];
453 WCHAR domain_name
[MAX_DOMAIN_NAME_LEN
+ 1];
454 DWORD domname_len
= MAX_DOMAIN_NAME_LEN
+ 1;
455 char psid_buffer
[MAX_SID_LEN
];
456 PSID psid
= (PSID
) psid_buffer
;
457 DWORD sid_length
= MAX_SID_LEN
;
458 SID_NAME_USE acc_type
;
460 int uid
= buffer
[i
].usri3_user_id
;
461 int gid
= buffer
[i
].usri3_primary_group_id
;
462 homedir_w32
[0] = homedir_psx
[0] = '\0';
463 if (passed_home_path
[0] == '\0')
465 uni2ansi (buffer
[i
].usri3_home_dir
, homedir_w32
,
466 sizeof (homedir_w32
));
467 if (homedir_w32
[0] != '\0')
470 cygwin_conv_path (CCP_WIN_A_TO_POSIX
| CCP_ABSOLUTE
,
471 homedir_w32
, homedir_psx
, PATH_MAX
);
473 psx_dir (homedir_w32
, homedir_psx
);
476 uni2ansi (buffer
[i
].usri3_name
,
477 stpcpy (homedir_psx
, "/home/"), PATH_MAX
- 6);
480 uni2ansi (buffer
[i
].usri3_name
,
481 stpcpy (homedir_psx
, passed_home_path
),
482 PATH_MAX
- strlen (passed_home_path
));
484 if (!LookupAccountNameW (servername
, buffer
[i
].usri3_name
,
485 psid
, &sid_length
, domain_name
,
486 &domname_len
, &acc_type
))
488 print_win_error(GetLastError ());
489 fprintf(stderr
, " (%ls)\n", buffer
[i
].usri3_name
);
492 else if (acc_type
== SidTypeDomain
)
494 WCHAR domname
[MAX_DOMAIN_NAME_LEN
+ UNLEN
+ 2];
496 wcscpy (domname
, domain
|| !servername
497 ? domain_name
: servername
);
498 wcscat (domname
, L
"\\");
499 wcscat (domname
, buffer
[i
].usri3_name
);
500 sid_length
= MAX_SID_LEN
;
501 domname_len
= sizeof (domname
);
502 if (!LookupAccountNameW (servername
, domname
, psid
,
503 &sid_length
, domain_name
,
504 &domname_len
, &acc_type
))
506 print_win_error(GetLastError ());
507 fprintf(stderr
, " (%ls)\n", domname
);
511 if (EqualSid (curr_user
.psid
, psid
))
512 got_curr_user
= TRUE
;
513 printf ("%ls%s%ls:unused:%lu:%lu:%ls%sU-%ls\\%ls,%s:%s:/bin/bash\n",
514 with_dom
? domain_name
: L
"",
516 buffer
[i
].usri3_name
,
519 buffer
[i
].usri3_full_name
?: L
"",
520 buffer
[i
].usri3_full_name
521 && buffer
[i
].usri3_full_name
[0] ? "," : "",
523 buffer
[i
].usri3_name
,
528 NetApiBufferFree (buffer
);
531 while (rc
== ERROR_MORE_DATA
);
537 print_special (PSID_IDENTIFIER_AUTHORITY auth
, BYTE cnt
,
538 DWORD sub1
, DWORD sub2
, DWORD sub3
, DWORD sub4
,
539 DWORD sub5
, DWORD sub6
, DWORD sub7
, DWORD sub8
)
541 WCHAR user
[UNLEN
+ 1], dom
[MAX_DOMAIN_NAME_LEN
+ 1];
542 DWORD len
, len2
, rid
;
544 SID_NAME_USE acc_type
;
546 if (AllocateAndInitializeSid (auth
, cnt
, sub1
, sub2
, sub3
, sub4
,
547 sub5
, sub6
, sub7
, sub8
, &sid
))
549 if (LookupAccountSidW (NULL
, sid
,
550 user
, (len
= UNLEN
+ 1, &len
),
551 dom
, (len2
= MAX_DOMAIN_NAME_LEN
+ 1, &len
),
570 printf ("%ls:*:%lu:%lu:,%s::\n",
571 user
, rid
, rid
== 18 ? 544 : rid
, /* SYSTEM hack */
579 usage (FILE * stream
)
582 "Usage: mkpasswd [OPTIONS]...\n"
583 "Print /etc/passwd file to stdout\n"
586 " -l,--local [machine[,offset]]\n"
587 " print local user accounts with uid offset offset\n"
588 " (from local machine if no machine specified)\n"
589 " -L,--Local [machine[,offset]]\n"
590 " ditto, but generate username with machine prefix\n"
591 " -d,--domain [domain[,offset]]\n"
592 " print domain accounts with uid offset offset\n"
593 " (from current domain if no domain specified)\n"
594 " -D,--Domain [domain[,offset]]\n"
595 " ditto, but generate username with domain prefix\n"
596 " -c,--current print current user\n"
597 " -C,--Current ditto, but generate username with machine or\n"
599 " -S,--separator char for -L, -D, -C use character char as domain\\user\n"
600 " separator in username instead of the default '\\'\n"
601 " -o,--id-offset offset change the default offset (10000) added to uids\n"
602 " in domain or foreign server accounts.\n"
603 " -u,--username username only return information for the specified user\n"
604 " one of -l, -L, -d, -D must be specified, too\n"
605 " -p,--path-to-home path use specified path instead of user account home dir\n"
607 " -m,--no-mount don't use mount points for home dir\n"
608 " -U,--unix userlist additionally print UNIX users when using -l or -L\n"
609 " on a UNIX Samba server\n"
610 " userlist is a comma-separated list of usernames\n"
611 " or uid ranges (root,-25,50-100).\n"
612 " (enumerating large ranges can take a long time!)\n"
613 " -s,--no-sids (ignored)\n"
614 " -g,--local-groups (ignored)\n"
615 " -h,--help displays this message\n"
616 " -v,--version version information and exit\n"
618 "Default is to print local accounts on stand-alone machines, domain accounts\n"
619 "on domain controllers and domain member machines.\n");
623 struct option longopts
[] = {
624 {"current", no_argument
, NULL
, 'c'},
625 {"Current", no_argument
, NULL
, 'C'},
626 {"domain", optional_argument
, NULL
, 'd'},
627 {"Domain", optional_argument
, NULL
, 'D'},
628 {"local-groups", no_argument
, NULL
, 'g'},
629 {"help", no_argument
, NULL
, 'h'},
630 {"local", optional_argument
, NULL
, 'l'},
631 {"Local", optional_argument
, NULL
, 'L'},
632 {"no-mount", no_argument
, NULL
, 'm'},
633 {"id-offset", required_argument
, NULL
, 'o'},
634 {"path-to-home", required_argument
, NULL
, 'p'},
635 {"no-sids", no_argument
, NULL
, 's'},
636 {"separator", required_argument
, NULL
, 'S'},
637 {"username", required_argument
, NULL
, 'u'},
638 {"unix", required_argument
, NULL
, 'U'},
639 {"version", no_argument
, NULL
, 'v'},
640 {0, no_argument
, NULL
, 0}
643 char opts
[] = "cCd::D::ghl::L::mo:sS:p:u:U:v";
648 const char *v
= strchr (version
, ':');
658 len
= strchr (v
, ' ') - v
;
661 mkpasswd (cygwin) %.*s\n\
662 passwd File Generator\n\
663 Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2008 Red Hat, Inc.\n\
665 ", len
, v
, __DATE__
);
671 /* Generate service starter account entries. */
672 printf ("SYSTEM:*:18:544:,S-1-5-18::\n");
673 printf ("LocalService:*:19:544:U-NT AUTHORITY\\LocalService,S-1-5-19::\n");
674 printf ("NetworkService:*:20:544:U-NT AUTHORITY\\NetworkService,S-1-5-20::\n");
675 /* Get 'administrators' group (has localized name). */
676 print_special (&sid_nt_auth
, 2, SECURITY_BUILTIN_DOMAIN_RID
,
677 DOMAIN_ALIAS_RID_ADMINS
, 0, 0, 0, 0, 0, 0);
680 static PPOLICY_PRIMARY_DOMAIN_INFO p_dom
;
683 fetch_primary_domain ()
686 LSA_OBJECT_ATTRIBUTES oa
= { 0, 0, 0, 0, 0, 0 };
691 status
= LsaOpenPolicy (NULL
, &oa
, POLICY_VIEW_LOCAL_INFORMATION
, &lsa
);
692 if (!NT_SUCCESS (status
))
694 status
= LsaQueryInformationPolicy (lsa
, PolicyPrimaryDomainInformation
,
697 if (!NT_SUCCESS (status
))
704 main (int argc
, char **argv
)
706 int print_domlist
= 0;
707 domlist_t domlist
[32];
709 int print_cygpath
= 1;
710 int print_current
= 0;
711 char *print_unix
= NULL
;
712 const char *sep_char
= "\\";
713 DWORD id_offset
= 10000, off
;
715 char *disp_username
= NULL
;
716 char passed_home_path
[PATH_MAX
];
719 passed_home_path
[0] = '\0';
721 setmode (1, O_BINARY
);
724 in_domain
= fetch_primary_domain ();
727 enum_std_accounts ();
729 enum_users (TRUE
, NULL
, sep_char
, print_cygpath
, passed_home_path
,
730 10000, disp_username
);
732 enum_users (FALSE
, NULL
, sep_char
, print_cygpath
, passed_home_path
, 0,
737 while ((c
= getopt_long (argc
, argv
, opts
, longopts
, NULL
)) != EOF
)
744 if (print_domlist
>= 32)
746 fprintf (stderr
, "%s: Can not enumerate from more than 32 "
747 "domains and machines.\n", __progname
);
750 domlist
[print_domlist
].domain
= (c
== 'd' || c
== 'D');
752 argv
[optind
] && argv
[optind
][0] != '-' ? argv
[optind
] : NULL
;
753 for (i
= 0; i
< print_domlist
; ++i
)
754 if (domlist
[i
].domain
== domlist
[print_domlist
].domain
755 && ((!domlist
[i
].str
&& !opt
)
756 || (domlist
[i
].str
&& opt
757 && (off
= strlen (domlist
[i
].str
))
758 && !strncmp (domlist
[i
].str
, opt
, off
)
759 && (!opt
[off
] || opt
[off
] == ','))))
761 fprintf (stderr
, "%s: Duplicate %s '%s'. Skipping...\n",
762 __progname
, domlist
[i
].domain
? "domain" : "machine",
766 domlist
[print_domlist
].str
= opt
;
767 domlist
[print_domlist
].id_offset
= ULONG_MAX
;
768 if (opt
&& (p
= strchr (opt
, ',')))
772 || (domlist
[print_domlist
].id_offset
= strtol (p
+ 1, &ep
, 10)
775 fprintf (stderr
, "%s: Malformed domain,offset string '%s'. "
776 "Skipping...\n", __progname
, opt
);
781 domlist
[print_domlist
++].with_dom
= (c
== 'D' || c
== 'L');
786 if (strlen (sep_char
) > 1)
788 fprintf (stderr
, "%s: Only one character allowed as domain\\user "
789 "separator character.\n", __progname
);
792 if (*sep_char
== ':')
794 fprintf (stderr
, "%s: Colon not allowed as domain\\user separator "
795 "character.\n", __progname
);
809 id_offset
= strtoul (optarg
, &ep
, 10);
812 fprintf (stderr
, "%s: Malformed offset '%s'. "
813 "Skipping...\n", __progname
, optarg
);
825 if (optarg
[0] != '/')
827 fprintf (stderr
, "%s: '%s' is not a fully qualified path.\n",
831 strcpy (passed_home_path
, optarg
);
832 if (optarg
[strlen (optarg
)-1] != '/')
833 strcat (passed_home_path
, "/");
836 disp_username
= optarg
;
845 fprintf (stderr
, "Try '%s --help' for more information.\n", __progname
);
849 fetch_current_user_sid ();
852 for (i
= 0; i
< print_domlist
; ++i
)
854 DWORD my_off
= (domlist
[i
].domain
|| domlist
[i
].str
)
855 ? domlist
[i
].id_offset
!= ULONG_MAX
856 ? domlist
[i
].id_offset
: off
: 0;
857 if (!domlist
[i
].domain
&& domlist
[i
].str
&& print_unix
)
858 enum_unix_users (domlist
+ i
, sep_char
, my_off
, print_unix
);
860 enum_std_accounts ();
861 enum_users (domlist
[i
].domain
, domlist
+ i
, sep_char
, print_cygpath
,
862 passed_home_path
, my_off
, disp_username
);
867 if (print_current
&& !got_curr_user
)
868 current_user (print_cygpath
, sep_char
, passed_home_path
, off
,