summaryrefslogtreecommitdiffstats
path: root/winsup/utils/passwd.c
diff options
context:
space:
mode:
authorcvs2svn <>2014-02-18 19:58:41 +0000
committercvs2svn <>2014-02-18 19:58:41 +0000
commitb5279ecc51ff751ccd052fbb7c20efd529575f7e (patch)
tree64141e96a5d64ae59fb7f410270e4daa41878a03 /winsup/utils/passwd.c
parenta2a48cb593a9b3cc3f5c63c39f52c32db31cec50 (diff)
downloadcygnal-b5279ecc51ff751ccd052fbb7c20efd529575f7e.tar.gz
cygnal-b5279ecc51ff751ccd052fbb7c20efd529575f7e.tar.bz2
cygnal-b5279ecc51ff751ccd052fbb7c20efd529575f7e.zip
This commit was manufactured by cvs2svn to create tag 'cygwin-pre-user-db'.cygwin-pre-user-db
Sprout from cygwin-1_7_29-release-branchpoint 2014-02-18 19:58:40 UTC cvs2svn 'This commit was manufactured by cvs2svn to create branch 'cygwin-1_7_29' Cherrypick from master 2014-02-08 22:25:11 UTC Corinna Vinschen <corinna@vinschen.de> 'Fix ChangeLog': winsup/cygwin/ChangeLog winsup/cygwin/miscfuncs.cc winsup/cygwin/miscfuncs.h winsup/cygwin/mount.cc Delete: winsup/COPYING winsup/CYGWIN_LICENSE winsup/ChangeLog winsup/Makefile.common winsup/Makefile.in winsup/README winsup/acinclude.m4 winsup/aclocal.m4 winsup/autogen.sh winsup/c++wrap winsup/ccwrap winsup/config.guess winsup/config.sub winsup/configure winsup/configure.ac winsup/configure.cygwin winsup/cygserver/ChangeLog winsup/cygserver/ChangeLog.64bit winsup/cygserver/Makefile.in winsup/cygserver/README winsup/cygserver/aclocal.m4 winsup/cygserver/autogen.sh winsup/cygserver/bsd_helper.cc winsup/cygserver/bsd_helper.h winsup/cygserver/bsd_log.cc winsup/cygserver/bsd_log.h winsup/cygserver/bsd_mutex.cc winsup/cygserver/bsd_mutex.h winsup/cygserver/client.cc winsup/cygserver/configure winsup/cygserver/configure.ac winsup/cygserver/cygserver-config winsup/cygserver/cygserver.cc winsup/cygserver/cygserver.conf winsup/cygserver/msg.cc winsup/cygserver/process.cc winsup/cygserver/process.h winsup/cygserver/sem.cc winsup/cygserver/setpwd.cc winsup/cygserver/shm.cc winsup/cygserver/sysv_msg.cc winsup/cygserver/sysv_sem.cc winsup/cygserver/sysv_shm.cc winsup/cygserver/threaded_queue.cc winsup/cygserver/threaded_queue.h winsup/cygserver/transport.cc winsup/cygserver/transport.h winsup/cygserver/transport_pipes.cc winsup/cygserver/transport_pipes.h winsup/cygserver/woutsup.h winsup/cygwin/release/1.7.29 winsup/doc/.cvsignore winsup/doc/ChangeLog winsup/doc/Makefile.in winsup/doc/README winsup/doc/Wishlist winsup/doc/aclocal.m4 winsup/doc/bodysnatcher.pl winsup/doc/configure winsup/doc/configure.ac winsup/doc/cygserver.xml winsup/doc/cygwin-api.in.xml winsup/doc/cygwin-ug-net.xml winsup/doc/cygwin.xsl winsup/doc/cygwinenv.xml winsup/doc/dll.xml winsup/doc/doctool.c winsup/doc/doctool.txt winsup/doc/effectively.xml winsup/doc/faq-api.xml winsup/doc/faq-copyright.xml winsup/doc/faq-programming.xml winsup/doc/faq-resources.xml winsup/doc/faq-setup.xml winsup/doc/faq-using.xml winsup/doc/faq-what.xml winsup/doc/faq.xml winsup/doc/fhandler-tut.txt winsup/doc/filemodes.xml winsup/doc/fo.xsl winsup/doc/gcc.xml winsup/doc/gdb.xml winsup/doc/highlights.xml winsup/doc/legal.xml winsup/doc/new-features.xml winsup/doc/ntsec.xml winsup/doc/ov-ex-unix.xml winsup/doc/ov-ex-win.xml winsup/doc/overview.xml winsup/doc/pathnames.xml winsup/doc/programming.xml winsup/doc/setup-env.xml winsup/doc/setup-files.xml winsup/doc/setup-locale.xml winsup/doc/setup-maxmem.xml winsup/doc/setup-net.xml winsup/doc/specialnames.xml winsup/doc/textbinary.xml winsup/doc/ug-info.xml winsup/doc/using.xml winsup/doc/windres.xml winsup/doc/xidepend winsup/install-sh winsup/lsaauth/ChangeLog winsup/lsaauth/ChangeLog.64bit winsup/lsaauth/Makefile.in winsup/lsaauth/aclocal.m4 winsup/lsaauth/configure winsup/lsaauth/configure.ac winsup/lsaauth/cyglsa-config winsup/lsaauth/cyglsa.c winsup/lsaauth/cyglsa.din winsup/lsaauth/cyglsa64.def winsup/testsuite/ChangeLog winsup/testsuite/Makefile.in winsup/testsuite/README winsup/testsuite/aclocal.m4 winsup/testsuite/config/default.exp winsup/testsuite/configure winsup/testsuite/configure.ac winsup/testsuite/cygrun.c winsup/testsuite/libltp/include/dataascii.h winsup/testsuite/libltp/include/databin.h winsup/testsuite/libltp/include/file_lock.h winsup/testsuite/libltp/include/forker.h winsup/testsuite/libltp/include/open_flags.h winsup/testsuite/libltp/include/pattern.h winsup/testsuite/libltp/include/random_range.h winsup/testsuite/libltp/include/rmobj.h winsup/testsuite/libltp/include/search_path.h winsup/testsuite/libltp/include/str_to_bytes.h winsup/testsuite/libltp/include/string_to_tokens.h winsup/testsuite/libltp/include/test.h winsup/testsuite/libltp/include/tlibio.h winsup/testsuite/libltp/include/usctest.h winsup/testsuite/libltp/include/write_log.h winsup/testsuite/libltp/lib/dataascii.c winsup/testsuite/libltp/lib/databin.c winsup/testsuite/libltp/lib/datapid.c winsup/testsuite/libltp/lib/forker.c winsup/testsuite/libltp/lib/get_high_address.c winsup/testsuite/libltp/lib/libtestsuite.c winsup/testsuite/libltp/lib/open_flags.c winsup/testsuite/libltp/lib/parse_opts.c winsup/testsuite/libltp/lib/pattern.c winsup/testsuite/libltp/lib/rmobj.c winsup/testsuite/libltp/lib/search_path.c winsup/testsuite/libltp/lib/str_to_bytes.c winsup/testsuite/libltp/lib/string_to_tokens.c winsup/testsuite/libltp/lib/tst_res.c winsup/testsuite/libltp/lib/tst_sig.c winsup/testsuite/libltp/lib/tst_tmpdir.c winsup/testsuite/libltp/lib/write_log.c winsup/testsuite/winsup.api/checksignal.c winsup/testsuite/winsup.api/crlf.c winsup/testsuite/winsup.api/cygload.cc winsup/testsuite/winsup.api/cygload.exp winsup/testsuite/winsup.api/cygload.h winsup/testsuite/winsup.api/devdsp.c winsup/testsuite/winsup.api/devdsp_okay.h winsup/testsuite/winsup.api/devzero.c winsup/testsuite/winsup.api/iospeed.c winsup/testsuite/winsup.api/known_bugs.tcl winsup/testsuite/winsup.api/ltp/access01.c winsup/testsuite/winsup.api/ltp/access03.c winsup/testsuite/winsup.api/ltp/access04.c winsup/testsuite/winsup.api/ltp/access05.c winsup/testsuite/winsup.api/ltp/alarm01.c winsup/testsuite/winsup.api/ltp/alarm02.c winsup/testsuite/winsup.api/ltp/alarm03.c winsup/testsuite/winsup.api/ltp/alarm07.c winsup/testsuite/winsup.api/ltp/asyncio02.c winsup/testsuite/winsup.api/ltp/chdir02.c winsup/testsuite/winsup.api/ltp/chdir04.c winsup/testsuite/winsup.api/ltp/chmod01.c winsup/testsuite/winsup.api/ltp/chmod02.c winsup/testsuite/winsup.api/ltp/chown01.c winsup/testsuite/winsup.api/ltp/close01.c winsup/testsuite/winsup.api/ltp/close02.c winsup/testsuite/winsup.api/ltp/close08.c winsup/testsuite/winsup.api/ltp/creat01.c winsup/testsuite/winsup.api/ltp/creat03.c winsup/testsuite/winsup.api/ltp/creat09.c winsup/testsuite/winsup.api/ltp/dup01.c winsup/testsuite/winsup.api/ltp/dup02.c winsup/testsuite/winsup.api/ltp/dup03.c winsup/testsuite/winsup.api/ltp/dup04.c winsup/testsuite/winsup.api/ltp/dup05.c winsup/testsuite/winsup.api/ltp/execl01.c winsup/testsuite/winsup.api/ltp/execle01.c winsup/testsuite/winsup.api/ltp/execlp01.c winsup/testsuite/winsup.api/ltp/execv01.c winsup/testsuite/winsup.api/ltp/execve01.c winsup/testsuite/winsup.api/ltp/execvp01.c winsup/testsuite/winsup.api/ltp/exit01.c winsup/testsuite/winsup.api/ltp/exit02.c winsup/testsuite/winsup.api/ltp/fchdir01.c winsup/testsuite/winsup.api/ltp/fchdir02.c winsup/testsuite/winsup.api/ltp/fchmod01.c winsup/testsuite/winsup.api/ltp/fchown01.c winsup/testsuite/winsup.api/ltp/fcntl02.c winsup/testsuite/winsup.api/ltp/fcntl03.c winsup/testsuite/winsup.api/ltp/fcntl04.c winsup/testsuite/winsup.api/ltp/fcntl05.c winsup/testsuite/winsup.api/ltp/fcntl07.c winsup/testsuite/winsup.api/ltp/fcntl07B.c winsup/testsuite/winsup.api/ltp/fcntl08.c winsup/testsuite/winsup.api/ltp/fcntl09.c winsup/testsuite/winsup.api/ltp/fcntl10.c winsup/testsuite/winsup.api/ltp/fork01.c winsup/testsuite/winsup.api/ltp/fork02.c winsup/testsuite/winsup.api/ltp/fork03.c winsup/testsuite/winsup.api/ltp/fork04.c winsup/testsuite/winsup.api/ltp/fork06.c winsup/testsuite/winsup.api/ltp/fork07.c winsup/testsuite/winsup.api/ltp/fork09.c winsup/testsuite/winsup.api/ltp/fork10.c winsup/testsuite/winsup.api/ltp/fork11.c winsup/testsuite/winsup.api/ltp/fpathconf01.c winsup/testsuite/winsup.api/ltp/fstat01.c winsup/testsuite/winsup.api/ltp/fstat02.c winsup/testsuite/winsup.api/ltp/fstat03.c winsup/testsuite/winsup.api/ltp/fstat04.c winsup/testsuite/winsup.api/ltp/fsync01.c winsup/testsuite/winsup.api/ltp/ftruncate01.c winsup/testsuite/winsup.api/ltp/ftruncate02.c winsup/testsuite/winsup.api/ltp/ftruncate03.c winsup/testsuite/winsup.api/ltp/getegid01.c winsup/testsuite/winsup.api/ltp/geteuid01.c winsup/testsuite/winsup.api/ltp/getgid01.c winsup/testsuite/winsup.api/ltp/getgid02.c winsup/testsuite/winsup.api/ltp/getgid03.c winsup/testsuite/winsup.api/ltp/getgroups01.c winsup/testsuite/winsup.api/ltp/getgroups02.c winsup/testsuite/winsup.api/ltp/gethostid01.c winsup/testsuite/winsup.api/ltp/gethostname01.c winsup/testsuite/winsup.api/ltp/getpgid01.c winsup/testsuite/winsup.api/ltp/getpgid02.c winsup/testsuite/winsup.api/ltp/getpgrp01.c winsup/testsuite/winsup.api/ltp/getpid01.c winsup/testsuite/winsup.api/ltp/getpid02.c winsup/testsuite/winsup.api/ltp/getppid01.c winsup/testsuite/winsup.api/ltp/getppid02.c winsup/testsuite/winsup.api/ltp/getuid01.c winsup/testsuite/winsup.api/ltp/getuid02.c winsup/testsuite/winsup.api/ltp/getuid03.c winsup/testsuite/winsup.api/ltp/kill01.c winsup/testsuite/winsup.api/ltp/kill02.c winsup/testsuite/winsup.api/ltp/kill03.c winsup/testsuite/winsup.api/ltp/kill04.c winsup/testsuite/winsup.api/ltp/kill09.c winsup/testsuite/winsup.api/ltp/link02.c winsup/testsuite/winsup.api/ltp/link03.c winsup/testsuite/winsup.api/ltp/link04.c winsup/testsuite/winsup.api/ltp/link05.c winsup/testsuite/winsup.api/ltp/lseek01.c winsup/testsuite/winsup.api/ltp/lseek02.c winsup/testsuite/winsup.api/ltp/lseek03.c winsup/testsuite/winsup.api/ltp/lseek04.c winsup/testsuite/winsup.api/ltp/lseek05.c winsup/testsuite/winsup.api/ltp/lseek06.c winsup/testsuite/winsup.api/ltp/lseek07.c winsup/testsuite/winsup.api/ltp/lseek08.c winsup/testsuite/winsup.api/ltp/lseek09.c winsup/testsuite/winsup.api/ltp/lseek10.c winsup/testsuite/winsup.api/ltp/lstat02.c winsup/testsuite/winsup.api/ltp/mkdir01.c winsup/testsuite/winsup.api/ltp/mkdir08.c winsup/testsuite/winsup.api/ltp/mknod01.c winsup/testsuite/winsup.api/ltp/mmap001.c winsup/testsuite/winsup.api/ltp/mmap02.c winsup/testsuite/winsup.api/ltp/mmap03.c winsup/testsuite/winsup.api/ltp/mmap04.c winsup/testsuite/winsup.api/ltp/mmap05.c winsup/testsuite/winsup.api/ltp/mmap06.c winsup/testsuite/winsup.api/ltp/mmap07.c winsup/testsuite/winsup.api/ltp/mmap08.c winsup/testsuite/winsup.api/ltp/munmap01.c winsup/testsuite/winsup.api/ltp/munmap02.c winsup/testsuite/winsup.api/ltp/nice05.c winsup/testsuite/winsup.api/ltp/open02.c winsup/testsuite/winsup.api/ltp/open03.c winsup/testsuite/winsup.api/ltp/pathconf01.c winsup/testsuite/winsup.api/ltp/pause01.c winsup/testsuite/winsup.api/ltp/pipe01.c winsup/testsuite/winsup.api/ltp/pipe08.c winsup/testsuite/winsup.api/ltp/pipe09.c winsup/testsuite/winsup.api/ltp/pipe10.c winsup/testsuite/winsup.api/ltp/pipe11.c winsup/testsuite/winsup.api/ltp/poll01.c winsup/testsuite/winsup.api/ltp/read01.c winsup/testsuite/winsup.api/ltp/read04.c winsup/testsuite/winsup.api/ltp/readdir01.c winsup/testsuite/winsup.api/ltp/readlink01.c winsup/testsuite/winsup.api/ltp/readlink02.c winsup/testsuite/winsup.api/ltp/readlink03.c winsup/testsuite/winsup.api/ltp/rename01.c winsup/testsuite/winsup.api/ltp/rename02.c winsup/testsuite/winsup.api/ltp/rename08.c winsup/testsuite/winsup.api/ltp/rename10.c winsup/testsuite/winsup.api/ltp/rmdir01.c winsup/testsuite/winsup.api/ltp/rmdir04.c winsup/testsuite/winsup.api/ltp/rmdir05.c winsup/testsuite/winsup.api/ltp/sbrk01.c winsup/testsuite/winsup.api/ltp/select01.c winsup/testsuite/winsup.api/ltp/select02.c winsup/testsuite/winsup.api/ltp/select03.c winsup/testsuite/winsup.api/ltp/setgid01.c winsup/testsuite/winsup.api/ltp/setgroups01.c winsup/testsuite/winsup.api/ltp/setpgid01.c winsup/testsuite/winsup.api/ltp/setregid01.c winsup/testsuite/winsup.api/ltp/setreuid01.c winsup/testsuite/winsup.api/ltp/setuid01.c winsup/testsuite/winsup.api/ltp/setuid02.c winsup/testsuite/winsup.api/ltp/signal03.c winsup/testsuite/winsup.api/ltp/stat01.c winsup/testsuite/winsup.api/ltp/stat02.c winsup/testsuite/winsup.api/ltp/stat03.c winsup/testsuite/winsup.api/ltp/stat05.c winsup/testsuite/winsup.api/ltp/stat06.c winsup/testsuite/winsup.api/ltp/symlink01.c winsup/testsuite/winsup.api/ltp/symlink02.c winsup/testsuite/winsup.api/ltp/symlink03.c winsup/testsuite/winsup.api/ltp/symlink04.c winsup/testsuite/winsup.api/ltp/symlink05.c winsup/testsuite/winsup.api/ltp/sync01.c winsup/testsuite/winsup.api/ltp/sync02.c winsup/testsuite/winsup.api/ltp/time01.c winsup/testsuite/winsup.api/ltp/time02.c winsup/testsuite/winsup.api/ltp/times01.c winsup/testsuite/winsup.api/ltp/times02.c winsup/testsuite/winsup.api/ltp/times03.c winsup/testsuite/winsup.api/ltp/truncate01.c winsup/testsuite/winsup.api/ltp/truncate02.c winsup/testsuite/winsup.api/ltp/ulimit01.c winsup/testsuite/winsup.api/ltp/umask01.c winsup/testsuite/winsup.api/ltp/umask02.c winsup/testsuite/winsup.api/ltp/umask03.c winsup/testsuite/winsup.api/ltp/uname01.c winsup/testsuite/winsup.api/ltp/unlink05.c winsup/testsuite/winsup.api/ltp/unlink06.c winsup/testsuite/winsup.api/ltp/unlink07.c winsup/testsuite/winsup.api/ltp/unlink08.c winsup/testsuite/winsup.api/ltp/vfork01.c winsup/testsuite/winsup.api/ltp/wait02.c winsup/testsuite/winsup.api/ltp/wait401.c winsup/testsuite/winsup.api/ltp/wait402.c winsup/testsuite/winsup.api/ltp/write01.c winsup/testsuite/winsup.api/ltp/write02.c winsup/testsuite/winsup.api/ltp/write03.c winsup/testsuite/winsup.api/mmaptest01.c winsup/testsuite/winsup.api/mmaptest02.c winsup/testsuite/winsup.api/mmaptest03.c winsup/testsuite/winsup.api/mmaptest04.c winsup/testsuite/winsup.api/msgtest.c winsup/testsuite/winsup.api/nullgetcwd.c winsup/testsuite/winsup.api/pthread/cancel1.c winsup/testsuite/winsup.api/pthread/cancel10.c winsup/testsuite/winsup.api/pthread/cancel11.c winsup/testsuite/winsup.api/pthread/cancel12.c winsup/testsuite/winsup.api/pthread/cancel2.c winsup/testsuite/winsup.api/pthread/cancel3.c winsup/testsuite/winsup.api/pthread/cancel4.c winsup/testsuite/winsup.api/pthread/cancel5.c winsup/testsuite/winsup.api/pthread/cancel6.c winsup/testsuite/winsup.api/pthread/cancel7.c winsup/testsuite/winsup.api/pthread/cancel8.c winsup/testsuite/winsup.api/pthread/cancel9.c winsup/testsuite/winsup.api/pthread/cleanup2.c winsup/testsuite/winsup.api/pthread/cleanup3.c winsup/testsuite/winsup.api/pthread/condvar1.c winsup/testsuite/winsup.api/pthread/condvar2.c winsup/testsuite/winsup.api/pthread/condvar2_1.c winsup/testsuite/winsup.api/pthread/condvar3.c winsup/testsuite/winsup.api/pthread/condvar3_1.c winsup/testsuite/winsup.api/pthread/condvar3_2.c winsup/testsuite/winsup.api/pthread/condvar3_3.c winsup/testsuite/winsup.api/pthread/condvar4.c winsup/testsuite/winsup.api/pthread/condvar5.c winsup/testsuite/winsup.api/pthread/condvar6.c winsup/testsuite/winsup.api/pthread/condvar7.c winsup/testsuite/winsup.api/pthread/condvar8.c winsup/testsuite/winsup.api/pthread/condvar9.c winsup/testsuite/winsup.api/pthread/count1.c winsup/testsuite/winsup.api/pthread/create1.c winsup/testsuite/winsup.api/pthread/create2.c winsup/testsuite/winsup.api/pthread/equal1.c winsup/testsuite/winsup.api/pthread/exit1.c winsup/testsuite/winsup.api/pthread/exit2.c winsup/testsuite/winsup.api/pthread/exit3.c winsup/testsuite/winsup.api/pthread/inherit1.c winsup/testsuite/winsup.api/pthread/join0.c winsup/testsuite/winsup.api/pthread/join1.c winsup/testsuite/winsup.api/pthread/join2.c winsup/testsuite/winsup.api/pthread/mainthreadexits.c winsup/testsuite/winsup.api/pthread/mutex1.c winsup/testsuite/winsup.api/pthread/mutex1d.c winsup/testsuite/winsup.api/pthread/mutex1e.c winsup/testsuite/winsup.api/pthread/mutex1n.c winsup/testsuite/winsup.api/pthread/mutex1r.c winsup/testsuite/winsup.api/pthread/mutex2.c winsup/testsuite/winsup.api/pthread/mutex3.c winsup/testsuite/winsup.api/pthread/mutex4.c winsup/testsuite/winsup.api/pthread/mutex5.c winsup/testsuite/winsup.api/pthread/mutex6d.c winsup/testsuite/winsup.api/pthread/mutex6e.c winsup/testsuite/winsup.api/pthread/mutex6n.c winsup/testsuite/winsup.api/pthread/mutex6r.c winsup/testsuite/winsup.api/pthread/mutex7.c winsup/testsuite/winsup.api/pthread/mutex7d.c winsup/testsuite/winsup.api/pthread/mutex7e.c winsup/testsuite/winsup.api/pthread/mutex7n.c winsup/testsuite/winsup.api/pthread/mutex7r.c winsup/testsuite/winsup.api/pthread/mutex8e.c winsup/testsuite/winsup.api/pthread/mutex8n.c winsup/testsuite/winsup.api/pthread/mutex8r.c winsup/testsuite/winsup.api/pthread/once1.c winsup/testsuite/winsup.api/pthread/priority1.c winsup/testsuite/winsup.api/pthread/priority2.c winsup/testsuite/winsup.api/pthread/rwlock1.c winsup/testsuite/winsup.api/pthread/rwlock2.c winsup/testsuite/winsup.api/pthread/rwlock3.c winsup/testsuite/winsup.api/pthread/rwlock4.c winsup/testsuite/winsup.api/pthread/rwlock5.c winsup/testsuite/winsup.api/pthread/rwlock6.c winsup/testsuite/winsup.api/pthread/rwlock7.c winsup/testsuite/winsup.api/pthread/self1.c winsup/testsuite/winsup.api/pthread/self2.c winsup/testsuite/winsup.api/pthread/test.h winsup/testsuite/winsup.api/pthread/threadidafterfork.c winsup/testsuite/winsup.api/pthread/tsd1.c winsup/testsuite/winsup.api/resethand.c winsup/testsuite/winsup.api/samples/sample-fail.c winsup/testsuite/winsup.api/samples/sample-miscompile.c winsup/testsuite/winsup.api/samples/sample-pass.c winsup/testsuite/winsup.api/semtest.c winsup/testsuite/winsup.api/shmtest.c winsup/testsuite/winsup.api/sigchld.c winsup/testsuite/winsup.api/signal-into-win32-api.c winsup/testsuite/winsup.api/systemcall.c winsup/testsuite/winsup.api/user_malloc.c winsup/testsuite/winsup.api/waitpid.c winsup/testsuite/winsup.api/winsup.exp winsup/utils/COPYING.dumper winsup/utils/ChangeLog winsup/utils/ChangeLog-2000 winsup/utils/ChangeLog.64bit winsup/utils/Makefile.in winsup/utils/aclocal.m4 winsup/utils/autogen.sh winsup/utils/bloda.cc winsup/utils/configure winsup/utils/configure.ac winsup/utils/cygcheck.cc winsup/utils/cygpath.cc winsup/utils/cygwin-console-helper.cc winsup/utils/dump_setup.cc winsup/utils/dumper.cc winsup/utils/dumper.h winsup/utils/getconf.c winsup/utils/getfacl.c winsup/utils/kill.cc winsup/utils/ldd.cc winsup/utils/ldh.cc winsup/utils/loadlib.h winsup/utils/locale.cc winsup/utils/minidumper.cc winsup/utils/mkgroup.c winsup/utils/mkpasswd.c winsup/utils/module_info.cc winsup/utils/mount.cc winsup/utils/parse_pe.cc winsup/utils/passwd.c winsup/utils/path.cc winsup/utils/path.h winsup/utils/pldd.c winsup/utils/ps.cc winsup/utils/regtool.cc winsup/utils/setfacl.c winsup/utils/setmetamode.c winsup/utils/ssp.c winsup/utils/ssp.txt winsup/utils/strace.cc winsup/utils/testsuite.cc winsup/utils/testsuite.h winsup/utils/tzset.c winsup/utils/umount.cc winsup/utils/utils.xml winsup/utils/wide_path.h
Diffstat (limited to 'winsup/utils/passwd.c')
-rw-r--r--winsup/utils/passwd.c661
1 files changed, 0 insertions, 661 deletions
diff --git a/winsup/utils/passwd.c b/winsup/utils/passwd.c
deleted file mode 100644
index ea3e2d159..000000000
--- a/winsup/utils/passwd.c
+++ /dev/null
@@ -1,661 +0,0 @@
-/* passwd.c: Changing passwords and managing account information
-
- Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2008, 2009, 2011, 2012,
- 2013 Red Hat, Inc.
-
- Written by Corinna Vinschen <corinna.vinschen@cityweb.de>
-
-This file is part of Cygwin.
-
-This software is a copyrighted work licensed under the terms of the
-Cygwin license. Please consult the file "CYGWIN_LICENSE" for
-details. */
-
-#include <windows.h>
-#include <wininet.h>
-#include <lmaccess.h>
-#include <lmerr.h>
-#include <lmcons.h>
-#include <lmapibuf.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <inttypes.h>
-#include <getopt.h>
-#include <pwd.h>
-#include <sys/cygwin.h>
-#include <cygwin/version.h>
-#include <sys/types.h>
-#include <time.h>
-#include <errno.h>
-#include <locale.h>
-#include <wchar.h>
-
-#define USER_PRIV_ADMIN 2
-
-static char *prog_name;
-
-static struct option longopts[] =
-{
- {"cannot-change", no_argument, NULL, 'c'},
- {"can-change", no_argument, NULL, 'C'},
- {"logonserver", required_argument, NULL, 'd'},
- {"never-expires", no_argument, NULL, 'e'},
- {"expires", no_argument, NULL, 'E'},
- {"help", no_argument, NULL, 'h' },
- {"inactive", required_argument, NULL, 'i'},
- {"lock", no_argument, NULL, 'l'},
- {"minage", required_argument, NULL, 'n'},
- {"pwd-not-required", no_argument, NULL, 'p'},
- {"pwd-required", no_argument, NULL, 'P'},
- {"unlock", no_argument, NULL, 'u'},
- {"version", no_argument, NULL, 'V'},
- {"maxage", required_argument, NULL, 'x'},
- {"length", required_argument, NULL, 'L'},
- {"status", no_argument, NULL, 'S'},
- { "reg-store-pwd", no_argument, NULL, 'R'},
- {NULL, 0, NULL, 0}
-};
-
-static char opts[] = "cCd:eEhi:ln:pPuvVx:L:SR";
-
-int
-eprint (int with_name, const char *fmt, ...)
-{
- va_list ap;
-
- if (with_name)
- fprintf(stderr, "%s: ", prog_name);
- va_start (ap, fmt);
- vfprintf (stderr, fmt, ap);
- va_end (ap);
- fprintf(stderr, "\n");
- return 1;
-}
-
-int
-EvalRet (int ret, const char *user)
-{
- switch (ret)
- {
- case NERR_Success:
- return 0;
-
- case ERROR_ACCESS_DENIED:
- if (! user)
- eprint (0, "You may not change password expiry information.");
- else
- eprint (0, "You may not change the password for %s.", user);
- break;
-
- eprint (0, "Bad password: Invalid.");
- break;
-
- case NERR_PasswordTooShort:
- eprint (0, "Bad password: Too short.");
- break;
-
- case NERR_UserNotFound:
- eprint (1, "unknown user %s", user);
- break;
-
- case ERROR_INVALID_PASSWORD:
- case NERR_BadPassword:
- eprint (0, "Incorrect password for %s.", user);
- eprint (0, "The password for %s is unchanged.", user);
- break;
-
- default:
- eprint (1, "unrecoverable error %d", ret);
- break;
- }
- return 1;
-}
-
-PUSER_INFO_3
-GetPW (char *user, int print_win_name, LPCWSTR server)
-{
- char usr_buf[UNLEN + 1];
- WCHAR name[UNLEN + 1];
- DWORD ret;
- PUSER_INFO_3 ui;
- struct passwd *pw;
- char *domain = (char *) alloca (INTERNET_MAX_HOST_NAME_LENGTH + 1);
-
- /* Try getting a Win32 username in case the user edited /etc/passwd */
- if ((pw = getpwnam (user)))
- {
- cygwin_internal (CW_EXTRACT_DOMAIN_AND_USER, pw, domain, usr_buf);
- if (strcasecmp (pw->pw_name, usr_buf))
- {
- /* Hack to avoid problem with LookupAccountSid after impersonation */
- if (strcasecmp (usr_buf, "SYSTEM"))
- {
- user = usr_buf;
- if (print_win_name)
- printf ("Windows username : %s\n", user);
- }
- }
- }
- mbstowcs (name, user, UNLEN + 1);
- ret = NetUserGetInfo (server, name, 3, (void *) &ui);
- return EvalRet (ret, user) ? NULL : ui;
-}
-
-int
-ChangePW (const char *user, const char *oldpwd, const char *pwd, int justcheck,
- LPCWSTR server)
-{
- WCHAR name[UNLEN + 1], oldpass[512], pass[512];
- DWORD ret;
-
- mbstowcs (name, user, UNLEN + 1);
- mbstowcs (pass, pwd, 512);
- if (! oldpwd)
- {
- USER_INFO_1003 ui;
-
- ui.usri1003_password = pass;
- ret = NetUserSetInfo (server, name, 1003, (LPBYTE) &ui, NULL);
- }
- else
- {
- mbstowcs (oldpass, oldpwd, 512);
- ret = NetUserChangePassword (server, name, oldpass, pass);
- }
- if (justcheck && ret != ERROR_INVALID_PASSWORD)
- return 0;
- if (! EvalRet (ret, user) && ! justcheck)
- {
- eprint (0, "Password changed.");
- }
- return ret;
-}
-
-void
-PrintPW (PUSER_INFO_3 ui, LPCWSTR server)
-{
- time_t t = time (NULL) - ui->usri3_password_age;
- int ret;
- PUSER_MODALS_INFO_0 mi;
-
- printf ("Account disabled : %s",
- (ui->usri3_flags & UF_ACCOUNTDISABLE) ? "yes\n" : "no\n");
- printf ("Password not required : %s",
- (ui->usri3_flags & UF_PASSWD_NOTREQD) ? "yes\n" : "no\n");
- printf ("User can't change password : %s",
- (ui->usri3_flags & UF_PASSWD_CANT_CHANGE) ? "yes\n" : "no\n");
- printf ("Password never expires : %s",
- (ui->usri3_flags & UF_DONT_EXPIRE_PASSWD) ? "yes\n" : "no\n");
- printf ("Password expired : %s",
- (ui->usri3_password_expired) ? "yes\n" : "no\n");
- printf ("Latest password change : %s", ctime(&t));
- ret = NetUserModalsGet (server, 0, (void *) &mi);
- if (! ret)
- {
- if (mi->usrmod0_max_passwd_age == TIMEQ_FOREVER)
- mi->usrmod0_max_passwd_age = 0;
- if (mi->usrmod0_min_passwd_age == TIMEQ_FOREVER)
- mi->usrmod0_min_passwd_age = 0;
- if (mi->usrmod0_force_logoff == TIMEQ_FOREVER)
- mi->usrmod0_force_logoff = 0;
- if (ui->usri3_priv == USER_PRIV_ADMIN)
- mi->usrmod0_min_passwd_len = 0;
- printf ("\nSystem password settings:\n");
- printf ("Max. password age %" PRIu32 " days\n",
- (unsigned int) (mi->usrmod0_max_passwd_age / ONE_DAY));
- printf ("Min. password age %" PRIu32 " days\n",
- (unsigned int) (mi->usrmod0_min_passwd_age / ONE_DAY));
- printf ("Force logout after %" PRIu32 " days\n",
- (unsigned int) (mi->usrmod0_force_logoff / ONE_DAY));
- printf ("Min. password length: %" PRIu32 "\n",
- (unsigned int) mi->usrmod0_min_passwd_len);
- }
-}
-
-int
-SetModals (int xarg, int narg, int iarg, int Larg, LPCWSTR server)
-{
- int ret;
- PUSER_MODALS_INFO_0 mi;
-
- ret = NetUserModalsGet (server, 0, (void *) &mi);
- if (! ret)
- {
- if (xarg == 0)
- mi->usrmod0_max_passwd_age = TIMEQ_FOREVER;
- else if (xarg > 0)
- mi->usrmod0_max_passwd_age = xarg * ONE_DAY;
-
- if (narg == 0)
- {
- mi->usrmod0_min_passwd_age = TIMEQ_FOREVER;
- mi->usrmod0_password_hist_len = 0;
- }
- else if (narg > 0)
- mi->usrmod0_min_passwd_age = narg * ONE_DAY;
-
- if (iarg == 0)
- mi->usrmod0_force_logoff = TIMEQ_FOREVER;
- else if (iarg > 0)
- mi->usrmod0_force_logoff = iarg * ONE_DAY;
-
- if (Larg >= 0)
- mi->usrmod0_min_passwd_len = Larg;
-
- ret = NetUserModalsSet (server, 0, (LPBYTE) mi, NULL);
- NetApiBufferFree (mi);
- }
- return EvalRet (ret, NULL);
-}
-
-static void usage (FILE * stream, int status) __attribute__ ((noreturn));
-static void
-usage (FILE * stream, int status)
-{
- fprintf (stream, ""
- "Usage: %s [OPTION] [USER]\n"
- "\n"
- "Change USER's password or password attributes.\n"
- "\n"
- "User operations:\n"
- " -l, --lock lock USER's account.\n"
- " -u, --unlock unlock USER's account.\n"
- " -c, --cannot-change USER can't change password.\n"
- " -C, --can-change USER can change password.\n"
- " -e, --never-expires USER's password never expires.\n"
- " -E, --expires USER's password expires according to system's\n"
- " password aging rule.\n"
- " -p, --pwd-not-required no password required for USER.\n"
- " -P, --pwd-required password is required for USER.\n"
- " -R, --reg-store-pwd enter password to store it in the registry for\n"
- " later usage by services to be able to switch\n"
- " to this user context with network credentials.\n"
- "\n"
- "System operations:\n"
- " -i, --inactive NUM set NUM of days before inactive accounts are disabled\n"
- " (inactive accounts are those with expired passwords).\n"
- " -n, --minage DAYS set system minimum password age to DAYS days.\n"
- " -x, --maxage DAYS set system maximum password age to DAYS days.\n"
- " -L, --length LEN set system minimum password length to LEN.\n"
- "\n"
- "Other options:\n"
- " -d, --logonserver SERVER connect to SERVER (e.g. domain controller).\n"
- " Default server is the local system, unless\n"
- " changing the current user, in which case the\n"
- " default is the content of $LOGONSERVER.\n"
- " -S, --status display password status for USER (locked, expired,\n"
- " etc.) plus global system password settings.\n"
- " -h, --help output usage information and exit.\n"
- " -V, --version output version information and exit.\n"
- "\n"
- "If no option is given, change USER's password. If no user name is given,\n"
- "operate on current user. System operations must not be mixed with user\n"
- "operations. Don't specify a USER when triggering a system operation.\n"
- "\n"
- "Don't specify a user or any other option together with the -R option.\n"
- "Non-Admin users can only store their password if cygserver is running\n"
- "as service under the SYSTEM account.\n"
- "Note that storing even obfuscated passwords in the registry is not overly\n"
- "secure. Use this feature only if the machine is adequately locked down.\n"
- "Don't use this feature if you don't need network access within a remote\n"
- "session. You can delete your stored password by using `passwd -R' and\n"
- "specifying an empty password.\n\n", prog_name);
- exit (status);
-}
-
-static int
-caller_is_admin ()
-{
- static int is_admin = -1;
- HANDLE token;
- DWORD size;
- PTOKEN_GROUPS grps;
- SID_IDENTIFIER_AUTHORITY nt_auth = {SECURITY_NT_AUTHORITY};
- PSID admin_grp;
- DWORD i;
-
- if (is_admin == -1)
- {
- is_admin = 0;
- if (OpenProcessToken (GetCurrentProcess (), TOKEN_READ, &token))
- {
- GetTokenInformation (token, TokenGroups, NULL, 0, &size);
- grps = (PTOKEN_GROUPS) alloca (size);
- if (!GetTokenInformation(token, TokenGroups, grps, size, &size)
- || !AllocateAndInitializeSid (&nt_auth, 2,
- SECURITY_BUILTIN_DOMAIN_RID,
- DOMAIN_ALIAS_RID_ADMINS,
- 0, 0, 0, 0, 0, 0, &admin_grp))
- is_admin = 0;
- else
- {
- for (i = 0; i < grps->GroupCount; ++i)
- if (EqualSid (admin_grp, grps->Groups[i].Sid)
- && (grps->Groups[i].Attributes
- & (SE_GROUP_ENABLED | SE_GROUP_USE_FOR_DENY_ONLY))
- == SE_GROUP_ENABLED)
- {
- is_admin = 1;
- break;
- }
- FreeSid (admin_grp);
- }
- CloseHandle (token);
- }
- }
- return is_admin;
-}
-
-static void
-print_version ()
-{
- printf ("passwd (cygwin) %d.%d.%d\n"
- "Password Utility\n"
- "Copyright (C) 1999 - %s Red Hat, Inc.\n"
- "This is free software; see the source for copying conditions. There is NO\n"
- "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
- CYGWIN_VERSION_DLL_MAJOR / 1000,
- CYGWIN_VERSION_DLL_MAJOR % 1000,
- CYGWIN_VERSION_DLL_MINOR,
- strrchr (__DATE__, ' ') + 1);
-}
-
-int
-main (int argc, char **argv)
-{
- char *logonserver;
- char user[UNLEN + 1], oldpwd[_PASSWORD_LEN + 1], newpwd[_PASSWORD_LEN + 1];
- int ret = 0;
- int cnt = 0;
- int opt;
- int Larg = -1;
- int xarg = -1;
- int narg = -1;
- int iarg = -1;
- int lopt = 0;
- int uopt = 0;
- int copt = 0;
- int Copt = 0;
- int eopt = 0;
- int Eopt = 0;
- int popt = 0;
- int Popt = 0;
- int Sopt = 0;
- int Ropt = 0;
- PUSER_INFO_3 ui;
- int myself = 0;
- LPWSTR server = NULL;
-
- prog_name = program_invocation_short_name;
-
- /* Use locale from environment. If not set or set to "C", use UTF-8. */
- setlocale (LC_CTYPE, "");
- if (!strcmp (setlocale (LC_CTYPE, NULL), "C"))
- setlocale (LC_CTYPE, "en_US.UTF-8");
- while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF)
- switch (opt)
- {
- case 'h':
- usage (stdout, 0);
- break;
-
- case 'i':
- if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt || Ropt)
- usage (stderr, 1);
- if ((iarg = atoi (optarg)) < 0 || iarg > 999)
- return eprint (1, "Force logout time must be between 0 and 999.");
- break;
-
- case 'l':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || uopt || Sopt || Ropt)
- usage (stderr, 1);
- lopt = 1;
- break;
-
- case 'n':
- if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt || Ropt)
- usage (stderr, 1);
- if ((narg = atoi (optarg)) < 0 || narg > 999)
- return eprint (1, "Minimum password age must be between 0 and 999.");
- if (xarg >= 0 && narg > xarg)
- return eprint (1, "Minimum password age must be less than "
- "maximum password age.");
- break;
-
- case 'u':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || lopt || Sopt || Ropt)
- usage (stderr, 1);
- uopt = 1;
- break;
-
- case 'c':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt || Ropt)
- usage (stderr, 1);
- copt = 1;
- break;
-
- case 'C':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt || Ropt)
- usage (stderr, 1);
- Copt = 1;
- break;
-
- case 'd':
- {
- if (Ropt)
- usage (stderr, 1);
- char *tmpbuf = alloca (strlen (optarg) + 3);
- tmpbuf[0] = '\0';
- if (*optarg != '\\')
- strcpy (tmpbuf, "\\\\");
- strcat (tmpbuf, optarg);
- size_t len = mbstowcs (NULL, tmpbuf, 0);
- if (len > 0 && len != (size_t) -1)
- mbstowcs (server = alloca ((len + 1) * sizeof (wchar_t)),
- tmpbuf, len + 1);
- }
- break;
-
- case 'e':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt || Ropt)
- usage (stderr, 1);
- eopt = 1;
- break;
-
- case 'E':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt || Ropt)
- usage (stderr, 1);
- Eopt = 1;
- break;
-
- case 'p':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt || Ropt)
- usage (stderr, 1);
- popt = 1;
- break;
-
- case 'P':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || Sopt || Ropt)
- usage (stderr, 1);
- Popt = 1;
- break;
-
- case 'V':
- case 'v': /* Keep this option for historrical reasons,
- but don't advertize it. */
- print_version ();
- exit (0);
- break;
-
- case 'x':
- if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt || Ropt)
- usage (stderr, 1);
- if ((xarg = atoi (optarg)) < 0 || xarg > 999)
- return eprint (1, "Maximum password age must be between 0 and 999.");
- if (narg >= 0 && xarg < narg)
- return eprint (1, "Maximum password age must be greater than "
- "minimum password age.");
- break;
-
- case 'L':
- if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt || Ropt)
- usage (stderr, 1);
- if ((Larg = atoi (optarg)) < 0 || Larg > LM20_PWLEN)
- return eprint (1, "Minimum password length must be between "
- "0 and %d.", LM20_PWLEN);
- break;
-
- case 'S':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || lopt || uopt
- || copt || Copt || eopt || Eopt || popt || Popt || Ropt)
- usage (stderr, 1);
- Sopt = 1;
- break;
-
- case 'R':
- if (xarg >= 0 || narg >= 0 || iarg >= 0 || Larg >= 0 || lopt || uopt
- || copt || Copt || eopt || Eopt || popt || Popt || Sopt
- || server)
- usage (stderr, 1);
- Ropt = 1;
- break;
-
- default:
- fprintf (stderr, "Try `%s --help' for more information.\n", prog_name);
- return 1;
- }
-
- if (Ropt)
- {
- const char *username = NULL;
- if (optind < argc)
- {
- username = argv[optind++];
- if (!strcmp (username, getlogin ()))
- username = NULL;
- else if (!caller_is_admin ())
- return eprint (0, "You may not change the password for %s.", user);
-
- if (optind < argc)
- usage (stderr, 1);
- }
- char *text1 = (char *) alloca ((username ? strlen (username) + 2 : 4)
- + sizeof ("Enter current password: "));
- char *text2 = (char *) alloca ((username ? strlen (username) + 2 : 4)
- + sizeof ("Re-enter current password: "));
- sprintf (text1, "Enter %s%s current password: ",
- username ?: "your", username ? "'s" : "");
- sprintf (text2, "Re-enter %s%s current password: ",
- username ?: "your", username ? "'s" : "");
- printf (
-"This functionality stores a password in the registry for usage by services\n"
-"which need to change the user context and require network access. Typical\n"
-"applications are interactive remote logons using sshd, cron task, etc.\n"
-"This password will always tried first when any privileged application is\n"
-"about to switch the user context.\n\n"
-"Note that storing even obfuscated passwords in the registry is not overly\n"
-"secure. Use this feature only if the machine is adequately locked down.\n"
-"Don't use this feature if you don't need network access within a remote\n"
-"session.\n\n"
-"You can delete the stored password by specifying an empty password.\n\n");
- strcpy (newpwd, getpass (text1));
- if (strcmp (newpwd, getpass (text2)))
- eprint (0, "Password is not identical.");
- else if (cygwin_internal (CW_SET_PRIV_KEY, newpwd, username))
- return eprint (0, "Storing password failed: %s", strerror (errno));
- return 0;
- }
-
- if (Larg >= 0 || xarg >= 0 || narg >= 0 || iarg >= 0)
- {
- if (optind < argc)
- usage (stderr, 1);
- return SetModals (xarg, narg, iarg, Larg, server);
- }
-
- strcpy (user, optind >= argc ? getlogin () : argv[optind]);
-
- /* Changing password for calling user? Use logonserver for user as well. */
- if (!server && optind >= argc)
- {
- myself = 1;
- if ((logonserver = getenv ("LOGONSERVER")))
- {
- size_t len = mbstowcs (NULL, logonserver, 0);
- if (len > 0 && len != (size_t) -1)
- mbstowcs (server = alloca ((len + 1) * sizeof (wchar_t)),
- logonserver, len + 1);
- }
- }
-
- ui = GetPW (user, 1, server);
- if (! ui)
- return 1;
-
- if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt || Sopt)
- {
- USER_INFO_1008 uif;
-
- uif.usri1008_flags = ui->usri3_flags;
- if (lopt)
- {
- if (ui->usri3_priv == USER_PRIV_ADMIN)
- return eprint (0, "Locking an admin account is disallowed.");
- uif.usri1008_flags |= UF_ACCOUNTDISABLE;
- }
- if (uopt)
- uif.usri1008_flags &= ~UF_ACCOUNTDISABLE;
- if (copt)
- uif.usri1008_flags |= UF_PASSWD_CANT_CHANGE;
- if (Copt)
- uif.usri1008_flags &= ~UF_PASSWD_CANT_CHANGE;
- if (eopt)
- uif.usri1008_flags |= UF_DONT_EXPIRE_PASSWD;
- if (Eopt)
- uif.usri1008_flags &= ~UF_DONT_EXPIRE_PASSWD;
- if (popt)
- uif.usri1008_flags |= UF_PASSWD_NOTREQD;
- if (Popt)
- uif.usri1008_flags &= ~UF_PASSWD_NOTREQD;
-
- if (lopt || uopt || copt || Copt || eopt || Eopt || popt || Popt)
- {
- ret = NetUserSetInfo (server, ui->usri3_name, 1008, (LPBYTE) &uif,
- NULL);
- return EvalRet (ret, NULL);
- }
- // Sopt
- PrintPW (ui, server);
- return 0;
- }
-
- if (!caller_is_admin () && !myself)
- return eprint (0, "You may not change the password for %s.", user);
-
- eprint (0, "Enter the new password (minimum of 5, maximum of 8 characters).");
- eprint (0, "Please use a combination of upper and lower case letters and numbers.");
-
- oldpwd[0] = '\0';
- if (!caller_is_admin ())
- {
- strcpy (oldpwd, getpass ("Old password: "));
- if (ChangePW (user, oldpwd, oldpwd, 1, server))
- return 1;
- }
-
- do
- {
- strcpy (newpwd, getpass ("New password: "));
- if (strcmp (newpwd, getpass ("Re-enter new password: ")))
- eprint (0, "Password is not identical.");
- else if (! ChangePW (user, *oldpwd ? oldpwd : NULL, newpwd, 0, server))
- ret = 1;
- if (! ret && cnt < 2)
- eprint (0, "Try again.");
- }
- while (! ret && ++cnt < 3);
- return ! ret;
-}